Files
maps-saas/apps/api/src/telemetry/dto/driver-telemetry.dto.ts
T

67 lines
2.3 KiB
TypeScript

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[];
}