Starting to clean up

This commit is contained in:
Zoe Roux 2020-07-16 21:25:22 +02:00
parent 63a85124b7
commit d0117a8325
17 changed files with 247 additions and 94 deletions

View File

@ -33,7 +33,6 @@ namespace Kyoo.Controllers
// Helpers // Helpers
Task<Show> GetShowByPath(string path);
Task AddShowLink(int showID, int? libraryID, int? collectionID); Task AddShowLink(int showID, int? libraryID, int? collectionID);
Task AddShowLink([NotNull] Show show, Library library, Collection collection); Task AddShowLink([NotNull] Show show, Library library, Collection collection);
@ -122,26 +121,26 @@ namespace Kyoo.Controllers
Task<ICollection<People>> SearchPeople(string searchQuery); Task<ICollection<People>> SearchPeople(string searchQuery);
//Register values //Register values
Task RegisterLibrary(Library library); Task<Library> RegisterLibrary(Library library);
Task RegisterCollection(Collection collection); Task<Collection> RegisterCollection(Collection collection);
Task RegisterShow(Show show); Task<Show> RegisterShow(Show show);
Task RegisterSeason(Season season); Task<Season> RegisterSeason(Season season);
Task RegisterEpisode(Episode episode); Task<Episode> RegisterEpisode(Episode episode);
Task RegisterTrack(Track track); Task<Track> RegisterTrack(Track track);
Task RegisterGenre(Genre genre); Task<Genre> RegisterGenre(Genre genre);
Task RegisterStudio(Studio studio); Task<Studio> RegisterStudio(Studio studio);
Task RegisterPeople(People people); Task<People> RegisterPeople(People people);
// Edit values // Edit values
Task EditLibrary(Library library, bool resetOld); Task<Library> EditLibrary(Library library, bool resetOld);
Task EditCollection(Collection collection, bool resetOld); Task<Collection> EditCollection(Collection collection, bool resetOld);
Task EditShow(Show show, bool resetOld); Task<Show> EditShow(Show show, bool resetOld);
Task EditSeason(Season season, bool resetOld); Task<Season> EditSeason(Season season, bool resetOld);
Task EditEpisode(Episode episode, bool resetOld); Task<Episode> EditEpisode(Episode episode, bool resetOld);
Task EditTrack(Track track, bool resetOld); Task<Track> EditTrack(Track track, bool resetOld);
Task EditGenre(Genre genre, bool resetOld); Task<Genre> EditGenre(Genre genre, bool resetOld);
Task EditStudio(Studio studio, bool resetOld); Task<Studio> EditStudio(Studio studio, bool resetOld);
Task EditPeople(People people, bool resetOld); Task<People> EditPeople(People people, bool resetOld);
// Delete values // Delete values
@ -154,5 +153,27 @@ namespace Kyoo.Controllers
Task DeleteGenre(Genre genre); Task DeleteGenre(Genre genre);
Task DeleteStudio(Studio studio); Task DeleteStudio(Studio studio);
Task DeletePeople(People people); Task DeletePeople(People people);
//Delete by slug
Task DelteLibrary(string slug);
Task DeleteCollection(string slug);
Task DeleteShow(string slug);
Task DeleteSeason(string slug);
Task DeleteEpisode(string slug);
Task DeleteTrack(string slug);
Task DeleteGenre(string slug);
Task DeleteStudio(string slug);
Task DeletePeople(string slug);
//Delete by id
Task DelteLibrary(int id);
Task DeleteCollection(int id);
Task DeleteShow(int id);
Task DeleteSeason(int id);
Task DeleteEpisode(int id);
Task DeleteTrack(int id);
Task DeleteGenre(int id);
Task DeleteStudio(int id);
Task DeletePeople(int id);
} }
} }

View File

@ -81,9 +81,9 @@ namespace Kyoo.Controllers
Pagination page = default Pagination page = default
) => GetAll(where, new Sort<T>(sort), page); ) => GetAll(where, new Sort<T>(sort), page);
Task<int> Create([NotNull] T obj); Task<T> Create([NotNull] T obj);
Task<int> CreateIfNotExists([NotNull] T obj); Task<T> CreateIfNotExists([NotNull] T obj);
Task Edit([NotNull] T edited, bool resetOld); Task<T> Edit([NotNull] T edited, bool resetOld);
Task Delete(int id); Task Delete(int id);
Task Delete(string slug); Task Delete(string slug);
@ -99,7 +99,6 @@ namespace Kyoo.Controllers
public interface IShowRepository : IRepository<Show> public interface IShowRepository : IRepository<Show>
{ {
Task<Show> GetByPath(string path);
Task AddShowLink(int showID, int? libraryID, int? collectionID); Task AddShowLink(int showID, int? libraryID, int? collectionID);
} }

