aboutsummaryrefslogtreecommitdiffstats
path: root/code/api/Endpoints/Storage/UploadEndpoint.cs
diff options
context:
space:
mode:
authorivarlovlie <git@ivarlovlie.no>2022-12-30 20:22:55 +0100
committerivarlovlie <git@ivarlovlie.no>2022-12-30 20:22:55 +0100
commit3c188c2949af9d0e08db74a850f8a87dad52de49 (patch)
tree5dba85786aa9a5a72d91328092a017f16318b8c0 /code/api/Endpoints/Storage/UploadEndpoint.cs
parentf5374b0b3543b0bd7d280f71ed8bf5175bad3834 (diff)
downloadstorage-3c188c2949af9d0e08db74a850f8a87dad52de49.tar.xz
storage-3c188c2949af9d0e08db74a850f8a87dad52de49.zip
feat: Yes
Diffstat (limited to 'code/api/Endpoints/Storage/UploadEndpoint.cs')
-rw-r--r--code/api/Endpoints/Storage/UploadEndpoint.cs61
1 files changed, 61 insertions, 0 deletions
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<SharedResources> _localizer;
+ private readonly AppDatabase _database;
+ private readonly StorageService _storageService;
+
+ public UploadEndpoint(DefaultResourceService resourceService, IStringLocalizer<SharedResources> 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<ActionResult> 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