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 { (string?, Stream?) GetInstaller(bool isStage); Task GetEncryptedResource(string? dataFolder, string fileName, string key, CancellationToken cancellationToken = default); 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 (string?, Stream?) GetInstaller(bool isStage) { var suiteFolder = Path.Combine(resourcesConfig.Value.ResourcesFolder, isStage ? resourcesConfig.Value.SuiteStageInstallerFolder : resourcesConfig.Value.SuiteInstallerFolder); var installer = new DirectoryInfo(suiteFolder).GetFiles("AzaionSuite.Iterative*").FirstOrDefault(); if (installer == null) return (null, null); var fileStream = new FileStream(installer.FullName, FileMode.Open, FileAccess.Read); return (installer.Name, fileStream); } public async Task GetEncryptedResource(string? dataFolder, string fileName, string key, CancellationToken cancellationToken = default) { var fileStream = new FileStream(Path.Combine(GetResourceFolder(dataFolder), fileName), FileMode.Open, FileAccess.Read); var ms = new MemoryStream(); await fileStream.EncryptTo(ms, key, cancellationToken); ms.Seek(0, SeekOrigin.Begin); return ms; } 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); } }