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);
}
|