using HyperBooru.ApiModels; using HyperBooru.Services; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Text.Json; namespace HyperBooru.Controllers; [ApiController] [Route("/api/media")] public class ApiMediaController : Controller { private IDbContextFactory dbFactory; private IMediaService mediaService; public ApiMediaController(IDbContextFactory dbFactory, IMediaService mediaService) { this.dbFactory = dbFactory; this.mediaService = mediaService; } [HttpGet("{mediaId}")] public async Task Get([FromRoute] Guid mediaId) { using var db = dbFactory.CreateDbContext(); var media = await db.Media.FirstOrDefaultAsync(m => m.Guid == mediaId); if(media is null) throw new ObjectNotFoundException(mediaId); return Ok((ApiModels.Media) media); } [HttpGet("{mediaId}/files")] public async Task GetUploadedFiles([FromRoute] Guid mediaId) { using var db = dbFactory.CreateDbContext(); var media = await db.Media .Include(m => m.UploadedFiles) .FirstOrDefaultAsync(m => m.Guid == mediaId); if(media is null) throw new ObjectNotFoundException(mediaId); return Ok(media.UploadedFiles.Select(uf => (ApiModels.UploadedFile) uf).ToArray()); } [HttpPatch] public async Task UpdateMedia([FromBody] ApiModels.Media updatedMedia) { using var db = dbFactory.CreateDbContext(); using var transaction = await db.Database.BeginTransactionAsync(); var media = await db.Media.FirstOrDefaultAsync(m => m.Guid == updatedMedia.MediaId); if(media is null) return NotFound(); media.ShortDescription = updatedMedia.ShortDescription; media.LongDescription = updatedMedia.LongDescription; await db.SaveChangesAsync(); await transaction.CommitAsync(); return Ok(); } [HttpPost] public IActionResult Upload() { if(Request.Form.Files.Count == 0) return BadRequest("No files"); if(Request.Form.Files.Count > 1) return BadRequest("More than one file supplied"); var metadataString = Request.Form.Files .First() .Headers["X-HyperBooru-Metadata"] .ElementAtOrDefault(0); MediaUploadRequest? metadata = metadataString is null ? null : JsonSerializer.Deserialize(metadataString); var formFile = Request.Form.Files.First(); var media = mediaService.Create( formFile.OpenReadStream(), formFile.FileName, metadata?.Checksum, metadata?.LastAccessTime, metadata?.LastWriteTime, metadata?.CreateTime, metadata?.Path, metadata?.PathType, metadata?.Tags); return Ok((ApiModels.Media) media); } [HttpDelete("{mediaId}")] public void Delete([FromRoute] Guid mediaId) => mediaService.Delete(mediaId); }