View File

@ -221,12 +221,7 @@ namespace Kyoo.Controllers
{ {
return _episodes.GetEpisodes(seasonID); return _episodes.GetEpisodes(seasonID);
} }
public Task<Show> GetShowByPath(string path)
{
return _shows.GetByPath(path);
}
public Task AddShowLink(int showID, int? libraryID, int? collectionID) public Task AddShowLink(int showID, int? libraryID, int? collectionID)
{ {
return _shows.AddShowLink(showID, libraryID, collectionID); return _shows.AddShowLink(showID, libraryID, collectionID);
@ -279,92 +274,92 @@ namespace Kyoo.Controllers
return _people.Search(searchQuery); return _people.Search(searchQuery);
} }
public Task RegisterLibrary(Library library) public Task<Library> RegisterLibrary(Library library)
{ {
return _libraries.Create(library); return _libraries.Create(library);
} }
public Task RegisterCollection(Collection collection) public Task<Collection> RegisterCollection(Collection collection)
{ {
return _collections.Create(collection); return _collections.Create(collection);
} }
public Task RegisterShow(Show show) public Task<Show> RegisterShow(Show show)
{ {
return _shows.Create(show); return _shows.Create(show);
} }
public Task RegisterSeason(Season season) public Task<Season> RegisterSeason(Season season)
{ {
return _seasons.Create(season); return _seasons.Create(season);
} }
public Task RegisterEpisode(Episode episode) public Task<Episode> RegisterEpisode(Episode episode)
{ {
return _episodes.Create(episode); return _episodes.Create(episode);
} }
public Task RegisterTrack(Track track) public Task<Track> RegisterTrack(Track track)
{ {
return _tracks.Create(track); return _tracks.Create(track);
} }
public Task RegisterGenre(Genre genre) public Task<Genre> RegisterGenre(Genre genre)
{ {
return _genres.Create(genre); return _genres.Create(genre);
} }
public Task RegisterStudio(Studio studio) public Task<Studio> RegisterStudio(Studio studio)
{ {
return _studios.Create(studio); return _studios.Create(studio);
} }
public Task RegisterPeople(People people) public Task<People> RegisterPeople(People people)
{ {
return _people.Create(people); return _people.Create(people);
} }
public Task EditLibrary(Library library, bool resetOld) public Task<Library> EditLibrary(Library library, bool resetOld)
{ {
return _libraries.Edit(library, resetOld); return _libraries.Edit(library, resetOld);
} }
public Task EditCollection(Collection collection, bool resetOld) public Task<Collection> EditCollection(Collection collection, bool resetOld)
{ {
return _collections.Edit(collection, resetOld); return _collections.Edit(collection, resetOld);
} }
public Task EditShow(Show show, bool resetOld) public Task<Show> EditShow(Show show, bool resetOld)
{ {
return _shows.Edit(show, resetOld); return _shows.Edit(show, resetOld);
} }
public Task EditSeason(Season season, bool resetOld) public Task<Season> EditSeason(Season season, bool resetOld)
{ {
return _seasons.Edit(season, resetOld); return _seasons.Edit(season, resetOld);
} }
public Task EditEpisode(Episode episode, bool resetOld) public Task<Episode> EditEpisode(Episode episode, bool resetOld)
{ {
return _episodes.Edit(episode, resetOld); return _episodes.Edit(episode, resetOld);
} }
public Task EditTrack(Track track, bool resetOld) public Task<Track> EditTrack(Track track, bool resetOld)
{ {
return _tracks.Edit(track, resetOld); return _tracks.Edit(track, resetOld);
} }
public Task EditGenre(Genre genre, bool resetOld) public Task<Genre> EditGenre(Genre genre, bool resetOld)
{ {
return _genres.Edit(genre, resetOld); return _genres.Edit(genre, resetOld);
} }
public Task EditStudio(Studio studio, bool resetOld) public Task<Studio> EditStudio(Studio studio, bool resetOld)
{ {
return _studios.Edit(studio, resetOld); return _studios.Edit(studio, resetOld);
} }
public Task EditPeople(People people, bool resetOld) public Task<People> EditPeople(People people, bool resetOld)
{ {
return _people.Edit(people, resetOld); return _people.Edit(people, resetOld);
} }
@ -413,5 +408,95 @@ namespace Kyoo.Controllers
{ {
return _people.Delete(people); return _people.Delete(people);
} }
public Task DelteLibrary(string library)
{
return _libraries.Delete(library);
}
public Task DeleteCollection(string collection)
{
return _collections.Delete(collection);
}
public Task DeleteShow(string show)
{
return _shows.Delete(show);
}
public Task DeleteSeason(string season)
{
return _seasons.Delete(season);
}
public Task DeleteEpisode(string episode)
{
return _episodes.Delete(episode);
}
public Task DeleteTrack(string track)
{
return _tracks.Delete(track);
}
public Task DeleteGenre(string genre)
{
return _genres.Delete(genre);
}
public Task DeleteStudio(string studio)
{
return _studios.Delete(studio);
}
public Task DeletePeople(string people)
{
return _people.Delete(people);
}
public Task DelteLibrary(int library)
{
return _libraries.Delete(library);
}
public Task DeleteCollection(int collection)
{
return _collections.Delete(collection);
}
public Task DeleteShow(int show)
{
return _shows.Delete(show);
}
public Task DeleteSeason(int season)
{
return _seasons.Delete(season);
}
public Task DeleteEpisode(int episode)
{
return _episodes.Delete(episode);
}
public Task DeleteTrack(int track)
{
return _tracks.Delete(track);
}
public Task DeleteGenre(int genre)
{
return _genres.Delete(genre);
}
public Task DeleteStudio(int studio)
{
return _studios.Delete(studio);
}
public Task DeletePeople(int people)
{
return _people.Delete(people);
}
} }
} }

