using NetinaShop.Domain.Enums; namespace NetinaShop.Api.Controller; public class FileController : ICarterModule { public void AddRoutes(IEndpointRouteBuilder app) { var group = app.NewVersionedApi("File") .MapGroup("api/file") .RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser()); group.MapGet("", GetFilesAsync) .WithDisplayName("GetFilesAsync") .HasApiVersion(1.0); group.MapPost("", UploadFileAsync) .WithDisplayName("UploadFileAsync") .HasApiVersion(1.0); } public async Task GetFilesAsync([FromQuery]StorageFileType? fileType,[FromServices] IStorageService storageService, CancellationToken cancellationToken) => TypedResults.Ok(await storageService.GetStorageFiles(fileType: fileType ?? StorageFileType.Image)); public async Task UploadFileAsync([FromBody] FileUploadRequest uploadRequest, [FromServices] IStorageService storageService, CancellationToken cancellationToken) { var bytes = Convert.FromBase64String(uploadRequest.StringBaseFile); using var originalMedFileStream = new MemoryStream(bytes); using var originalThumbFileStream = new MemoryStream(bytes); using var thumbnailFileStream = new MemoryStream(); using var mediumFileStream = new MemoryStream(); await uploadRequest.ImageResize(originalMedFileStream, mediumFileStream, 1280); await uploadRequest.ImageResize(originalThumbFileStream, thumbnailFileStream, 200); var medFileName = await storageService.UploadObjectFromFileAsync(uploadRequest.FileName, $"{uploadRequest.FileUploadType.ToDisplay()}/Med", uploadRequest.ContentType, mediumFileStream); await storageService.UploadObjectFromFileAsync(uploadRequest.FileName, $"{uploadRequest.FileUploadType.ToDisplay()}/Thumb", uploadRequest.ContentType, thumbnailFileStream); var response = new FileUploadResponse { FileName = medFileName, FileLocation = $"{uploadRequest.FileUploadType.ToDisplay()}/Med/{medFileName}", FileUrl = $"https://storage.vesmook.com/{uploadRequest.FileUploadType.ToDisplay()}/Med/{medFileName}" }; return TypedResults.Ok(response); } }