/** * 充值请求 DTO - 用户发起充值订单 */ import { IsInt, IsOptional, IsString, IsIn, Min } from 'class-validator'; import { Transform } from 'class-transformer'; /** 支持的支付渠道白名单 */ const ALLOWED_PROVIDERS = ['mock', 'stripe', 'paypal', 'momo', 'zalopay', 'alipay'] as const; export class DepositDto { /** 充值金额(美分),最小 100 = $1.00 */ @IsInt({ message: 'amountCents 必须为整数(美分单位)' }) @Min(100, { message: '最低充值金额为 $1.00(100 美分)' }) @Transform(({ value }: { value: unknown }) => { // 允许字符串数字自动转换(class-validator + transform: true) if (typeof value === 'string') { const parsed = parseInt(value, 10); if (!isNaN(parsed)) return parsed; } return value; }) amountCents!: number; /** 货币,默认 USD */ @IsOptional() @IsString() @IsIn(['USD', 'VND'], { message: 'currency 仅支持 USD 或 VND' }) currency?: string = 'USD'; /** 支付渠道,默认从环境变量 PAYMENT_PROVIDER 读取,fallback 为 mock */ @IsOptional() @IsString() @IsIn(ALLOWED_PROVIDERS, { message: 'provider 不支持,可用: ' + ALLOWED_PROVIDERS.join(', ') }) provider?: string; }