using Azaion.Common; using Azaion.Common.Configs; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace Azaion.Services; public interface IResourcesService { Task SaveResource(string? dataFolder, IFormFile data, CancellationToken cancellationToken = default); Task> ListResources(string? dataFolder, string? search, CancellationToken cancellationToken = default); void ClearFolder(string? dataFolder); } public class ResourcesService(IOptions resourcesConfig, ILogger logger) : IResourcesService { private string GetResourceFolder(string? dataFolder) { return string.IsNullOrWhiteSpace(dataFolder) ? resourcesConfig.Value.ResourcesFolder : Path.Combine(resourcesConfig.Value.ResourcesFolder, dataFolder); } public async Task SaveResource(string? dataFolder, IFormFile data, CancellationToken cancellationToken = default) { if (data == null) throw new BusinessException(ExceptionEnum.NoFileProvided); var resourceFolder = GetResourceFolder(dataFolder); if (!Directory.Exists(resourceFolder)) Directory.CreateDirectory(resourceFolder); var resourcePath = Path.Combine(resourceFolder, data.FileName); File.Delete(resourcePath); await using var fileStream = new FileStream(resourcePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); await data.CopyToAsync(fileStream, cancellationToken); logger.LogInformation($"Resource {data.FileName} Saved Successfully"); } public async Task> ListResources(string? dataFolder, string? search, CancellationToken cancellationToken = default) { var resourceFolder = GetResourceFolder(dataFolder); return await Task.FromResult( (string.IsNullOrWhiteSpace(search) ? new DirectoryInfo(resourceFolder).GetFiles() : new DirectoryInfo(resourceFolder).GetFiles(search)) .Select(f => f.Name) .ToList()); } public void ClearFolder(string? dataFolder) { var di = new DirectoryInfo(GetResourceFolder(dataFolder)); if (!di.Exists) return; foreach (var file in di.GetFiles()) file.Delete(); foreach (var dir in di.GetDirectories()) dir.Delete(true); } }