diff options
| author | Jake Mannens <jake@asger.xyz> | 2026-05-22 12:46:00 +1000 |
|---|---|---|
| committer | Jake Mannens <jake@asger.xyz> | 2026-05-23 22:13:00 +1000 |
| commit | 4ea3ddb38d010c2f85c22b7f1c3f2d7e0c1355e3 (patch) | |
| tree | 90af9203059d645eb77216f1a091722ee9702438 /Controllers/ApiMediaController.cs | |
| parent | 6de5d7f5364fe1d54703da6d6b7cb08ea26e939f (diff) | |
Initial commitwasm-oldserver
Diffstat (limited to 'Controllers/ApiMediaController.cs')
| -rw-r--r-- | Controllers/ApiMediaController.cs | 221 |
1 files changed, 0 insertions, 221 deletions
diff --git a/Controllers/ApiMediaController.cs b/Controllers/ApiMediaController.cs deleted file mode 100644 index a1b07b1..0000000 --- a/Controllers/ApiMediaController.cs +++ /dev/null @@ -1,221 +0,0 @@ -using HyperBooru.ApiModels; -using HyperBooru.Services; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using Microsoft.EntityFrameworkCore; -using System.Text.Json; - -namespace HyperBooru.Controllers; - -[ApiController] -[Authorize] -[Route("/api/media")] -public class ApiMediaController : Controller { - private IDbContextFactory<HBContext> dbFactory; - private IMediaService mediaService; - - public ApiMediaController(IDbContextFactory<HBContext> dbFactory, IMediaService mediaService) { - this.dbFactory = dbFactory; - this.mediaService = mediaService; - } - - [HttpGet("{mediaId}")] - public async Task<IActionResult> 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<IActionResult> 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<IActionResult> 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<MediaUploadRequest>(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); - - [HttpGet("{mediaId}/tags")] - public async Task<IActionResult> GetMediaTagsAsync([FromRoute] Guid mediaId) { - using var db = dbFactory.CreateDbContext(); - - var media = await db.Media - .Include(m => m.Tags) - .ThenInclude(t => t.TagDefinition) - .ThenInclude(td => td.ImplicitTags) - .FirstOrDefaultAsync(m => m.Guid == mediaId); - if(media is null) - return NotFound(); - - return Ok(media.Tags.Select(t => (ApiModels.TagDefinition) t.TagDefinition).ToArray()); - } - - [HttpPatch("{mediaId}/tags")] - public async Task<IActionResult> AddTagsToMediaAsync( - [FromRoute] Guid mediaId, - [FromBody] Guid[] tagIds) { - - using var db = dbFactory.CreateDbContext(); - using var transaction = await db.Database.BeginTransactionAsync(); - - var media = await db.Media - .Include(m => m.Tags) - .ThenInclude(t => t.TagDefinition) - .ThenInclude(td => td.ImplicitTags) - .FirstOrDefaultAsync(m => m.Guid == mediaId); - if(media is null) - return NotFound(); - - tagIds = tagIds.Distinct().ToArray(); - - var tags = await db.TagDefinitions - .Where(td => tagIds.Contains(td.Guid)) - .ToArrayAsync(); - - if(tags.Count() < tagIds.Count()) - return NotFound("Invalid tag IDs specified"); - - media.Tags.AddRange(tags - .Where(td => !media.Tags.Select(t => t.TagDefinition.Guid).Contains(td.Guid)) - .Select(td => new Tag() { TagDefinition = td })); - - await db.SaveChangesAsync(); - await transaction.CommitAsync(); - - return Ok(media.Tags.Select(t => (ApiModels.TagDefinition) t.TagDefinition).ToArray()); - } - - [HttpPut("{mediaId}/tags")] - public async Task<IActionResult> ReplaceMediaTagsAsync( - [FromRoute] Guid mediaId, - [FromBody] Guid[] tagIds) { - - using var db = dbFactory.CreateDbContext(); - using var transaction = await db.Database.BeginTransactionAsync(); - - var media = await db.Media - .Include(m => m.Tags) - .ThenInclude(t => t.TagDefinition) - .ThenInclude(td => td.ImplicitTags) - .FirstOrDefaultAsync(m => m.Guid == mediaId); - if(media is null) - return NotFound(); - - tagIds = tagIds.Distinct().Order().ToArray(); - var tags = await db.TagDefinitions - .Where(td => tagIds.Contains(td.Guid)) - .ToArrayAsync(); - - var missingTags = tagIds.Except(tags.Select(td => td.Guid)); - var missingTagsString = string.Join(", ", missingTags.Select(t => t.ToString())); - if(missingTags.Any()) - return BadRequest($"Invalid tag IDs specified: {missingTagsString}"); - - media.Tags.AddRange(tags - .Where(td => !media.Tags.Select(t => t.TagDefinition.Guid).Contains(td.Guid)) - .Select(td => new Tag() { TagDefinition = td })); - - db.Tags.RemoveRange( - media.Tags.Where(t => !tagIds.Contains(t.TagDefinition.Guid))); - - await db.SaveChangesAsync(); - await transaction.CommitAsync(); - - return Ok(media.Tags.Select(t => (ApiModels.TagDefinition) t.TagDefinition).ToArray()); - } - - [HttpPatch("{mediaId}/tags/delete")] - public async Task<IActionResult> DeleteTagsFromMediaAsync( - [FromRoute] Guid mediaId, - [FromBody] Guid[] tagIds) { - - using var db = dbFactory.CreateDbContext(); - using var transaction = await db.Database.BeginTransactionAsync(); - - var media = await db.Media - .Include(m => m.Tags) - .ThenInclude(t => t.TagDefinition) - .ThenInclude(td => td.ImplicitTags) - .FirstOrDefaultAsync(m => m.Guid == mediaId); - if(media is null) - return NotFound(); - - tagIds = tagIds.Distinct().Order().ToArray(); - - var missingTags = tagIds.Except(media.Tags.Select(t => t.TagDefinition.Guid)); - var missingTagsString = string.Join(", ", missingTags.Select(t => t.ToString())); - if(missingTags.Any()) - return BadRequest($"Media does not contain the following tags: {missingTagsString}"); - - db.Tags.RemoveRange( - media.Tags.Where(t => tagIds.Contains(t.TagDefinition.Guid))); - - await db.SaveChangesAsync(); - await transaction.CommitAsync(); - - return Ok(media.Tags.Select(t => (ApiModels.TagDefinition) t.TagDefinition).ToArray()); - } -} |
