import { IsBoolean, IsDateString, IsEnum, IsIn, IsInt, IsOptional, IsString, IsUUID, Max, Min, } from 'class-validator'; import { Transform } from 'class-transformer'; import { LabTaskStatus } from '@prisma/client'; const toBoolean = ({ value }: { value: unknown }) => { if (typeof value === 'boolean') return value; if (value === 'true' || value === '1') return true; if (value === 'false' || value === '0') return false; return value; }; export class UpdateLabTaskDto { @IsEnum(LabTaskStatus) status: LabTaskStatus; } export type TaskSortField = | 'date' | 'status' | 'clinic' | 'patient' | 'important' | 'prosthesis' | 'taskType'; export class ListLabTasksDto { @IsOptional() @IsString() q?: string; @IsOptional() @IsUUID() clinicOrganizationId?: string; @IsOptional() @IsEnum(LabTaskStatus) status?: LabTaskStatus; @IsOptional() @Transform(toBoolean) @IsBoolean() completed?: boolean; @IsOptional() @Transform(toBoolean) @IsBoolean() important?: boolean; @IsOptional() @IsDateString() sentFrom?: string; @IsOptional() @IsDateString() sentTo?: string; /** Workflow step code (e.g. design) completed within the prosthesis group. */ @IsOptional() @IsString() stepCompleted?: string; @IsOptional() @IsIn(['date', 'status', 'clinic', 'patient', 'important', 'prosthesis', 'taskType']) sortBy?: TaskSortField; @IsOptional() @IsIn(['asc', 'desc']) sortDir?: 'asc' | 'desc'; @IsOptional() @Transform(({ value }) => Number(value)) @IsInt() @Min(1) page = 1; @IsOptional() @Transform(({ value }) => Number(value)) @IsInt() @Min(1) @Max(100) limit = 50; }