import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsNotEmpty, IsNumber, IsOptional, IsString, Max, Min, IsArray, ValidateNested } from 'class-validator'; import { Type, Transform } from 'class-transformer'; export class DriverTelemetryDto { @ApiProperty({ description: 'Driver unique ID', example: 'driver_jo_1042' }) @IsString() @IsNotEmpty() @Transform(({ obj, value }) => value ?? obj.driver_id ?? obj.driverId) driver_id: string; @ApiProperty({ description: 'Latitude coordinate (-90 to 90)', example: 31.9539 }) @IsNumber() @Min(-90) @Max(90) @Transform(({ obj, value }) => Number(value ?? obj.latitude ?? obj.lat)) latitude: number; @ApiProperty({ description: 'Longitude coordinate (-180 to 180)', example: 35.9106 }) @IsNumber() @Min(-180) @Max(180) @Transform(({ obj, value }) => Number(value ?? obj.longitude ?? obj.lng)) longitude: number; @ApiProperty({ description: 'Instantaneous vehicle speed in km/h', example: 45.5 }) @IsNumber() @Min(0) @Transform(({ obj, value }) => Number(value ?? obj.speed ?? 0)) speed: number; @ApiProperty({ description: 'Compass heading / bearing in degrees (0 - 360)', example: 185.0 }) @IsNumber() @Min(0) @Max(360) @Transform(({ obj, value }) => Number(value ?? obj.heading ?? 0)) heading: number; @ApiPropertyOptional({ description: 'Distance traveled in meters', example: 1250.4, default: 0 }) @IsOptional() @IsNumber() @Transform(({ obj, value }) => (value != null ? Number(value) : (obj.distance != null ? Number(obj.distance) : 0))) distance?: number; @ApiPropertyOptional({ description: 'Elevation above mean sea level in meters (AMSL)', example: 890.5, default: 0 }) @IsOptional() @IsNumber() @Transform(({ obj, value }) => { const val = value ?? obj.elevation ?? obj.altitude; return val != null ? Number(val) : 0; }) elevation?: number; @ApiPropertyOptional({ description: 'Client GPS capture time as ISO-8601', example: '2026-09-16T10:20:30.000Z' }) @IsOptional() @IsString() timestamp?: string; } export class DriverTelemetryBatchDto { @ApiProperty({ type: [DriverTelemetryDto], description: 'Array of telemetry points for batch processing' }) @IsArray() @ValidateNested({ each: true }) @Type(() => DriverTelemetryDto) points: DriverTelemetryDto[]; }