using System.ComponentModel.DataAnnotations; using System.Text.Json; using Tiku.Application.Assets; using Tiku.Application.Storage; using Tiku.Domain.Content; namespace Tiku.Api.Contracts; /// /// 资产访问签名查询参数。 /// public sealed class AssetAccessQueryDto { /// /// 租户编码。 /// [StringLength(100)] public string? TenantCode { get; set; } /// /// 有效期秒数。 /// [Range(1, 7200)] public int? ExpiresInSeconds { get; set; } } /// /// 资产访问签名响应。 /// public sealed record AssetAccessResponseDto( ContentAssetAccessSummaryDto Item, AssetAccessPrincipalDto Access, SignedStorageUrlDto Url, JsonElement Watermark) { public static AssetAccessResponseDto FromApplication(AssetAccessResultModel result) { return new AssetAccessResponseDto( ContentAssetAccessSummaryDto.FromApplication(result.Item), new AssetAccessPrincipalDto( result.Access.UserId, result.Access.IsMember, result.Access.HasSvip), SignedStorageUrlDto.FromApplication(result.Url), result.Watermark); } } /// /// 内容资产访问摘要。 /// public sealed record ContentAssetAccessSummaryDto( Guid Id, ContentAssetType AssetType, string? Title, string? FileName, string? PreviewUrl, AssetUploadStatus UploadStatus, AssetSecurityScanStatus SecurityScanStatus, AssetPreviewStatus PreviewStatus, ContentVisibility Visibility) { public static ContentAssetAccessSummaryDto FromApplication(ContentAssetAccessSummary item) { return new ContentAssetAccessSummaryDto( item.Id, item.AssetType, item.Title, item.FileName, item.PreviewUrl, item.UploadStatus, item.SecurityScanStatus, item.PreviewStatus, item.Visibility); } } /// /// 资产访问Principal请求 DTO。 /// public sealed record AssetAccessPrincipalDto( Guid? UserId, bool IsMember, bool HasSvip); /// /// SignedStorageUrl请求 DTO。 /// public sealed record SignedStorageUrlDto( string Provider, string? Bucket, string? ObjectKey, string Method, string Url, IReadOnlyDictionary Headers, DateTimeOffset ExpiresAt, int ExpiresInSeconds, string SignatureMode) { public static SignedStorageUrlDto FromApplication(ObjectStorageSignedUrl signedUrl) { return new SignedStorageUrlDto( signedUrl.Provider, signedUrl.Bucket, signedUrl.ObjectKey, signedUrl.Method, signedUrl.Url.AbsoluteUri, signedUrl.Headers, signedUrl.ExpiresAt, (int)signedUrl.ExpiresIn.TotalSeconds, signedUrl.SignatureMode); } }