deposit.dto.ts 1.2 KB

1234567891011121314151617181920212223242526272829303132333435
  1. /**
  2. * 充值请求 DTO - 用户发起充值订单
  3. */
  4. import { IsInt, IsOptional, IsString, IsIn, Min } from 'class-validator';
  5. import { Transform } from 'class-transformer';
  6. /** 支持的支付渠道白名单 */
  7. const ALLOWED_PROVIDERS = ['mock', 'stripe', 'paypal', 'momo', 'zalopay', 'alipay'] as const;
  8. export class DepositDto {
  9. /** 充值金额(美分),最小 100 = $1.00 */
  10. @IsInt({ message: 'amountCents 必须为整数(美分单位)' })
  11. @Min(100, { message: '最低充值金额为 $1.00(100 美分)' })
  12. @Transform(({ value }: { value: unknown }) => {
  13. // 允许字符串数字自动转换(class-validator + transform: true)
  14. if (typeof value === 'string') {
  15. const parsed = parseInt(value, 10);
  16. if (!isNaN(parsed)) return parsed;
  17. }
  18. return value;
  19. })
  20. amountCents!: number;
  21. /** 货币,默认 USD */
  22. @IsOptional()
  23. @IsString()
  24. @IsIn(['USD', 'VND'], { message: 'currency 仅支持 USD 或 VND' })
  25. currency?: string = 'USD';
  26. /** 支付渠道,默认从环境变量 PAYMENT_PROVIDER 读取,fallback 为 mock */
  27. @IsOptional()
  28. @IsString()
  29. @IsIn(ALLOWED_PROVIDERS, { message: 'provider 不支持,可用: ' + ALLOWED_PROVIDERS.join(', ') })
  30. provider?: string;
  31. }