xpeditis2.0/apps/backend/src/application/dto/port.dto.ts
2025-12-03 21:39:50 +01:00

147 lines
2.7 KiB
TypeScript

import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { IsString, IsNumber, IsOptional, IsBoolean, Min, Max } from 'class-validator';
/**
* Port search request DTO
*/
export class PortSearchRequestDto {
@ApiProperty({
example: 'Rotterdam',
description: 'Search query - can be port name, city, or UN/LOCODE code',
})
@IsString()
query: string;
@ApiPropertyOptional({
example: 10,
description: 'Maximum number of results to return (default: 10)',
minimum: 1,
maximum: 50,
})
@IsNumber()
@IsOptional()
@Min(1)
@Max(50)
limit?: number;
@ApiPropertyOptional({
example: 'NL',
description: 'Filter by ISO 3166-1 alpha-2 country code (e.g., NL, FR, US)',
})
@IsString()
@IsOptional()
countryFilter?: string;
}
/**
* Port coordinates DTO
*/
export class PortCoordinatesDto {
@ApiProperty({
example: 51.9244,
description: 'Latitude',
})
@IsNumber()
latitude: number;
@ApiProperty({
example: 4.4777,
description: 'Longitude',
})
@IsNumber()
longitude: number;
}
/**
* Port response DTO
*/
export class PortResponseDto {
@ApiProperty({
example: 'f47ac10b-58cc-4372-a567-0e02b2c3d479',
description: 'Port unique identifier',
})
@IsString()
id: string;
@ApiProperty({
example: 'NLRTM',
description: 'UN/LOCODE port code',
})
@IsString()
code: string;
@ApiProperty({
example: 'Port of Rotterdam',
description: 'Port name',
})
@IsString()
name: string;
@ApiProperty({
example: 'Rotterdam',
description: 'City name',
})
@IsString()
city: string;
@ApiProperty({
example: 'NL',
description: 'ISO 3166-1 alpha-2 country code',
})
@IsString()
country: string;
@ApiProperty({
example: 'Netherlands',
description: 'Full country name',
})
@IsString()
countryName: string;
@ApiProperty({
description: 'Port coordinates (latitude/longitude)',
type: PortCoordinatesDto,
})
coordinates: PortCoordinatesDto;
@ApiPropertyOptional({
example: 'Europe/Amsterdam',
description: 'IANA timezone identifier',
})
@IsString()
@IsOptional()
timezone?: string;
@ApiProperty({
example: true,
description: 'Whether the port is active',
})
@IsBoolean()
isActive: boolean;
@ApiProperty({
example: 'Port of Rotterdam, Netherlands (NLRTM)',
description: 'Full display name with code',
})
@IsString()
displayName: string;
}
/**
* Port search response DTO
*/
export class PortSearchResponseDto {
@ApiProperty({
description: 'List of matching ports',
type: [PortResponseDto],
})
ports: PortResponseDto[];
@ApiProperty({
example: 10,
description: 'Number of ports returned',
})
@IsNumber()
totalMatches: number;
}