View File

@ -72,7 +72,7 @@ namespace Kyoo.Controllers
return await query.ToListAsync(); return await query.ToListAsync();
} }
public async Task<int> Create(Collection obj) public async Task<Collection> Create(Collection obj)
{ {
if (obj == null) if (obj == null)
throw new ArgumentNullException(nameof(obj)); throw new ArgumentNullException(nameof(obj));
@ -91,17 +91,17 @@ namespace Kyoo.Controllers
throw; throw;
} }
return obj.ID; return obj;
} }
public async Task<int> CreateIfNotExists(Collection obj) public async Task<Collection> CreateIfNotExists(Collection obj)
{ {
if (obj == null) if (obj == null)
throw new ArgumentNullException(nameof(obj)); throw new ArgumentNullException(nameof(obj));
Collection old = await Get(obj.Slug); Collection old = await Get(obj.Slug);
if (old != null) if (old != null)
return old.ID; return old;
try try
{ {
return await Create(obj); return await Create(obj);
@ -111,11 +111,11 @@ namespace Kyoo.Controllers
old = await Get(obj.Slug); old = await Get(obj.Slug);
if (old == null) if (old == null)
throw new SystemException("Unknown database state."); throw new SystemException("Unknown database state.");
return old.ID; return old;
} }
} }
public async Task Edit(Collection edited, bool resetOld) public async Task<Collection> Edit(Collection edited, bool resetOld)
{ {
if (edited == null) if (edited == null)
throw new ArgumentNullException(nameof(edited)); throw new ArgumentNullException(nameof(edited));
@ -130,6 +130,7 @@ namespace Kyoo.Controllers
Utility.Merge(old, edited); Utility.Merge(old, edited);
await _database.SaveChangesAsync(); await _database.SaveChangesAsync();
return old;
} }
public async Task Delete(int id) public async Task Delete(int id)

View File

@ -1,7 +1,7 @@
using System; using System;
using System.Reflection; using System.Reflection;
using IdentityServer4.Services; using IdentityServer4.Services;
using Kyoo.Api; using Kyoo.API;
using Kyoo.Controllers; using Kyoo.Controllers;
using Kyoo.Models; using Kyoo.Models;
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authentication.JwtBearer;

View File

