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);
}