From 0945635a1c0722b71a30d8d0087988c26728e33d Mon Sep 17 00:00:00 2001 From: Alex Bezdieniezhnykh Date: Tue, 24 Dec 2024 12:48:02 +0200 Subject: [PATCH] add possibility to upload and download from specific folder --- Azaion.Api/Program.cs | 12 ++++++------ Azaion.Services/ResourcesService.cs | 23 +++++++++++++++-------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/Azaion.Api/Program.cs b/Azaion.Api/Program.cs index 048378f..a277b82 100644 --- a/Azaion.Api/Program.cs +++ b/Azaion.Api/Program.cs @@ -135,15 +135,15 @@ app.MapGet("/users", .RequireAuthorization(apiAdminPolicy) .WithOpenApi(op => new(op){ Summary = "List users by criteria"}); -app.MapPost("/resources", - async (IFormFile data, IResourcesService resourceService, CancellationToken cancellationToken) - => await resourceService.SaveResource(data, cancellationToken)) +app.MapPost("/resources/{dataFolder?}", + async ([FromRoute]string? dataFolder, IFormFile data, IResourcesService resourceService, CancellationToken cancellationToken) + => await resourceService.SaveResource(dataFolder, data, cancellationToken)) .Accepts("multipart/form-data") .RequireAuthorization(apiUploaderPolicy) .DisableAntiforgery(); -app.MapPost("/resources/get", //Need to have POST method for secure password - async ([FromBody]GetResourceRequest request, IAuthService authService, IUserService userService, IResourcesService resourcesService, CancellationToken cancellationToken) => +app.MapPost("/resources/get/{dataFolder?}", //Need to have POST method for secure password + async ([FromBody]GetResourceRequest request, [FromRoute]string? dataFolder, IAuthService authService, IUserService userService, IResourcesService resourcesService, CancellationToken cancellationToken) => { var user = authService.CurrentUser; if (user == null) @@ -152,7 +152,7 @@ app.MapPost("/resources/get", //Need to have POST method for secure password await userService.CheckHardware(user, request); var key = Security.MakeEncryptionKey(user.Email, request.Password, request.Hardware.Hash); - var stream = await resourcesService.GetEncryptedResource(request.FileName, key, cancellationToken); + var stream = await resourcesService.GetEncryptedResource(dataFolder, request.FileName, key, cancellationToken); return Results.File(stream, "application/octet-stream", request.FileName); }).RequireAuthorization() diff --git a/Azaion.Services/ResourcesService.cs b/Azaion.Services/ResourcesService.cs index a687d8d..bf1bde4 100644 --- a/Azaion.Services/ResourcesService.cs +++ b/Azaion.Services/ResourcesService.cs @@ -11,15 +11,17 @@ namespace Azaion.Services; public interface IResourcesService { - Task GetEncryptedResource(string fileName, string key, CancellationToken cancellationToken = default); - Task SaveResource(IFormFile data, CancellationToken cancellationToken = default); + Task GetEncryptedResource(string? dataFolder, string fileName, string key, CancellationToken cancellationToken = default); + Task SaveResource(string? dataFolder, IFormFile data, CancellationToken cancellationToken = default); } public class ResourcesService(IOptions resourcesConfig, ILogger logger) : IResourcesService { - public async Task GetEncryptedResource(string fileName, string key, CancellationToken cancellationToken = default) + public async Task GetEncryptedResource(string? dataFolder, string fileName, string key, CancellationToken cancellationToken = default) { - var resourcePath = Path.Combine(resourcesConfig.Value.ResourcesFolder, fileName); + var resourcePath = string.IsNullOrWhiteSpace(dataFolder) + ? Path.Combine(resourcesConfig.Value.ResourcesFolder, fileName) + : Path.Combine(resourcesConfig.Value.ResourcesFolder, dataFolder, fileName); var fileStream = new FileStream(resourcePath, FileMode.Open, FileAccess.Read); var ms = new MemoryStream(); @@ -28,14 +30,19 @@ public class ResourcesService(IOptions resourcesConfig, ILogger return ms; } - public async Task SaveResource(IFormFile data, CancellationToken cancellationToken = default) + public async Task SaveResource(string? dataFolder, IFormFile data, CancellationToken cancellationToken = default) { if (data == null) throw new BusinessException(ExceptionEnum.NoFileProvided); - if (!Directory.Exists(resourcesConfig.Value.ResourcesFolder)) - Directory.CreateDirectory(resourcesConfig.Value.ResourcesFolder); - var resourcePath = Path.Combine(resourcesConfig.Value.ResourcesFolder, data.FileName); + var resourceFolder = string.IsNullOrWhiteSpace(dataFolder) + ? resourcesConfig.Value.ResourcesFolder + : Path.Combine(resourcesConfig.Value.ResourcesFolder, dataFolder); + + if (!Directory.Exists(resourceFolder)) + Directory.CreateDirectory(resourceFolder); + + var resourcePath = Path.Combine(resourceFolder, data.FileName); await using var fileStream = new FileStream(resourcePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); await data.CopyToAsync(fileStream, cancellationToken); logger.LogInformation($"Resource {data.FileName} Saved Successfully");