using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Kyoo.Abstractions.Controllers; using Kyoo.Abstractions.Models; using Kyoo.Abstractions.Models.Permissions; using Kyoo.Core.Models.Options; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; namespace Kyoo.Core.Api { [Route("api/library")] [Route("api/libraries")] [ApiController] [PartialPermission(nameof(LibraryApi))] public class LibraryApi : CrudApi { private readonly ILibraryManager _libraryManager; private readonly ITaskManager _taskManager; public LibraryApi(ILibraryManager libraryManager, ITaskManager taskManager, IOptions options) : base(libraryManager.LibraryRepository, options.Value.PublicUrl) { _libraryManager = libraryManager; _taskManager = taskManager; } [PartialPermission(Kind.Create)] public override async Task> Create(Library resource) { ActionResult result = await base.Create(resource); if (result.Value != null) { _taskManager.StartTask("scan", new Progress(), new Dictionary { { "slug", result.Value.Slug } }); } return result; } [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 = 50) { try { ICollection resources = await _libraryManager.GetAll( ApiHelper.ParseWhere(where, x => x.Libraries.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 = 20) { try { ICollection resources = await _libraryManager.GetAll( ApiHelper.ParseWhere(where, x => x.Libraries.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}/collection")] [HttpGet("{id:int}/collections")] [PartialPermission(Kind.Read)] public async Task>> GetCollections(int id, [FromQuery] string sortBy, [FromQuery] int afterID, [FromQuery] Dictionary where, [FromQuery] int limit = 50) { try { ICollection resources = await _libraryManager.GetAll( ApiHelper.ParseWhere(where, x => x.Libraries.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}/collection")] [HttpGet("{slug}/collections")] [PartialPermission(Kind.Read)] public async Task>> GetCollections(string slug, [FromQuery] string sortBy, [FromQuery] int afterID, [FromQuery] Dictionary where, [FromQuery] int limit = 20) { try { ICollection resources = await _libraryManager.GetAll( ApiHelper.ParseWhere(where, x => x.Libraries.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}/item")] [HttpGet("{id:int}/items")] [PartialPermission(Kind.Read)] public async Task>> GetItems(int id, [FromQuery] string sortBy, [FromQuery] int afterID, [FromQuery] Dictionary where, [FromQuery] int limit = 50) { try { ICollection resources = await _libraryManager.GetItemsFromLibrary(id, ApiHelper.ParseWhere(where), 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}/item")] [HttpGet("{slug}/items")] [PartialPermission(Kind.Read)] public async Task>> GetItems(string slug, [FromQuery] string sortBy, [FromQuery] int afterID, [FromQuery] Dictionary where, [FromQuery] int limit = 50) { try { ICollection resources = await _libraryManager.GetItemsFromLibrary(slug, ApiHelper.ParseWhere(where), 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 }); } } } }