using System.ComponentModel.DataAnnotations;
namespace Store.Users.Contracts.Dtos;
/// 用户提交的充值备注。
public sealed class UserTopUpMessageRequest
{
/// 目标账户;省略时为本人,指定时检查管理权限。
[StringLength(20)]
public string? UserName { get; set; }
[Required(ErrorMessage = "充值备注不能为空"), StringLength(1000)] public string Message { get; set; } = "";
}
public sealed class UserTopUpResultRequest
{
[Range(1, long.MaxValue, ErrorMessage = "ID必须大于0")]
public long Id { get; set; }
[Required(ErrorMessage = "处理结果不能为空"), StringLength(1000)] public string Result { get; set; } = "";
}
/// 充值二维码;非空、长度与 Base64 格式由 DTO 检查。
public sealed class UserTopUpQrcodeRequest : IValidatableObject
{
[Required(ErrorMessage = "代理编码不能为空"), StringLength(50)] public string AgentCode { get; set; } = "";
[Required(ErrorMessage = "二维码不能为空"), StringLength(2097152)] public string QrcodeBase64 { get; set; } = "";
public IEnumerable Validate(ValidationContext validationContext)
{
var content = QrcodeBase64;
if (content.StartsWith("data:image/", StringComparison.OrdinalIgnoreCase))
{
int comma = content.IndexOf(',');
if (comma < 0 || !content[..comma].EndsWith(";base64", StringComparison.OrdinalIgnoreCase))
{
yield return new ValidationResult("二维码格式错误", [nameof(QrcodeBase64)]);
yield break;
}
content = content[(comma + 1)..];
}
bool valid;
try { valid = Convert.FromBase64String(content).Length > 0; }
catch (FormatException) { valid = false; }
if (!valid) yield return new ValidationResult("二维码必须为有效的Base64数据", [nameof(QrcodeBase64)]);
}
}