142 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System.ComponentModel.DataAnnotations;
 | 
						|
using System.ComponentModel.DataAnnotations.Schema;
 | 
						|
using System.Text.Json.Serialization;
 | 
						|
using DysonNetwork.Shared.Proto;
 | 
						|
using NodaTime;
 | 
						|
using NodaTime.Serialization.Protobuf;
 | 
						|
 | 
						|
namespace DysonNetwork.Shared.Models;
 | 
						|
 | 
						|
public class SnCloudFile : ModelBase, ICloudFile, IIdentifiedResource
 | 
						|
{
 | 
						|
    /// The id generated by TuS, basically just UUID remove the dash lines
 | 
						|
    [MaxLength(32)]
 | 
						|
    public string Id { get; set; } = Guid.NewGuid().ToString().Replace("-", string.Empty);
 | 
						|
 | 
						|
    [MaxLength(1024)] public string Name { get; set; } = string.Empty;
 | 
						|
    [MaxLength(4096)] public string? Description { get; set; }
 | 
						|
    [Column(TypeName = "jsonb")] public Dictionary<string, object?>? FileMeta { get; set; }
 | 
						|
    [Column(TypeName = "jsonb")] public Dictionary<string, object?>? UserMeta { get; set; }
 | 
						|
    [Column(TypeName = "jsonb")] public List<ContentSensitiveMark>? SensitiveMarks { get; set; } = [];
 | 
						|
    [MaxLength(256)] public string? MimeType { get; set; }
 | 
						|
    [MaxLength(256)] public string? Hash { get; set; }
 | 
						|
    public Instant? ExpiredAt { get; set; }
 | 
						|
    public long Size { get; set; }
 | 
						|
    public Instant? UploadedAt { get; set; }
 | 
						|
    public bool HasCompression { get; set; } = false;
 | 
						|
    public bool HasThumbnail { get; set; } = false;
 | 
						|
    public bool IsEncrypted { get; set; } = false;
 | 
						|
 | 
						|
    public FilePool? Pool { get; set; }
 | 
						|
    public Guid? PoolId { get; set; }
 | 
						|
    [JsonIgnore] public SnFileBundle? Bundle { get; set; }
 | 
						|
    public Guid? BundleId { get; set; }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// The field is set to true if the recycling job plans to delete the file.
 | 
						|
    /// Due to the unstable of the recycling job, this doesn't really delete the file until a human verifies it.
 | 
						|
    /// </summary>
 | 
						|
    public bool IsMarkedRecycle { get; set; } = false;
 | 
						|
 | 
						|
    /// The object name which stored remotely,
 | 
						|
    /// multiple cloud file may have same storage id to indicate they are the same file
 | 
						|
    ///
 | 
						|
    /// If the storage id was null and the uploaded at is not null, means it is an embedding file,
 | 
						|
    /// The embedding file means the file is store on another site,
 | 
						|
    /// or it is a webpage (based on mimetype)
 | 
						|
    [MaxLength(32)]
 | 
						|
    public string? StorageId { get; set; }
 | 
						|
 | 
						|
    /// This field should be null when the storage id is filled
 | 
						|
    /// Indicates the off-site accessible url of the file
 | 
						|
    [MaxLength(4096)]
 | 
						|
    public string? StorageUrl { get; set; }
 | 
						|
 | 
						|
    [NotMapped]
 | 
						|
    [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
 | 
						|
    public string? FastUploadLink { get; set; }
 | 
						|
 | 
						|
    public ICollection<CloudFileReference> References { get; set; } = new List<CloudFileReference>();
 | 
						|
 | 
						|
    public Guid AccountId { get; set; }
 | 
						|
 | 
						|
    public SnCloudFileReferenceObject ToReferenceObject()
 | 
						|
    {
 | 
						|
        return new SnCloudFileReferenceObject
 | 
						|
        {
 | 
						|
            CreatedAt = CreatedAt,
 | 
						|
            UpdatedAt = UpdatedAt,
 | 
						|
            DeletedAt = DeletedAt,
 | 
						|
            Id = Id,
 | 
						|
            Name = Name,
 | 
						|
            FileMeta = FileMeta ?? [],
 | 
						|
            UserMeta = UserMeta ?? [],
 | 
						|
            SensitiveMarks = SensitiveMarks,
 | 
						|
            MimeType = MimeType,
 | 
						|
            Hash = Hash,
 | 
						|
            Size = Size,
 | 
						|
            HasCompression = HasCompression
 | 
						|
        };
 | 
						|
    }
 | 
						|
 | 
						|
    public string ResourceIdentifier => $"file:{Id}";
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Converts the CloudFile to a protobuf message
 | 
						|
    /// </summary>
 | 
						|
    /// <returns>The protobuf message representation of this object</returns>
 | 
						|
    public Proto.CloudFile ToProtoValue()
 | 
						|
    {
 | 
						|
        var proto = new Proto.CloudFile
 | 
						|
        {
 | 
						|
            Id = Id,
 | 
						|
            Name = Name,
 | 
						|
            MimeType = MimeType ?? string.Empty,
 | 
						|
            Hash = Hash ?? string.Empty,
 | 
						|
            Size = Size,
 | 
						|
            HasCompression = HasCompression,
 | 
						|
            Url = StorageUrl ?? string.Empty,
 | 
						|
            ContentType = MimeType ?? string.Empty,
 | 
						|
            UploadedAt = UploadedAt?.ToTimestamp(),
 | 
						|
            // Convert file metadata
 | 
						|
            FileMeta = GrpcTypeHelper.ConvertObjectToByteString(FileMeta),
 | 
						|
            // Convert user metadata
 | 
						|
            UserMeta = GrpcTypeHelper.ConvertObjectToByteString(UserMeta),
 | 
						|
            SensitiveMarks = GrpcTypeHelper.ConvertObjectToByteString(SensitiveMarks)
 | 
						|
        };
 | 
						|
 | 
						|
        return proto;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
public class CloudFileReference : ModelBase
 | 
						|
{
 | 
						|
    public Guid Id { get; set; } = Guid.NewGuid();
 | 
						|
    [MaxLength(32)] public string FileId { get; set; } = null!;
 | 
						|
    public SnCloudFile File { get; set; } = null!;
 | 
						|
    [MaxLength(1024)] public string Usage { get; set; } = null!;
 | 
						|
    [MaxLength(1024)] public string ResourceId { get; set; } = null!;
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Optional expiration date for the file reference
 | 
						|
    /// </summary>
 | 
						|
    public Instant? ExpiredAt { get; set; }
 | 
						|
 | 
						|
    /// <summary>
 | 
						|
    /// Converts the CloudFileReference to a protobuf message
 | 
						|
    /// </summary>
 | 
						|
    /// <returns>The protobuf message representation of this object</returns>
 | 
						|
    public Proto.CloudFileReference ToProtoValue()
 | 
						|
    {
 | 
						|
        return new Proto.CloudFileReference
 | 
						|
        {
 | 
						|
            Id = Id.ToString(),
 | 
						|
            FileId = FileId,
 | 
						|
            File = File?.ToProtoValue(),
 | 
						|
            Usage = Usage,
 | 
						|
            ResourceId = ResourceId,
 | 
						|
            ExpiredAt = ExpiredAt?.ToTimestamp()
 | 
						|
        };
 | 
						|
    }
 | 
						|
}
 |