summaryrefslogtreecommitdiff
path: root/Controllers/ApiMediaController.cs
blob: a324f356887a49a747c631c0452a75c9827e8282 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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);
}