diff options
Diffstat (limited to 'Controllers')
| -rw-r--r-- | Controllers/MediaController.cs | 123 |
1 files changed, 33 insertions, 90 deletions
diff --git a/Controllers/MediaController.cs b/Controllers/MediaController.cs index b7c8314..b476dec 100644 --- a/Controllers/MediaController.cs +++ b/Controllers/MediaController.cs @@ -9,23 +9,18 @@ namespace HyperBooru.Controllers; [ApiController] [Route("/media")] public class MediaController : Controller { + private IMediaService mediaService; private IConfigService config; - private HBContext db; + private HBContext db; - private ContentInspector inspector; + public MediaController( + IMediaService mediaService, + IConfigService config, + HBContext db) { - public MediaController(IConfigService config, HBContext db) { - this.config = config; - this.db = db; - - ContentInspectorBuilder inspectorBuilder = new() { - Definitions = - MimeDetective.Definitions.Default.FileTypes.Images.All() - .Union(MimeDetective.Definitions.Default.FileTypes.Video.All()) - .ToList() - }; - - inspector = inspectorBuilder.Build(); + this.mediaService = mediaService; + this.config = config; + this.db = db; } [HttpGet("{mediaId}")] @@ -34,7 +29,7 @@ public class MediaController : Controller { if(media is null) return NotFound(); - var fs = System.IO.File.OpenRead(config.GetPath(media)); + var fs = System.IO.File.OpenRead(mediaService.GetPath(media)); return new FileStreamResult(fs, media.MimeType); } @@ -52,7 +47,7 @@ public class MediaController : Controller { if(media.MimeType.Split("/")[0] != "image") return BadRequest("Media object not an image"); - using var image = new MagickImage(config.GetPath(media)); + using var image = new MagickImage(mediaService.GetPath(media)); if(w is null && h is null) return BadRequest("Both width and height cannot be null!"); @@ -63,7 +58,7 @@ public class MediaController : Controller { int width = (int)(w is not null ? w : image.Width * h / image.Height); int height = (int)(h is not null ? h : image.Height * w / image.Width); - var thumbPath = config.GetPath(media, width, height); + var thumbPath = mediaService.GetPath(media, width, height); if(!System.IO.File.Exists(thumbPath)) { image.Resize(new MagickGeometry(width, height)); @@ -76,16 +71,8 @@ public class MediaController : Controller { } [HttpDelete("{mediaId}")] - public IActionResult Delete([FromRoute] Guid mediaId) { - var media = db.Media.First(m => m.Guid == mediaId); - if(media is null) - return NotFound(); - - System.IO.File.Delete(config.GetPath(media)); - - db.Media.Remove(media); - db.SaveChanges(); - return Ok(); + public void Delete([FromRoute] Guid mediaId) { + mediaService.Delete(mediaId); } [HttpPost] @@ -95,72 +82,28 @@ public class MediaController : Controller { [FromForm] DateTime? lastWriteTime, [FromForm] DateTime? createTime) { - using var transaction = db.Database.BeginTransaction(); - - var formFile = Request.Form.Files[0]; - if(formFile.Length < 1) - return BadRequest("Empty file"); - - var formStream = formFile.OpenReadStream(); - - // Calculate the checksum using the in-memory file contents - var hash = BitConverter - .ToString(MD5.Create().ComputeHash(formStream)) - .Replace("-", "") - .ToLower(); + if(Request.Form.Files.Count == 0) + return BadRequest("No files"); - if(checksum is not null && hash != checksum.ToLower()) - return BadRequest("Checksum does not match"); + Media media = new(); - var fileRecord = new UploadedFile() { - Filename = formFile.FileName, - OriginalChecksum = hash, - UploadTime = DateTime.UtcNow, - LastAccessTime = lastAccessTime, - LastWriteTime = lastWriteTime, - CreateTime = createTime - }; - - formStream.Seek(0, SeekOrigin.Begin); - var defs = inspector.Inspect(formStream); - - var mime = defs.ByMimeType().FirstOrDefault()?.MimeType; - if(mime is null) - return BadRequest("Unsupported file type"); - - var media = db.Media - .FirstOrDefault(m => m.Checksum == hash); - - if(media is null) { - var ingestTagDef = db.TagDefinitions - .First(td => td.Guid == HBContext.IngestTag); - - media = new() { - Checksum = hash, - MimeType = mime, - UploadedFiles = new() { - fileRecord - }, - Tags = new() { - new() { TagDefinition = ingestTagDef } - } - }; - - using var newFile = System.IO.File.Create(config.GetPath(media)); - - formStream.Seek(0, SeekOrigin.Begin); - formStream.CopyTo(newFile); - newFile.Flush(); - - db.Media.Add(media); - } else { - media.UploadedFiles.Add(fileRecord); - db.Update(media); + foreach(var formFile in Request.Form.Files) { + try { + media = mediaService.Create( + formFile.OpenReadStream(), + formFile.FileName, + checksum, + lastAccessTime, + lastWriteTime, + createTime); + } catch(MediaCreateException e) { + return BadRequest(e.Message); + } } - db.SaveChanges(); - transaction.Commit(); - - return Redirect($"/ViewMedia?m={media.Guid}"); + if(Request.Form.Files.Count == 1) + return Redirect($"/ViewMedia?m={media.Guid}"); + else + return Redirect($"/Gallery"); } }
\ No newline at end of file |
