using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks; using Kyoo.Abstractions.Controllers; using Kyoo.Abstractions.Models; using Kyoo.Abstractions.Models.Exceptions; using Kyoo.Abstractions.Models.Permissions; using Kyoo.Core.Models.Options; using Microsoft.Extensions.Options; namespace Kyoo.Core.Api { [Route("api/collection")] [Route("api/collections")] [ApiController] [PartialPermission(nameof(CollectionApi))] public class CollectionApi : CrudApi { private readonly ILibraryManager _libraryManager; private readonly IFileSystem _files; private readonly IThumbnailsManager _thumbs; public CollectionApi(ILibraryManager libraryManager, IFileSystem files, IThumbnailsManager thumbs, IOptions options) : base(libraryManager.CollectionRepository, options.Value.PublicUrl) { _libraryManager = libraryManager; _files = files; _thumbs = thumbs; } [HttpGet("{id:int}/show")] [HttpGet("{id:int}/shows")] [PartialPermission(Kind.Read)] public async Task>> GetShows(int id, [FromQuery] string sortBy, [FromQuery] int afterID, [FromQuery] Dictionary where, [FromQuery] int limit = 30) { try { ICollection resources = await _libraryManager.GetAll( ApiHelper.ParseWhere(where, x => x.Collections.Any(y => y.ID == id)), new Sort(sortBy), new Pagination(limit, afterID)); if (!resources.Any() && await _libraryManager.GetOrDefault(id) == null) return NotFound(); return Page(resources, limit); } catch (ArgumentException ex) { return BadRequest(new {Error = ex.Message}); } } [HttpGet("{slug}/show")] [HttpGet("{slug}/shows")] [PartialPermission(Kind.Read)] public async Task>> GetShows(string slug, [FromQuery] string sortBy, [FromQuery] int afterID, [FromQuery] Dictionary where, [FromQuery] int limit = 30) { try { ICollection resources = await _libraryManager.GetAll( ApiHelper.ParseWhere(where, x => x.Collections.Any(y => y.Slug == slug)), new Sort(sortBy), new Pagination(limit, afterID)); if (!resources.Any() && await _libraryManager.GetOrDefault(slug) == null) return NotFound(); return Page(resources, limit); } catch (ArgumentException ex) { return BadRequest(new {Error = ex.Message}); } } [HttpGet("{id:int}/library")] [HttpGet("{id:int}/libraries")] [PartialPermission(Kind.Read)] public async Task>> GetLibraries(int id, [FromQuery] string sortBy, [FromQuery] int afterID, [FromQuery] Dictionary where, [FromQuery] int limit = 30) { try { ICollection resources = await _libraryManager.GetAll( ApiHelper.ParseWhere(where, x => x.Collections.Any(y => y.ID == id)), new Sort(sortBy), new Pagination(limit, afterID)); if (!resources.Any() && await _libraryManager.GetOrDefault(id) == null) return NotFound(); return Page(resources, limit); } catch (ArgumentException ex) { return BadRequest(new {Error = ex.Message}); } } [HttpGet("{slug}/library")] [HttpGet("{slug}/libraries")] [PartialPermission(Kind.Read)] public async Task>> GetLibraries(string slug, [FromQuery] string sortBy, [FromQuery] int afterID, [FromQuery] Dictionary where, [FromQuery] int limit = 30) { try { ICollection resources = await _libraryManager.GetAll( ApiHelper.ParseWhere(where, x => x.Collections.Any(y => y.Slug == slug)), new Sort(sortBy), new Pagination(limit, afterID)); if (!resources.Any() && await _libraryManager.GetOrDefault(slug) == null) return NotFound(); return Page(resources, limit); } catch (ArgumentException ex) { return BadRequest(new {Error = ex.Message}); } } [HttpGet("{slug}/poster")] public async Task GetPoster(string slug) { try { Collection collection = await _libraryManager.Get(slug); return _files.FileResult(await _thumbs.GetImagePath(collection, Images.Poster)); } catch (ItemNotFoundException) { return NotFound(); } } [HttpGet("{slug}/logo")] public async Task GetLogo(string slug) { try { Collection collection = await _libraryManager.Get(slug); return _files.FileResult(await _thumbs.GetImagePath(collection, Images.Logo)); } catch (ItemNotFoundException) { return NotFound(); } } [HttpGet("{slug}/backdrop")] [HttpGet("{slug}/thumbnail")] public async Task GetBackdrop(string slug) { try { Collection collection = await _libraryManager.Get(slug); return _files.FileResult(await _thumbs.GetImagePath(collection, Images.Thumbnail)); } catch (ItemNotFoundException) { return NotFound(); } } } }