mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-28 20:40:55 +00:00
45 lines
1.5 KiB
TypeScript
45 lines
1.5 KiB
TypeScript
import { BadRequestException } from '@nestjs/common';
|
|
|
|
import { FREIGHT_TYPES, FreightType } from './entities/booking.entity';
|
|
import { BookingFreightShapeInput } from './dto/validators/booking-freight.validator';
|
|
|
|
/** Normalize and validate booking freight shape (used on create and after update merge). */
|
|
export function assertFreightShape(input: BookingFreightShapeInput): void {
|
|
if (!input.freightType || !FREIGHT_TYPES.includes(input.freightType as FreightType)) {
|
|
throw new BadRequestException(
|
|
`freightType is required and must be one of: ${FREIGHT_TYPES.join(', ')}`,
|
|
);
|
|
}
|
|
//
|
|
|
|
const containers = input.containers ?? [];
|
|
const hasContainers = containers.length > 0;
|
|
const hasCargoType = Boolean(input.cargoTypeId);
|
|
|
|
if (input.freightType === 'BULK') {
|
|
if (hasContainers) {
|
|
throw new BadRequestException(
|
|
'BULK freight cannot include container lines; use cargoTypeId only',
|
|
);
|
|
}
|
|
if (!hasCargoType) {
|
|
throw new BadRequestException('cargoTypeId is required for BULK freight');
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (hasCargoType) {
|
|
throw new BadRequestException('cargoTypeId is not allowed for CONTAINER freight');
|
|
}
|
|
if (!hasContainers) {
|
|
throw new BadRequestException(
|
|
'CONTAINER freight requires at least one container line with containerTypeId',
|
|
);
|
|
}
|
|
for (const line of containers) {
|
|
if (!line.containerTypeId) {
|
|
throw new BadRequestException('Each container line must include containerTypeId');
|
|
}
|
|
}
|
|
}
|