xpeditis2.0/apps/backend/src/application/mappers/booking.mapper.ts
David 4b00ee2601
Some checks failed
CI/CD Pipeline - Xpeditis PreProd / Frontend - Docker Build & Push (push) Blocked by required conditions
CI/CD Pipeline - Xpeditis PreProd / Deploy to PreProd Server (push) Blocked by required conditions
CI/CD Pipeline - Xpeditis PreProd / Run Smoke Tests (push) Blocked by required conditions
CI/CD Pipeline - Xpeditis PreProd / Backend - Build & Test (push) Failing after 5m53s
CI/CD Pipeline - Xpeditis PreProd / Backend - Docker Build & Push (push) Has been skipped
CI/CD Pipeline - Xpeditis PreProd / Frontend - Build & Test (push) Has been cancelled
fix: replace relative domain imports with TypeScript path aliases
- Replace all ../../domain/ imports with @domain/ across 67 files
- Configure NestJS to use tsconfig.build.json with rootDir
- Add tsc-alias to resolve path aliases after build
- This fixes 'Cannot find module' TypeScript compilation errors

Fixed files:
- 30 files in application layer
- 37 files in infrastructure layer
2025-11-16 19:20:58 +01:00

169 lines
5.4 KiB
TypeScript

import { Booking } from '@domain/entities/booking.entity';
import { RateQuote } from '@domain/entities/rate-quote.entity';
import {
BookingResponseDto,
BookingAddressDto,
BookingPartyDto,
BookingContainerDto,
BookingRateQuoteDto,
BookingListItemDto,
} from '../dto/booking-response.dto';
import {
CreateBookingRequestDto,
PartyDto,
AddressDto,
ContainerDto,
} from '../dto/create-booking-request.dto';
export class BookingMapper {
/**
* Map CreateBookingRequestDto to domain inputs
*/
static toCreateBookingInput(dto: CreateBookingRequestDto) {
return {
rateQuoteId: dto.rateQuoteId,
shipper: {
name: dto.shipper.name,
address: {
street: dto.shipper.address.street,
city: dto.shipper.address.city,
postalCode: dto.shipper.address.postalCode,
country: dto.shipper.address.country,
},
contactName: dto.shipper.contactName,
contactEmail: dto.shipper.contactEmail,
contactPhone: dto.shipper.contactPhone,
},
consignee: {
name: dto.consignee.name,
address: {
street: dto.consignee.address.street,
city: dto.consignee.address.city,
postalCode: dto.consignee.address.postalCode,
country: dto.consignee.address.country,
},
contactName: dto.consignee.contactName,
contactEmail: dto.consignee.contactEmail,
contactPhone: dto.consignee.contactPhone,
},
cargoDescription: dto.cargoDescription,
containers: dto.containers.map(c => ({
type: c.type,
containerNumber: c.containerNumber,
vgm: c.vgm,
temperature: c.temperature,
sealNumber: c.sealNumber,
})),
specialInstructions: dto.specialInstructions,
};
}
/**
* Map Booking entity and RateQuote to BookingResponseDto
*/
static toDto(booking: Booking, rateQuote: RateQuote): BookingResponseDto {
return {
id: booking.id,
bookingNumber: booking.bookingNumber.value,
status: booking.status.value,
shipper: {
name: booking.shipper.name,
address: {
street: booking.shipper.address.street,
city: booking.shipper.address.city,
postalCode: booking.shipper.address.postalCode,
country: booking.shipper.address.country,
},
contactName: booking.shipper.contactName,
contactEmail: booking.shipper.contactEmail,
contactPhone: booking.shipper.contactPhone,
},
consignee: {
name: booking.consignee.name,
address: {
street: booking.consignee.address.street,
city: booking.consignee.address.city,
postalCode: booking.consignee.address.postalCode,
country: booking.consignee.address.country,
},
contactName: booking.consignee.contactName,
contactEmail: booking.consignee.contactEmail,
contactPhone: booking.consignee.contactPhone,
},
cargoDescription: booking.cargoDescription,
containers: booking.containers.map(c => ({
id: c.id,
type: c.type,
containerNumber: c.containerNumber,
vgm: c.vgm,
temperature: c.temperature,
sealNumber: c.sealNumber,
})),
specialInstructions: booking.specialInstructions,
rateQuote: {
id: rateQuote.id,
carrierName: rateQuote.carrierName,
carrierCode: rateQuote.carrierCode,
origin: {
code: rateQuote.origin.code,
name: rateQuote.origin.name,
country: rateQuote.origin.country,
},
destination: {
code: rateQuote.destination.code,
name: rateQuote.destination.name,
country: rateQuote.destination.country,
},
pricing: {
baseFreight: rateQuote.pricing.baseFreight,
surcharges: rateQuote.pricing.surcharges.map(s => ({
type: s.type,
description: s.description,
amount: s.amount,
currency: s.currency,
})),
totalAmount: rateQuote.pricing.totalAmount,
currency: rateQuote.pricing.currency,
},
containerType: rateQuote.containerType,
mode: rateQuote.mode,
etd: rateQuote.etd.toISOString(),
eta: rateQuote.eta.toISOString(),
transitDays: rateQuote.transitDays,
},
createdAt: booking.createdAt.toISOString(),
updatedAt: booking.updatedAt.toISOString(),
};
}
/**
* Map Booking entity to list item DTO (simplified view)
*/
static toListItemDto(booking: Booking, rateQuote: RateQuote): BookingListItemDto {
return {
id: booking.id,
bookingNumber: booking.bookingNumber.value,
status: booking.status.value,
shipperName: booking.shipper.name,
consigneeName: booking.consignee.name,
originPort: rateQuote.origin.code,
destinationPort: rateQuote.destination.code,
carrierName: rateQuote.carrierName,
etd: rateQuote.etd.toISOString(),
eta: rateQuote.eta.toISOString(),
totalAmount: rateQuote.pricing.totalAmount,
currency: rateQuote.pricing.currency,
createdAt: booking.createdAt.toISOString(),
};
}
/**
* Map array of bookings to list item DTOs
*/
static toListItemDtoArray(
bookings: Array<{ booking: Booking; rateQuote: RateQuote }>
): BookingListItemDto[] {
return bookings.map(({ booking, rateQuote }) => this.toListItemDto(booking, rateQuote));
}
}