using Abyss.Components.Services; using Abyss.Components.Static; using Abyss.Components.Tools; using Abyss.Model; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Abyss.Components.Controllers.Media; using System.IO; using Task = System.Threading.Tasks.Task; [ApiController] [Route("api/[controller]")] public class ImageController(ResourceService rs, ConfigureService config) : BaseController { public readonly string ImageFolder = Path.Combine(config.MediaRoot, "Images"); [HttpPost("init")] public async Task InitAsync(string token, string owner) { var r = await rs.Initialize(ImageFolder, token, owner, Ip); if(r) return Ok(r); return StatusCode(403, new { message = "403 Denied" }); } [HttpGet] public async Task QueryCollections(string token) { var r = await rs.Query(ImageFolder, token, Ip); if(r == null) return StatusCode(401, new { message = "Unauthorized" }); return Ok(r.NaturalSort(x => x)); } [HttpGet("{id}")] public async Task Query(string id, string token) { var d = Helpers.SafePathCombine(ImageFolder, [id, "summary.json"]); if (d == null) return StatusCode(403, new { message = "403 Denied" }); var r = await rs.Get(d, token, Ip); if (!r) return StatusCode(403, new { message = "403 Denied" }); return Ok(await System.IO.File.ReadAllTextAsync(d)); } [HttpPost("bulkquery")] public async Task QueryBulk([FromQuery] string token, [FromBody] string[] id) { List result = new List(); var db = id.Select(x => Helpers.SafePathCombine(ImageFolder, [x, "summary.json"])).ToArray(); if (db.Any(x => x == null)) return BadRequest(); if(!await rs.GetAll(db!, token, Ip)) return StatusCode(403, new { message = "403 Denied" }); var rc = db.Select(x => System.IO.File.ReadAllTextAsync(x!)).ToArray(); string[] rcs = await Task.WhenAll(rc); var rjs = rcs.Select(JsonConvert.DeserializeObject).Select(x => x!).ToArray(); return Ok(JsonConvert.SerializeObject(rjs)); } [HttpPost("{id}/bookmark")] public async Task Bookmark(string id, string token, [FromBody] Bookmark bookmark) { var d = Helpers.SafePathCombine(ImageFolder, [id, "summary.json"]); if (d == null) return StatusCode(403, new { message = "403 Denied" }); var r = await rs.Update(d, token, Ip); if (!r) return StatusCode(403, new { message = "403 Denied" }); Comic c = JsonConvert.DeserializeObject(await System.IO.File.ReadAllTextAsync(d))!; var bookmarkPage = Helpers.SafePathCombine(ImageFolder, [id, bookmark.Page]); if(!System.IO.File.Exists(bookmarkPage)) return BadRequest(); c.Bookmarks.Add(bookmark); var o = JsonConvert.SerializeObject(c); await System.IO.File.WriteAllTextAsync(d, o); return Ok(); } [HttpGet("{id}/{file}")] public async Task Get(string id, string file, string token) { var d = Helpers.SafePathCombine(ImageFolder, [id, file]); if (d == null) return StatusCode(403, new { message = "403 Denied" }); var r = await rs.Get(d, token, Ip); if (!r) return StatusCode(403, new { message = "403 Denied" }); return PhysicalFile(d, "image/jpeg", enableRangeProcessing: true); } }