import { Transform, Type } from 'class-transformer'; import { IsBoolean, IsEnum, IsIn, IsInt, IsOptional, IsString, Max, Min } from 'class-validator'; import { TrainCrewNationality, TrainCrewRole, TrainCrewStatus, } from '../entities/train-crew-member.entity'; /** Sortable columns. Whitelisted: the value is interpolated into ORDER BY. */ export const TRAIN_CREW_SORT_FIELDS = [ 'firstName', 'lastName', 'role', 'nationality', 'status', 'createdAt', 'updatedAt', ] as const; export class QueryTrainCrewMemberDto { /** Matched against first and last name. */ @IsOptional() @IsString() search?: string; @IsOptional() @IsEnum(TrainCrewRole) role?: TrainCrewRole; @IsOptional() @IsEnum(TrainCrewNationality) nationality?: TrainCrewNationality; @IsOptional() @IsEnum(TrainCrewStatus) status?: TrainCrewStatus; @IsOptional() @Transform(({ value }) => (value === 'true' ? true : value === 'false' ? false : value)) @IsBoolean() isActive?: boolean; @IsOptional() @Type(() => Number) @IsInt() @Min(1) page?: number; @IsOptional() @Type(() => Number) @IsInt() @Min(1) @Max(200) limit?: number; @IsOptional() @IsIn(TRAIN_CREW_SORT_FIELDS as unknown as string[]) sortBy?: (typeof TRAIN_CREW_SORT_FIELDS)[number]; @IsOptional() @IsIn(['ASC', 'DESC']) sortOrder?: 'ASC' | 'DESC'; }