From 3c188c2949af9d0e08db74a850f8a87dad52de49 Mon Sep 17 00:00:00 2001 From: ivarlovlie Date: Fri, 30 Dec 2022 20:22:55 +0100 Subject: feat: Yes --- code/api/Endpoints/Storage/UploadEndpoint.cs | 61 ++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 code/api/Endpoints/Storage/UploadEndpoint.cs (limited to 'code/api/Endpoints/Storage/UploadEndpoint.cs') diff --git a/code/api/Endpoints/Storage/UploadEndpoint.cs b/code/api/Endpoints/Storage/UploadEndpoint.cs new file mode 100644 index 0000000..e3feffb --- /dev/null +++ b/code/api/Endpoints/Storage/UploadEndpoint.cs @@ -0,0 +1,61 @@ +using File = I2R.Storage.Api.Database.Models.File; + +namespace I2R.Storage.Api.Endpoints.Storage; + +public class UploadEndpoint : EndpointBase +{ + private readonly DefaultResourceService _resourceService; + private readonly IStringLocalizer _localizer; + private readonly AppDatabase _database; + private readonly StorageService _storageService; + + public UploadEndpoint(DefaultResourceService resourceService, IStringLocalizer localizer, AppDatabase database, StorageService storageService) { + _resourceService = resourceService; + _localizer = localizer; + _database = database; + _storageService = storageService; + } + + public class Request + { + public IFormFileCollection FormFileCollection { get; set; } + public Guid FolderId { get; set; } + } + + [HttpPost("~/storage/upload")] + public async Task Handle(Request request) { + var folder = await _storageService.GetFileSystemEntryAsync(request.FolderId); + if (folder == default) { + return NotFound(); + } + + var problem = new KnownProblemModel(); + foreach (var formFile in request.FormFileCollection) { + if (!formFile.FileName.IsValidFileName()) { + problem.AddError("file_" + formFile.Name, _localizer["{fileName} is an invalid file name"]); + continue; + } + + if (problem.Errors.Any()) { + return KnownProblem(problem); + } + + var file = new File(LoggedInUser.Id) { + Name = formFile.FileName, + FolderId = folder.Id, + MimeType = formFile.ContentType, + SizeInBytes = formFile.Length, + OwningUserId = LoggedInUser.Id + }; + var id = new StorageBlobId() { + Id = file.Id, + Bucket = LoggedInUser.Id + }; + await _resourceService.SetBlobAsync(id, formFile.OpenReadStream()); + await _database.Files.AddAsync(file); + await _database.SaveChangesAsync(); + } + + return Ok(await _storageService.GetFileSystemEntryAsync(folder.Id)); + } +} \ No newline at end of file -- cgit v1.3