using System.IO; namespace zero.Media; public class MediaManagement : IMediaManagement { protected IMediaFileSystem FileSystem { get; set; } protected IMediaStore Store { get; set; } protected IMediaCreator Creator { get; set; } public MediaManagement(IMediaFileSystem fileSystem, IMediaStore store, IMediaCreator creator) { FileSystem = fileSystem; Store = store; Creator = creator; } /// public virtual string GetPublicFilePath(Media file, string thumbnailKey = null) { string path = file?.Path; if (!thumbnailKey.IsNullOrWhiteSpace()) { path = file?.ImageMeta?.Thumbnails?.GetValueOrDefault(thumbnailKey); } if (path.IsNullOrEmpty()) { return null; } return FileSystem.MapToPublicPath(path); } /// public virtual async Task GetFileStream(Media file, string thumbnailKey = null) { string path = file?.Path; if (!thumbnailKey.IsNullOrWhiteSpace()) { path = file?.ImageMeta?.Thumbnails?.GetValueOrDefault(thumbnailKey); } if (path.IsNullOrEmpty()) { return null; } return await FileSystem.StreamFile(path); } /// public virtual async Task GetFile(string id) { Media file = await Store.Load(id); return file != null && !file.IsFolder ? file : null; } /// public virtual async Task> UpdateFile(Media file) { // TODO check new file/image/media return await Store.Update(file); } /// public virtual async Task> DeleteFile(Media file) { // TODO delete in file system return await Store.Delete(file); } /// public virtual async Task> UploadFile(Stream fileStream, string filename, string folderId = null, CancellationToken cancellationToken = default) { Result result = await Creator.UploadFile(fileStream, filename, folderId, cancellationToken); if (!result.IsSuccess) { return result; } return await Store.Create(result.Model); } /// public virtual async Task GetFolder(string id) { Media folder = await Store.Load(id); return folder != null && folder.IsFolder ? folder : null; } /// public virtual async Task> CreateFolder(Media folder) { folder.IsActive = true; folder.IsFolder = true; return await Store.Create(folder); } /// public virtual async Task> CreateFolder(string name, string parentId = null) { Media media = await Store.Empty(); media.Name = name; media.ParentId = parentId; return await CreateFolder(media); } /// public virtual async Task> UpdateFolder(Media folder) { return await Store.Update(folder); } /// public virtual async Task> DeleteFolder(Media folder) { // TODO recursive return await Store.DeleteWithDescendants(folder); } } public interface IMediaManagement { /// /// Get publicly accessible file path for a media file /// /// The media file /// An optional thumbnail key which returns the path to a generated thumbnail string GetPublicFilePath(Media file, string thumbnailKey = null); /// /// Get file stream for a media file (stream has to be disposed manually) /// Task GetFileStream(Media file, string thumbnailKey = null); /// /// Get a media file by id /// Task GetFile(string id); /// /// Update and store a media file /// Task> UpdateFile(Media file); /// /// Deletes a media file (collection entry as well as physical file) /// Task> DeleteFile(Media file); /// /// Uploads a file and persists it /// Task> UploadFile(Stream fileStream, string filename, string folderId = null, CancellationToken cancellationToken = default); /// /// Get a media folder by id /// Task GetFolder(string id); /// /// Creates a new media folder /// Task> CreateFolder(Media folder); /// /// Creates a new media folder /// Task> CreateFolder(string name, string parentId = null); /// /// Rename and store a media folder /// Task> UpdateFolder(Media folder); /// /// Deletes a folder, as well as all descendant folders and files /// Task> DeleteFolder(Media folder); }