// services/api/src/uploads/dto.ts —— 上传端点入参 DTO(Task 18)。校验约束对齐 // 契约 UploadInitRequest: // · contentType 限白名单枚举(image/heic 暂定,G2 真机验证); // · bytes ≥ 1(契约 minimum);上限 UPLOAD_MAX_BYTES 是环境相关量,逐请求 // 惰性读取,故在服务层校验(同 filename 扩展名白名单与 categoryId 属主校验); // · clientTaskId/filename/albumId/categoryId 列宽对齐 db-cn schema // (VarChar 128/255/64/64)。 import { IsIn, IsInt, IsNotEmpty, IsOptional, IsString, MaxLength, Min, } from 'class-validator'; import { UPLOAD_CONTENT_TYPES, type UploadContentType } from './support'; export class UploadInitRequestDto { @IsString() @IsNotEmpty() @MaxLength(64) albumId!: string; /** 缺省为相册默认分类(P1a 无默认分类概念,落 null)。 */ @IsOptional() @IsString() @IsNotEmpty() @MaxLength(64) categoryId?: string; /** 客户端任务幂等键(A03:同任务重试复用会话与照片 ID)。 */ @IsString() @IsNotEmpty() @MaxLength(128) clientTaskId!: string; /** 原始文件名,仅元数据;扩展名白名单校验在服务层(对象键后缀派生)。 */ @IsString() @IsNotEmpty() @MaxLength(255) filename!: string; @IsInt() @Min(1) bytes!: number; @IsIn(UPLOAD_CONTENT_TYPES) contentType!: UploadContentType; }