using System.ComponentModel.DataAnnotations; using System.Text.Json; using Tiku.Application.Assets; using Tiku.Domain.Common; namespace Tiku.Api.Contracts; /// /// 创建资产上传签名请求。 /// public sealed class AssetUploadSignDto { /// /// 资产 ID。 /// public Guid? AssetId { get; set; } /// /// 地区 ID。 /// public Guid? RegionId { get; set; } /// /// 科目 ID。 /// public Guid? SubjectId { get; set; } /// /// 分类 ID。 /// public Guid? CategoryId { get; set; } /// /// 内容节点 ID。 /// public Guid? ContentNodeId { get; set; } /// /// 资产键。 /// [StringLength(200)] public string? AssetKey { get; set; } /// /// 标题。 /// [StringLength(300)] public string? Title { get; set; } /// /// 分类。 /// [StringLength(100)] public string? Category { get; set; } /// /// 说明。 /// [StringLength(1000)] public string? Description { get; set; } /// /// 文件名。 /// [Required] [StringLength(500)] public string FileName { get; set; } = string.Empty; /// /// MIME 类型。 /// [Required] [StringLength(200)] public string MimeType { get; set; } = string.Empty; /// /// 文件大小,单位为字节。 /// [Range(0, long.MaxValue)] public long? FileSizeBytes { get; set; } /// /// SHA-256 校验值。 /// [RegularExpression("^[A-Fa-f0-9]{64}$")] public string? ChecksumSha256 { get; set; } /// /// 资产类型。 /// [StringLength(50)] public string? AssetType { get; set; } /// /// 可见性。 /// [StringLength(50)] public string? Visibility { get; set; } /// /// 是否公开。 /// public bool? IsPublic { get; set; } /// /// 服务提供方。 /// [StringLength(50)] public string? Provider { get; set; } /// /// 存储桶。 /// [StringLength(200)] public string? Bucket { get; set; } /// /// 对象存储键。 /// [StringLength(1000)] public string? ObjectKey { get; set; } /// /// 有效期秒数。 /// [Range(1, 3600)] public int? ExpiresInSeconds { get; set; } /// /// 扩展元数据。 /// public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public AssetUploadSignCommand ToCommand() { return new AssetUploadSignCommand( AssetId, RegionId, SubjectId, CategoryId, ContentNodeId, AssetKey, Title, Category, Description, FileName, MimeType, FileSizeBytes, ChecksumSha256, AssetType, Visibility, IsPublic, Provider, Bucket, ObjectKey, ExpiresInSeconds, Metadata); } } /// /// 确认资产上传请求。 /// public sealed class AssetUploadConfirmDto { /// /// 资产 ID。 /// [Required] public Guid AssetId { get; set; } /// /// MIME 类型。 /// [StringLength(200)] public string? MimeType { get; set; } /// /// 文件大小,单位为字节。 /// [Range(0, long.MaxValue)] public long? FileSizeBytes { get; set; } /// /// SHA-256 校验值。 /// [RegularExpression("^[A-Fa-f0-9]{64}$")] public string? ChecksumSha256 { get; set; } public AssetUploadConfirmCommand ToCommand() { return new AssetUploadConfirmCommand(AssetId, MimeType, FileSizeBytes, ChecksumSha256); } } /// /// 新增或更新内容资产请求。 /// public sealed class UpsertAssetDto { /// /// 资产 ID。 /// public Guid? AssetId { get; set; } /// /// 地区 ID。 /// public Guid? RegionId { get; set; } /// /// 科目 ID。 /// public Guid? SubjectId { get; set; } /// /// 分类 ID。 /// public Guid? CategoryId { get; set; } /// /// 内容节点 ID。 /// public Guid? ContentNodeId { get; set; } /// /// 历史系统 ID。 /// public string? LegacyId { get; set; } /// /// 资产键。 /// public string? AssetKey { get; set; } /// /// 标题。 /// public string? Title { get; set; } /// /// 分类。 /// public string? Category { get; set; } /// /// 说明。 /// public string? Description { get; set; } /// /// 文件名。 /// public string? FileName { get; set; } /// /// CDN 地址。 /// public string? CdnUrl { get; set; } /// /// 是否公开。 /// public bool? IsPublic { get; set; } /// /// 资产类型。 /// public string? AssetType { get; set; } /// /// 可见性。 /// public string? Visibility { get; set; } /// /// 状态。 /// public string? Status { get; set; } /// /// 服务提供方。 /// public string? Provider { get; set; } /// /// 存储桶。 /// public string? Bucket { get; set; } /// /// 对象存储键。 /// public string? ObjectKey { get; set; } /// /// MIME 类型。 /// public string? MimeType { get; set; } /// /// 文件大小,单位为字节。 /// public long? FileSizeBytes { get; set; } /// /// SHA-256 校验值。 /// public string? ChecksumSha256 { get; set; } /// /// 预览地址。 /// public string? PreviewUrl { get; set; } /// /// 预览对象存储键。 /// public string? PreviewObjectKey { get; set; } /// /// 显示顺序。 /// public int? Order { get; set; } /// /// 访问规则。 /// public JsonElement AccessRules { get; set; } = JsonDefaults.Object(); /// /// 扩展元数据。 /// public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertAssetCommand ToCommand() { return new UpsertAssetCommand( AssetId, RegionId, SubjectId, CategoryId, ContentNodeId, LegacyId, AssetKey, Title, Category, Description, FileName, CdnUrl, IsPublic, AssetType, Visibility, Status, Provider, Bucket, ObjectKey, MimeType, FileSizeBytes, ChecksumSha256, PreviewUrl, PreviewObjectKey, Order, AccessRules, Metadata); } } /// /// 创建资产访问签名请求。 /// public sealed class AssetAccessSignDto { /// /// 资产 ID。 /// [Required] public Guid AssetId { get; set; } /// /// 有效期秒数。 /// [Range(60, 3600)] public int? ExpiresInSeconds { get; set; } public AssetAccessSignCommand ToCommand() { return new AssetAccessSignCommand(AssetId, ExpiresInSeconds); } } /// /// 资产管理查询参数。 /// public sealed class AssetManagementQueryDto { /// /// 地区 ID。 /// public Guid? RegionId { get; set; } /// /// 科目 ID。 /// public Guid? SubjectId { get; set; } /// /// 分类 ID。 /// public Guid? CategoryId { get; set; } /// /// 内容节点 ID。 /// public Guid? ContentNodeId { get; set; } /// /// 资产类型。 /// [StringLength(50)] public string? AssetType { get; set; } /// /// 分类。 /// [StringLength(100)] public string? Category { get; set; } /// /// 上传状态。 /// [StringLength(50)] public string? UploadStatus { get; set; } /// /// 安全扫描状态。 /// [StringLength(50)] public string? SecurityScanStatus { get; set; } /// /// 关键字。 /// [StringLength(100)] public string? Keyword { get; set; } /// /// 返回数量上限。 /// [Range(1, 500)] public int? Limit { get; set; } public AssetManagementFilter ToFilter() { return new AssetManagementFilter( RegionId, SubjectId, CategoryId, ContentNodeId, AssetType, Category, UploadStatus, SecurityScanStatus, Keyword, Limit); } } /// /// 资产事件查询参数。 /// public sealed class AssetEventQueryDto { /// /// 资产 ID。 /// public Guid? AssetId { get; set; } /// /// 用户 ID。 /// public Guid? UserId { get; set; } /// /// 返回数量上限。 /// [Range(1, 500)] public int? Limit { get; set; } public AssetEventFilter ToFilter() { return new AssetEventFilter(AssetId, UserId, Limit); } } /// /// 导入任务查询参数。 /// public sealed class ImportJobQueryDto { /// /// 状态。 /// [StringLength(50)] public string? Status { get; set; } /// /// 导入Type。 /// [StringLength(50)] public string? ImportType { get; set; } /// /// 来源格式。 /// [StringLength(50)] public string? SourceFormat { get; set; } /// /// 返回数量上限。 /// [Range(1, 500)] public int? Limit { get; set; } public ImportJobFilter ToFilter() { return new ImportJobFilter(Status, ImportType, SourceFormat, Limit); } }