namespace DeepDrftContent.FileDatabase.Models; /// /// Parameters for creating a FileBinary /// /// The binary data /// The size of the data in bytes public record FileBinaryParams(byte[] Buffer, int Size); /// /// Base class for file binary data /// public class FileBinary { public byte[] Buffer { get; } public int Size { get; } public FileBinary(FileBinaryParams parameters) { Buffer = parameters.Buffer; Size = parameters.Size; } public static FileBinary From(FileBinaryDto dto) { var buffer = Convert.FromBase64String(dto.Base64); return new FileBinary(new FileBinaryParams(buffer, dto.Size)); } } /// /// DTO for FileBinary serialization /// /// Base64 encoded binary data /// Size of the original data public record FileBinaryDto(string Base64, int Size) { public FileBinaryDto(FileBinary fileBinary) : this( Convert.ToBase64String(fileBinary.Buffer), fileBinary.Size) { } } /// /// Parameters for creating a MediaBinary /// /// The binary data /// The size of the data in bytes /// The file extension public record MediaBinaryParams(byte[] Buffer, int Size, string Extension) : FileBinaryParams(Buffer, Size); /// /// Media binary with extension information /// public class MediaBinary : FileBinary { public string Extension { get; } public MediaBinary(MediaBinaryParams parameters) : base(parameters) { Extension = parameters.Extension; } public static MediaBinary From(MediaBinaryDto dto) { var buffer = Convert.FromBase64String(dto.Base64); var extension = GetExtensionType(dto.Mime); return new MediaBinary(new MediaBinaryParams(buffer, dto.Size, extension)); } private static string GetExtensionType(string mime) { return MimeTypeExtensions.GetExtension(mime); } } /// /// DTO for MediaBinary serialization /// /// Base64 encoded binary data /// Size of the original data /// MIME type of the media public record MediaBinaryDto(string Base64, int Size, string Mime) : FileBinaryDto(Base64, Size) { public MediaBinaryDto(MediaBinary mediaBinary) : this( Convert.ToBase64String(mediaBinary.Buffer), mediaBinary.Size, MimeTypeExtensions.GetMimeType(mediaBinary.Extension)) { } } /// /// Parameters for creating an ImageBinary /// /// The binary data /// The size of the data in bytes /// The file extension /// The aspect ratio of the image public record ImageBinaryParams(byte[] Buffer, int Size, string Extension, double AspectRatio) : MediaBinaryParams(Buffer, Size, Extension); /// /// Image binary with aspect ratio information /// public class ImageBinary : MediaBinary { public double AspectRatio { get; } public ImageBinary(ImageBinaryParams parameters) : base(parameters) { AspectRatio = parameters.AspectRatio; } public static ImageBinary From(ImageBinaryDto dto) { var buffer = Convert.FromBase64String(dto.Base64); var extension = GetExtensionType(dto.Mime); return new ImageBinary(new ImageBinaryParams(buffer, dto.Size, extension, dto.AspectRatio)); } private static string GetExtensionType(string mime) { return MimeTypeExtensions.GetExtension(mime); } } /// /// DTO for ImageBinary serialization /// /// Base64 encoded binary data /// Size of the original data /// MIME type of the media /// The aspect ratio of the image public record ImageBinaryDto(string Base64, int Size, string Mime, double AspectRatio) : MediaBinaryDto(Base64, Size, Mime) { public ImageBinaryDto(ImageBinary imageBinary) : this( Convert.ToBase64String(imageBinary.Buffer), imageBinary.Size, MimeTypeExtensions.GetMimeType(imageBinary.Extension), imageBinary.AspectRatio) { } } /// /// Utility class for MIME type and extension conversions /// public static class MimeTypeExtensions { private static readonly Dictionary MimeTypes = new() { { ".jpg", "image/jpeg" }, { ".jpeg", "image/jpeg" }, { ".png", "image/png" }, { ".gif", "image/gif" }, { ".webp", "image/webp" }, { ".svg", "image/svg+xml" }, { ".bmp", "image/bmp" } }; private static readonly Dictionary Extensions = MimeTypes.ToDictionary(kvp => kvp.Value, kvp => kvp.Key); public static string GetMimeType(string extension) { return MimeTypes.TryGetValue(extension.ToLowerInvariant(), out var mime) ? mime : "application/octet-stream"; } public static string GetExtension(string mime) { return Extensions.TryGetValue(mime.ToLowerInvariant(), out var extension) ? extension : ".bin"; } }