import { Type } from 'class-transformer'; import { ArrayMaxSize, IsArray, IsBoolean, IsDateString, IsIn, IsInt, IsOptional, IsString, Max, MaxLength, Min, MinLength, } from 'class-validator'; const STATUSES = ['pending', 'confirmed', 'canceled', 'done'] as const; export class CreateReservationServiceDto { @IsString() @MinLength(2) @MaxLength(120) name!: string; @IsOptional() @IsString() @MaxLength(500) description?: string; @Type(() => Number) @IsInt() @Min(5) @Max(480) durationMinutes!: number; @IsOptional() @IsArray() @ArrayMaxSize(7) @IsInt({ each: true }) @Min(0, { each: true }) @Max(6, { each: true }) workDays?: number[]; @IsOptional() @Type(() => Number) @IsInt() @Min(0) @Max(23) dayStartHour?: number; @IsOptional() @Type(() => Number) @IsInt() @Min(1) @Max(24) dayEndHour?: number; @IsOptional() @IsBoolean() isActive?: boolean; } export class UpdateReservationServiceDto { @IsOptional() @IsString() @MinLength(2) @MaxLength(120) name?: string; @IsOptional() @IsString() @MaxLength(500) description?: string; @IsOptional() @Type(() => Number) @IsInt() @Min(5) @Max(480) durationMinutes?: number; @IsOptional() @IsArray() @ArrayMaxSize(7) @IsInt({ each: true }) @Min(0, { each: true }) @Max(6, { each: true }) workDays?: number[]; @IsOptional() @Type(() => Number) @IsInt() @Min(0) @Max(23) dayStartHour?: number; @IsOptional() @Type(() => Number) @IsInt() @Min(1) @Max(24) dayEndHour?: number; @IsOptional() @IsBoolean() isActive?: boolean; } export class CreateReservationAppointmentDto { @IsString() serviceId!: string; @IsString() personId!: string; @IsOptional() @IsString() assigneeId?: string | null; @IsDateString() startsAt!: string; @IsOptional() @IsIn(STATUSES) status?: (typeof STATUSES)[number]; @IsOptional() @IsString() @MaxLength(1000) notes?: string | null; } export class UpdateReservationAppointmentDto { @IsOptional() @IsString() serviceId?: string; @IsOptional() @IsString() personId?: string; @IsOptional() @IsString() assigneeId?: string | null; @IsOptional() @IsDateString() startsAt?: string; @IsOptional() @IsIn(STATUSES) status?: (typeof STATUSES)[number]; @IsOptional() @IsString() @MaxLength(1000) notes?: string | null; } export class ListReservationsQueryDto { @IsOptional() @IsIn(STATUSES) status?: (typeof STATUSES)[number]; @IsOptional() @IsDateString() from?: string; @IsOptional() @IsDateString() to?: string; @IsOptional() @IsString() serviceId?: string; @IsOptional() @IsString() personId?: string; @IsOptional() @Type(() => Number) @IsInt() @Min(1) page?: number = 1; @IsOptional() @Type(() => Number) @IsInt() @Min(1) @Max(100) limit?: number = 30; } export class SlotsQueryDto { @IsString() serviceId!: string; @IsDateString() date!: string; @IsOptional() @IsString() assigneeId?: string; }