@ -16,7 +16,7 @@ using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using SignInResult = Microsoft.AspNetCore.Identity.SignInResult; using SignInResult = Microsoft.AspNetCore.Identity.SignInResult;
namespace Kyoo.Api namespace Kyoo.API
{ {
public class RegisterRequest public class RegisterRequest
{ {

View File

@ -5,7 +5,7 @@ using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
namespace Kyoo.Api namespace Kyoo.API
{ {
[Route("api/[controller]")] [Route("api/[controller]")]
[ApiController] [ApiController]

View File

@ -6,7 +6,7 @@ using System.Threading.Tasks;
using Kyoo.Controllers; using Kyoo.Controllers;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
namespace Kyoo.Api namespace Kyoo.API
{ {
[Route("api/[controller]")] [Route("api/[controller]")]
[ApiController] [ApiController]

View File

@ -6,7 +6,7 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
namespace Kyoo.Api namespace Kyoo.API
{ {
[Route("api/libraries")] [Route("api/libraries")]
[Route("api/library")] [Route("api/library")]

View File

@ -5,7 +5,7 @@ using Kyoo.Models;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace Kyoo.Api namespace Kyoo.API
{ {
[Route("api/[controller]")] [Route("api/[controller]")]
[ApiController] [ApiController]

View File

@ -4,7 +4,7 @@ using Kyoo.Models;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace Kyoo.Api namespace Kyoo.API
{ {
[Route("api/[controller]")] [Route("api/[controller]")]
[ApiController] [ApiController]

View File

@ -5,34 +5,31 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Kyoo.Controllers; using Kyoo.Controllers;
using Kyoo.Models.Exceptions;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
namespace Kyoo.Api namespace Kyoo.API
{ {
[Route("api/shows")] [Route("api/shows")]
[Route("api/show")] [Route("api/show")]
[ApiController] [ApiController]
public class ShowsAPI : ControllerBase public class ShowsAPI : ControllerBase
{ {
private readonly ILibraryManager _libraryManager; private readonly IShowRepository _shows;
private readonly IProviderManager _providerManager; private readonly IProviderManager _providerManager;
private readonly DatabaseContext _database;
private readonly IThumbnailsManager _thumbnailsManager; private readonly IThumbnailsManager _thumbnailsManager;
private readonly ITaskManager _taskManager; private readonly ITaskManager _taskManager;
private readonly string _baseURL; private readonly string _baseURL;
public ShowsAPI(ILibraryManager libraryManager, public ShowsAPI(IShowRepository shows,
IProviderManager providerManager, IProviderManager providerManager,
DatabaseContext database,
IThumbnailsManager thumbnailsManager, IThumbnailsManager thumbnailsManager,
ITaskManager taskManager, ITaskManager taskManager,
IConfiguration configuration) IConfiguration configuration)
{ {
_libraryManager = libraryManager; _shows = shows;
_providerManager = providerManager; _providerManager = providerManager;
_database = database;
_thumbnailsManager = thumbnailsManager; _thumbnailsManager = thumbnailsManager;
_taskManager = taskManager; _taskManager = taskManager;
_baseURL = configuration.GetValue<string>("public_url").TrimEnd('/'); _baseURL = configuration.GetValue<string>("public_url").TrimEnd('/');
@ -51,23 +48,34 @@ namespace Kyoo.Api
if (limit == 0) if (limit == 0)
limit = 20; limit = 20;
ICollection<Show> shows;
try try
{ {
shows = await _libraryManager.GetShows(Utility.ParseWhere<Show>(where), ICollection<Show> shows = await _shows.GetAll(Utility.ParseWhere<Show>(where),
new Sort<Show>(sortBy), new Sort<Show>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return new Page<Show>(shows,
x => $"{x.ID}",
_baseURL + Request.Path,
Request.Query.ToDictionary(x => x.Key, x => x.Value.ToString(), StringComparer.InvariantCultureIgnoreCase),
limit);
} }
catch (ArgumentException ex) catch (ArgumentException ex)
{ {
return BadRequest(new { Error = ex.Message }); return BadRequest(new { Error = ex.Message });
} }
}
return new Page<Show>(shows,
x => $"{x.ID}", [HttpGet("{id}")]
_baseURL + Request.Path, [Authorize(Policy="Read")]
Request.Query.ToDictionary(x => x.Key, x => x.Value.ToString(), StringComparer.InvariantCultureIgnoreCase), [JsonDetailed]
limit); public async Task<ActionResult<Show>> GetShow(int id)
{
Show show = await _shows.Get(id);
if (show == null)
return NotFound();
return show;
} }
[HttpGet("{slug}")] [HttpGet("{slug}")]
@ -75,28 +83,67 @@ namespace Kyoo.Api
[JsonDetailed] [JsonDetailed]
public async Task<ActionResult<Show>> GetShow(string slug) public async Task<ActionResult<Show>> GetShow(string slug)
{ {
Show show = await _libraryManager.GetShow(slug); Show show = await _shows.Get(slug);
if (show == null) if (show == null)
return NotFound(); return NotFound();
return show; return show;
} }
[HttpPost("edit/{slug}")]
[Authorize(Policy="Write")]
public async Task<IActionResult> EditShow(string slug, [FromBody] Show show)
{
if (!ModelState.IsValid)
return BadRequest(show);
Show old = _database.Shows.AsNoTracking().FirstOrDefault(x => x.Slug == slug); [HttpPost]
[Authorize(Policy="Write")]
public async Task<ActionResult<Show>> CreateShow([FromBody] Show show)
{
try
{
return await _shows.Create(show);
}
catch (DuplicatedItemException)
{
Show existing = await _shows.Get(show.Slug);
return Conflict(existing);
}
}
[HttpPut("{slug}")]
[Authorize(Policy="Write")]
public async Task<ActionResult<Show>> EditShow(string slug, [FromQuery] bool resetOld, [FromBody] Show show)
{
Show old = await _shows.Get(slug);
if (old == null) if (old == null)
return NotFound(); return NotFound();
show.ID = old.ID; show.ID = old.ID;
show.Slug = slug;
show.Path = old.Path; show.Path = old.Path;
await _libraryManager.EditShow(show, false); return await _shows.Edit(show, resetOld);
}
[HttpDelete("{slug}")]
// [Authorize(Policy="Write")]
public async Task<IActionResult> DeleteShow(string slug)
{
try
{
await _shows.Delete(slug);
}
catch (ItemNotFound)
{
return NotFound();
}
return Ok();
}
[HttpDelete("{id}")]
// [Authorize(Policy="Write")]
public async Task<IActionResult> DeleteShow(int id)
{
try
{
await _shows.Delete(id);
}
catch (ItemNotFound)
{
return NotFound();
}
return Ok(); return Ok();
} }

View File

@ -8,7 +8,7 @@ using Kyoo.Controllers;
using Kyoo.Models.Watch; using Kyoo.Models.Watch;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
namespace Kyoo.Api namespace Kyoo.API
{ {
[Route("[controller]")] [Route("[controller]")]
[ApiController] [ApiController]
@ -33,7 +33,7 @@ namespace Kyoo.Api
string identifier, string identifier,
string extension) string extension)
{ {
string languageTag = identifier.Length == 3 ? identifier.Substring(0, 3) : null; string languageTag = identifier.Length >= 3 ? identifier.Substring(0, 3) : null;
bool forced = identifier.Length > 4 && identifier.Substring(4) == "forced"; bool forced = identifier.Length > 4 && identifier.Substring(4) == "forced";
Track subtitle = null; Track subtitle = null;

View File

@ -2,7 +2,7 @@
using Kyoo.Controllers; using Kyoo.Controllers;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
namespace Kyoo.Api namespace Kyoo.API
{ {
[Route("api/[controller]")] [Route("api/[controller]")]
[ApiController] [ApiController]

View File

@ -5,7 +5,7 @@ using System.Threading.Tasks;
using Kyoo.Controllers; using Kyoo.Controllers;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
namespace Kyoo.Api namespace Kyoo.API
{ {
public class ThumbnailController : ControllerBase public class ThumbnailController : ControllerBase
{ {

View File

@ -6,7 +6,7 @@ using System.IO;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
namespace Kyoo.Api namespace Kyoo.API
{ {
[Route("[controller]")] [Route("[controller]")]
[ApiController] [ApiController]

View File

@ -4,7 +4,7 @@ using Kyoo.Models;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
namespace Kyoo.Api namespace Kyoo.API
{ {
[Route("api/[controller]")] [Route("api/[controller]")]
[ApiController] [ApiController]