67 lines
2.3 KiB
TypeScript
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[];
|
|
}
|