149 lines
3.8 KiB
TypeScript
149 lines
3.8 KiB
TypeScript
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
|
|
|
|
export class PortDto {
|
|
@ApiProperty({ example: 'NLRTM' })
|
|
code: string;
|
|
|
|
@ApiProperty({ example: 'Rotterdam' })
|
|
name: string;
|
|
|
|
@ApiProperty({ example: 'Netherlands' })
|
|
country: string;
|
|
}
|
|
|
|
export class SurchargeDto {
|
|
@ApiProperty({ example: 'BAF', description: 'Surcharge type code' })
|
|
type: string;
|
|
|
|
@ApiProperty({ example: 'Bunker Adjustment Factor' })
|
|
description: string;
|
|
|
|
@ApiProperty({ example: 150.0 })
|
|
amount: number;
|
|
|
|
@ApiProperty({ example: 'USD' })
|
|
currency: string;
|
|
}
|
|
|
|
export class PricingDto {
|
|
@ApiProperty({ example: 1500.0, description: 'Base ocean freight' })
|
|
baseFreight: number;
|
|
|
|
@ApiProperty({ type: [SurchargeDto] })
|
|
surcharges: SurchargeDto[];
|
|
|
|
@ApiProperty({ example: 1700.0, description: 'Total amount including all surcharges' })
|
|
totalAmount: number;
|
|
|
|
@ApiProperty({ example: 'USD' })
|
|
currency: string;
|
|
}
|
|
|
|
export class RouteSegmentDto {
|
|
@ApiProperty({ example: 'NLRTM' })
|
|
portCode: string;
|
|
|
|
@ApiProperty({ example: 'Port of Rotterdam' })
|
|
portName: string;
|
|
|
|
@ApiPropertyOptional({ example: '2025-02-15T10:00:00Z' })
|
|
arrival?: string;
|
|
|
|
@ApiPropertyOptional({ example: '2025-02-15T14:00:00Z' })
|
|
departure?: string;
|
|
|
|
@ApiPropertyOptional({ example: 'MAERSK ESSEX' })
|
|
vesselName?: string;
|
|
|
|
@ApiPropertyOptional({ example: '025W' })
|
|
voyageNumber?: string;
|
|
}
|
|
|
|
export class RateQuoteDto {
|
|
@ApiProperty({ example: '550e8400-e29b-41d4-a716-446655440000' })
|
|
id: string;
|
|
|
|
@ApiProperty({ example: '550e8400-e29b-41d4-a716-446655440001' })
|
|
carrierId: string;
|
|
|
|
@ApiProperty({ example: 'Maersk Line' })
|
|
carrierName: string;
|
|
|
|
@ApiProperty({ example: 'MAERSK' })
|
|
carrierCode: string;
|
|
|
|
@ApiProperty({ type: PortDto })
|
|
origin: PortDto;
|
|
|
|
@ApiProperty({ type: PortDto })
|
|
destination: PortDto;
|
|
|
|
@ApiProperty({ type: PricingDto })
|
|
pricing: PricingDto;
|
|
|
|
@ApiProperty({ example: '40HC' })
|
|
containerType: string;
|
|
|
|
@ApiProperty({ example: 'FCL', enum: ['FCL', 'LCL'] })
|
|
mode: 'FCL' | 'LCL';
|
|
|
|
@ApiProperty({ example: '2025-02-15T10:00:00Z', description: 'Estimated Time of Departure' })
|
|
etd: string;
|
|
|
|
@ApiProperty({ example: '2025-03-17T14:00:00Z', description: 'Estimated Time of Arrival' })
|
|
eta: string;
|
|
|
|
@ApiProperty({ example: 30, description: 'Transit time in days' })
|
|
transitDays: number;
|
|
|
|
@ApiProperty({ type: [RouteSegmentDto], description: 'Route segments with port details' })
|
|
route: RouteSegmentDto[];
|
|
|
|
@ApiProperty({ example: 85, description: 'Available container slots' })
|
|
availability: number;
|
|
|
|
@ApiProperty({ example: 'Weekly' })
|
|
frequency: string;
|
|
|
|
@ApiPropertyOptional({ example: 'Container Ship' })
|
|
vesselType?: string;
|
|
|
|
@ApiPropertyOptional({ example: 12500.5, description: 'CO2 emissions in kg' })
|
|
co2EmissionsKg?: number;
|
|
|
|
@ApiProperty({ example: '2025-02-15T10:15:00Z', description: 'Quote expiration timestamp' })
|
|
validUntil: string;
|
|
|
|
@ApiProperty({ example: '2025-02-15T10:00:00Z' })
|
|
createdAt: string;
|
|
}
|
|
|
|
export class RateSearchResponseDto {
|
|
@ApiProperty({ type: [RateQuoteDto] })
|
|
quotes: RateQuoteDto[];
|
|
|
|
@ApiProperty({ example: 5, description: 'Total number of quotes returned' })
|
|
count: number;
|
|
|
|
@ApiProperty({ example: 'NLRTM' })
|
|
origin: string;
|
|
|
|
@ApiProperty({ example: 'CNSHA' })
|
|
destination: string;
|
|
|
|
@ApiProperty({ example: '2025-02-15' })
|
|
departureDate: string;
|
|
|
|
@ApiProperty({ example: '40HC' })
|
|
containerType: string;
|
|
|
|
@ApiProperty({ example: 'FCL' })
|
|
mode: string;
|
|
|
|
@ApiProperty({ example: true, description: 'Whether results were served from cache' })
|
|
fromCache: boolean;
|
|
|
|
@ApiProperty({ example: 234, description: 'Query response time in milliseconds' })
|
|
responseTimeMs: number;
|
|
}
|