Adding a security for only int resources & adding a silent fail

This commit is contained in:
Zoe Roux 2020-09-21 00:36:22 +02:00
parent 522d253e9c
commit 5a1826d01d
19 changed files with 176 additions and 148 deletions

View File

@ -93,6 +93,19 @@ namespace Kyoo.Controllers
Task<T> Create([NotNull] T obj); Task<T> Create([NotNull] T obj);
Task<T> CreateIfNotExists([NotNull] T obj); Task<T> CreateIfNotExists([NotNull] T obj);
Task<T> CreateIfNotExists([NotNull] T obj, bool silentFail)
{
try
{
return CreateIfNotExists(obj);
}
catch
{
if (!silentFail)
throw;
return null;
}
}
Task<T> Edit([NotNull] T edited, bool resetOld); Task<T> Edit([NotNull] T edited, bool resetOld);
Task Delete(int id); Task Delete(int id);

View File

@ -28,11 +28,11 @@ namespace Kyoo.CommonApi
[JsonDetailed] [JsonDetailed]
public virtual async Task<ActionResult<T>> Get(int id) public virtual async Task<ActionResult<T>> Get(int id)
{ {
T ressource = await _repository.Get(id); T resource = await _repository.Get(id);
if (ressource == null) if (resource == null)
return NotFound(); return NotFound();
return ressource; return resource;
} }
[HttpGet("{slug}")] [HttpGet("{slug}")]
@ -60,11 +60,11 @@ namespace Kyoo.CommonApi
try try
{ {
ICollection<T> ressources = await _repository.GetAll(ApiHelper.ParseWhere<T>(where), ICollection<T> resources = await _repository.GetAll(ApiHelper.ParseWhere<T>(where),
new Sort<T>(sortBy), new Sort<T>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ArgumentException ex) catch (ArgumentException ex)
{ {
@ -72,10 +72,10 @@ namespace Kyoo.CommonApi
} }
} }
protected Page<TResult> Page<TResult>(ICollection<TResult> ressources, int limit) protected Page<TResult> Page<TResult>(ICollection<TResult> resources, int limit)
where TResult : IResource where TResult : IResource
{ {
return new Page<TResult>(ressources, return new Page<TResult>(resources,
_baseURL + Request.Path, _baseURL + Request.Path,
Request.Query.ToDictionary(x => x.Key, x => x.Value.ToString(), StringComparer.InvariantCultureIgnoreCase), Request.Query.ToDictionary(x => x.Key, x => x.Value.ToString(), StringComparer.InvariantCultureIgnoreCase),
limit); limit);
@ -83,11 +83,11 @@ namespace Kyoo.CommonApi
[HttpPost] [HttpPost]
[Authorize(Policy = "Write")] [Authorize(Policy = "Write")]
public virtual async Task<ActionResult<T>> Create([FromBody] T ressource) public virtual async Task<ActionResult<T>> Create([FromBody] T resource)
{ {
try try
{ {
return await _repository.Create(ressource); return await _repository.Create(resource);
} }
catch (ArgumentException ex) catch (ArgumentException ex)
{ {
@ -95,34 +95,34 @@ namespace Kyoo.CommonApi
} }
catch (DuplicatedItemException) catch (DuplicatedItemException)
{ {
T existing = await _repository.Get(ressource.Slug); T existing = await _repository.Get(resource.Slug);
return Conflict(existing); return Conflict(existing);
} }
} }
[HttpPut] [HttpPut]
[Authorize(Policy = "Write")] [Authorize(Policy = "Write")]
public virtual async Task<ActionResult<T>> Edit([FromQuery] bool resetOld, [FromBody] T ressource) public virtual async Task<ActionResult<T>> Edit([FromQuery] bool resetOld, [FromBody] T resource)
{ {
if (ressource.ID > 0) if (resource.ID > 0)
return await _repository.Edit(ressource, resetOld); return await _repository.Edit(resource, resetOld);
T old = await _repository.Get(ressource.Slug); T old = await _repository.Get(resource.Slug);
if (old == null) if (old == null)
return NotFound(); return NotFound();
ressource.ID = old.ID; resource.ID = old.ID;
return await _repository.Edit(ressource, resetOld); return await _repository.Edit(resource, resetOld);
} }
[HttpPut("{id:int}")] [HttpPut("{id:int}")]
[Authorize(Policy = "Write")] [Authorize(Policy = "Write")]
public virtual async Task<ActionResult<T>> Edit(int id, [FromQuery] bool resetOld, [FromBody] T ressource) public virtual async Task<ActionResult<T>> Edit(int id, [FromQuery] bool resetOld, [FromBody] T resource)
{ {
ressource.ID = id; resource.ID = id;
try try
{ {
return await _repository.Edit(ressource, resetOld); return await _repository.Edit(resource, resetOld);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -132,13 +132,13 @@ namespace Kyoo.CommonApi
[HttpPut("{slug}")] [HttpPut("{slug}")]
[Authorize(Policy = "Write")] [Authorize(Policy = "Write")]
public virtual async Task<ActionResult<T>> Edit(string slug, [FromQuery] bool resetOld, [FromBody] T ressource) public virtual async Task<ActionResult<T>> Edit(string slug, [FromQuery] bool resetOld, [FromBody] T resource)
{ {
T old = await _repository.Get(slug); T old = await _repository.Get(slug);
if (old == null) if (old == null)
return NotFound(); return NotFound();
ressource.ID = old.ID; resource.ID = old.ID;
return await _repository.Edit(ressource, resetOld); return await _repository.Edit(resource, resetOld);
} }
[HttpDelete("{id:int}")] [HttpDelete("{id:int}")]

View File

@ -138,7 +138,7 @@ namespace Kyoo.Controllers
T old = await Get(edited.Slug); T old = await Get(edited.Slug);
if (old == null) if (old == null)
throw new ItemNotFound($"No ressource found with the slug {edited.Slug}."); throw new ItemNotFound($"No resource found with the slug {edited.Slug}.");
if (resetOld) if (resetOld)
Utility.Nullify(old); Utility.Nullify(old);
@ -148,34 +148,49 @@ namespace Kyoo.Controllers
return old; return old;
} }
protected virtual Task Validate(T ressource) protected virtual Task Validate(T resource)
{ {
if (ressource.Slug == null) if (string.IsNullOrEmpty(resource.Slug))
throw new ArgumentException("Ressource can't have null as a slug."); throw new ArgumentException("Resource can't have null as a slug.");
if (int.TryParse(resource.Slug, out int _))
{
try
{
MethodInfo setter = typeof(T).GetProperty(nameof(resource.Slug))!.GetSetMethod();
if (setter != null)
setter.Invoke(resource, new object[] {resource.Slug + '!'});
else
throw new ArgumentException("Resources slug can't be number only.");
}
catch
{
throw new ArgumentException("Resources slug can't be number only.");
}
}
foreach (PropertyInfo property in typeof(T).GetProperties() foreach (PropertyInfo property in typeof(T).GetProperties()
.Where(x => typeof(IEnumerable).IsAssignableFrom(x.PropertyType) .Where(x => typeof(IEnumerable).IsAssignableFrom(x.PropertyType)
&& !typeof(string).IsAssignableFrom(x.PropertyType))) && !typeof(string).IsAssignableFrom(x.PropertyType)))
{ {
object value = property.GetValue(ressource); object value = property.GetValue(resource);
if (value is ICollection || value == null) if (value is ICollection || value == null)
continue; continue;
value = Utility.RunGenericMethod(typeof(Enumerable), "ToList", Utility.GetEnumerableType((IEnumerable)value), value); value = Utility.RunGenericMethod(typeof(Enumerable), "ToList", Utility.GetEnumerableType((IEnumerable)value), value);
property.SetValue(ressource, value); property.SetValue(resource, value);
} }
return Task.CompletedTask; return Task.CompletedTask;
} }
public virtual async Task Delete(int id) public virtual async Task Delete(int id)
{ {
T ressource = await Get(id); T resource = await Get(id);
await Delete(ressource); await Delete(resource);
} }
public virtual async Task Delete(string slug) public virtual async Task Delete(string slug)
{ {
T ressource = await Get(slug); T resource = await Get(slug);
await Delete(ressource); await Delete(resource);
} }
public abstract Task Delete(T obj); public abstract Task Delete(T obj);

View File

@ -110,17 +110,17 @@ namespace Kyoo.Controllers
return obj; return obj;
} }
protected override async Task Validate(Episode obj) protected override async Task Validate(Episode resource)
{ {
if (obj.ShowID <= 0) if (resource.ShowID <= 0)
throw new InvalidOperationException($"Can't store an episode not related to any show (showID: {obj.ShowID})."); throw new InvalidOperationException($"Can't store an episode not related to any show (showID: {resource.ShowID}).");
await base.Validate(obj); await base.Validate(resource);
if (obj.ExternalIDs != null) if (resource.ExternalIDs != null)
{ {
foreach (MetadataID link in obj.ExternalIDs) foreach (MetadataID link in resource.ExternalIDs)
link.Provider = await _providers.CreateIfNotExists(link.Provider); link.Provider = await _providers.CreateIfNotExists(link.Provider, true);
} }
} }

View File

@ -94,7 +94,7 @@ namespace Kyoo.Controllers
public override Task<LibraryItem> Create(LibraryItem obj) => throw new InvalidOperationException(); public override Task<LibraryItem> Create(LibraryItem obj) => throw new InvalidOperationException();
public override Task<LibraryItem> CreateIfNotExists(LibraryItem obj) => throw new InvalidOperationException(); public override Task<LibraryItem> CreateIfNotExists(LibraryItem obj) => throw new InvalidOperationException();
public override Task<LibraryItem> Edit(LibraryItem obj, bool reset) => throw new InvalidOperationException(); public override Task<LibraryItem> Edit(LibraryItem obj, bool reset) => throw new InvalidOperationException();
protected override Task Validate(LibraryItem obj) => throw new InvalidOperationException(); protected override Task Validate(LibraryItem resource) => throw new InvalidOperationException();
public override Task Delete(int id) => throw new InvalidOperationException(); public override Task Delete(int id) => throw new InvalidOperationException();
public override Task Delete(string slug) => throw new InvalidOperationException(); public override Task Delete(string slug) => throw new InvalidOperationException();
public override Task Delete(LibraryItem obj) => throw new InvalidOperationException(); public override Task Delete(LibraryItem obj) => throw new InvalidOperationException();

View File

@ -63,20 +63,20 @@ namespace Kyoo.Controllers
return obj; return obj;
} }
protected override async Task Validate(LibraryDE obj) protected override async Task Validate(LibraryDE resource)
{ {
if (string.IsNullOrEmpty(obj.Slug)) if (string.IsNullOrEmpty(resource.Slug))
throw new ArgumentException("The library's slug must be set and not empty"); throw new ArgumentException("The library's slug must be set and not empty");
if (string.IsNullOrEmpty(obj.Name)) if (string.IsNullOrEmpty(resource.Name))
throw new ArgumentException("The library's name must be set and not empty"); throw new ArgumentException("The library's name must be set and not empty");
if (obj.Paths == null || !obj.Paths.Any()) if (resource.Paths == null || !resource.Paths.Any())
throw new ArgumentException("The library should have a least one path."); throw new ArgumentException("The library should have a least one path.");
await base.Validate(obj); await base.Validate(resource);
if (obj.ProviderLinks != null) if (resource.ProviderLinks != null)
foreach (ProviderLink link in obj.ProviderLinks) foreach (ProviderLink link in resource.ProviderLinks)
link.Provider = await _providers.CreateIfNotExists(link.Provider); link.Provider = await _providers.CreateIfNotExists(link.Provider, true);
} }
public override async Task Delete(LibraryDE obj) public override async Task Delete(LibraryDE obj)

View File

@ -69,13 +69,13 @@ namespace Kyoo.Controllers
return obj; return obj;
} }
protected override async Task Validate(People obj) protected override async Task Validate(People resource)
{ {
await base.Validate(obj); await base.Validate(resource);
if (obj.ExternalIDs != null) if (resource.ExternalIDs != null)
foreach (MetadataID link in obj.ExternalIDs) foreach (MetadataID link in resource.ExternalIDs)
link.Provider = await _providers.CreateIfNotExists(link.Provider); link.Provider = await _providers.CreateIfNotExists(link.Provider, true);
} }
public override async Task Delete(People obj) public override async Task Delete(People obj)

View File

@ -94,17 +94,17 @@ namespace Kyoo.Controllers
return obj; return obj;
} }
protected override async Task Validate(Season obj) protected override async Task Validate(Season resource)
{ {
if (obj.ShowID <= 0) if (resource.ShowID <= 0)
throw new InvalidOperationException($"Can't store a season not related to any show (showID: {obj.ShowID})."); throw new InvalidOperationException($"Can't store a season not related to any show (showID: {resource.ShowID}).");
await base.Validate(obj); await base.Validate(resource);
if (obj.ExternalIDs != null) if (resource.ExternalIDs != null)
{ {
foreach (MetadataID link in obj.ExternalIDs) foreach (MetadataID link in resource.ExternalIDs)
link.Provider = await _providers.CreateIfNotExists(link.Provider); link.Provider = await _providers.CreateIfNotExists(link.Provider, true);
} }
} }

View File

@ -106,24 +106,24 @@ namespace Kyoo.Controllers
return obj; return obj;
} }
protected override async Task Validate(ShowDE obj) protected override async Task Validate(ShowDE resource)
{ {
await base.Validate(obj); await base.Validate(resource);
if (obj.Studio != null) if (resource.Studio != null)
obj.Studio = await _studios.CreateIfNotExists(obj.Studio); resource.Studio = await _studios.CreateIfNotExists(resource.Studio, true);
if (obj.GenreLinks != null) if (resource.GenreLinks != null)
foreach (GenreLink link in obj.GenreLinks) foreach (GenreLink link in resource.GenreLinks)
link.Genre = await _genres.CreateIfNotExists(link.Genre); link.Genre = await _genres.CreateIfNotExists(link.Genre, true);
if (obj.People != null) if (resource.People != null)
foreach (PeopleRole link in obj.People) foreach (PeopleRole link in resource.People)
link.People = await _people.CreateIfNotExists(link.People); link.People = await _people.CreateIfNotExists(link.People, true);
if (obj.ExternalIDs != null) if (resource.ExternalIDs != null)
foreach (MetadataID link in obj.ExternalIDs) foreach (MetadataID link in resource.ExternalIDs)
link.Provider = await _providers.CreateIfNotExists(link.Provider); link.Provider = await _providers.CreateIfNotExists(link.Provider, true);
} }
public async Task AddShowLink(int showID, int? libraryID, int? collectionID) public async Task AddShowLink(int showID, int? libraryID, int? collectionID)

View File

@ -75,7 +75,7 @@ namespace Kyoo.Controllers
return obj; return obj;
} }
protected override Task Validate(Track ressource) protected override Task Validate(Track resource)
{ {
return Task.CompletedTask; return Task.CompletedTask;
} }

View File

@ -40,12 +40,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Show> ressources = await _libraryManager.GetShows( ICollection<Show> resources = await _libraryManager.GetShows(
ApiHelper.ParseWhere<Show>(where, x => x.Collections.Any(y => y.ID == id)), ApiHelper.ParseWhere<Show>(where, x => x.Collections.Any(y => y.ID == id)),
new Sort<Show>(sortBy), new Sort<Show>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -72,12 +72,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Show> ressources = await _libraryManager.GetShows( ICollection<Show> resources = await _libraryManager.GetShows(
ApiHelper.ParseWhere<Show>(where, x => x.Collections.Any(y => y.Slug == slug)), ApiHelper.ParseWhere<Show>(where, x => x.Collections.Any(y => y.Slug == slug)),
new Sort<Show>(sortBy), new Sort<Show>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -104,12 +104,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Library> ressources = await _libraryManager.GetLibraries( ICollection<Library> resources = await _libraryManager.GetLibraries(
ApiHelper.ParseWhere<Library>(where, x => x.Collections.Any(y => y.ID == id)), ApiHelper.ParseWhere<Library>(where, x => x.Collections.Any(y => y.ID == id)),
new Sort<Library>(sortBy), new Sort<Library>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -136,12 +136,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Library> ressources = await _libraryManager.GetLibraries( ICollection<Library> resources = await _libraryManager.GetLibraries(
ApiHelper.ParseWhere<Library>(where, x => x.Collections.Any(y => y.Slug == slug)), ApiHelper.ParseWhere<Library>(where, x => x.Collections.Any(y => y.Slug == slug)),
new Sort<Library>(sortBy), new Sort<Library>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {

View File

@ -82,12 +82,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Track> ressources = await _libraryManager.GetTracks( ICollection<Track> resources = await _libraryManager.GetTracks(
ApiHelper.ParseWhere<Track>(where, x => x.Episode.ID == episodeID), ApiHelper.ParseWhere<Track>(where, x => x.Episode.ID == episodeID),
new Sort<Track>(sortBy), new Sort<Track>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -116,14 +116,14 @@ namespace Kyoo.Api
try try
{ {
ICollection<Track> ressources = await _libraryManager.GetTracks( ICollection<Track> resources = await _libraryManager.GetTracks(
ApiHelper.ParseWhere<Track>(where, x => x.Episode.ShowID == showID ApiHelper.ParseWhere<Track>(where, x => x.Episode.ShowID == showID
&& x.Episode.SeasonNumber == seasonNumber && x.Episode.SeasonNumber == seasonNumber
&& x.Episode.EpisodeNumber == episodeNumber), && x.Episode.EpisodeNumber == episodeNumber),
new Sort<Track>(sortBy), new Sort<Track>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -152,13 +152,13 @@ namespace Kyoo.Api
try try
{ {
ICollection<Track> ressources = await _libraryManager.GetTracks(ApiHelper.ParseWhere<Track>(where, x => x.Episode.Show.Slug == showSlug ICollection<Track> resources = await _libraryManager.GetTracks(ApiHelper.ParseWhere<Track>(where, x => x.Episode.Show.Slug == showSlug
&& x.Episode.SeasonNumber == seasonNumber && x.Episode.SeasonNumber == seasonNumber
&& x.Episode.EpisodeNumber == episodeNumber), && x.Episode.EpisodeNumber == episodeNumber),
new Sort<Track>(sortBy), new Sort<Track>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {

View File

@ -40,14 +40,14 @@ namespace Kyoo.Api
try try
{ {
ICollection<Show> ressources = await _libraryManager.GetShows( ICollection<Show> resources = await _libraryManager.GetShows(
ApiHelper.ParseWhere<Show>(where, x => x.Genres.Any(y => y.ID == id)), ApiHelper.ParseWhere<Show>(where, x => x.Genres.Any(y => y.ID == id)),
new Sort<Show>(sortBy), new Sort<Show>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
if (!ressources.Any() && await _libraryManager.GetGenre(id) == null) if (!resources.Any() && await _libraryManager.GetGenre(id) == null)
return NotFound(); return NotFound();
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -74,14 +74,14 @@ namespace Kyoo.Api
try try
{ {
ICollection<Show> ressources = await _libraryManager.GetShows( ICollection<Show> resources = await _libraryManager.GetShows(
ApiHelper.ParseWhere<Show>(where, x => x.Genres.Any(y => y.Slug == slug)), ApiHelper.ParseWhere<Show>(where, x => x.Genres.Any(y => y.Slug == slug)),
new Sort<Show>(sortBy), new Sort<Show>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
if (!ressources.Any() && await _libraryManager.GetGenre(slug) == null) if (!resources.Any() && await _libraryManager.GetGenre(slug) == null)
return NotFound(); return NotFound();
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {

View File

@ -28,9 +28,9 @@ namespace Kyoo.Api
} }
[Authorize(Policy = "Admin")] [Authorize(Policy = "Admin")]
public override async Task<ActionResult<Library>> Create(Library ressource) public override async Task<ActionResult<Library>> Create(Library resource)
{ {
ActionResult<Library> result = await base.Create(ressource); ActionResult<Library> result = await base.Create(resource);
if (result.Value != null) if (result.Value != null)
_taskManager.StartTask("scan", result.Value.Slug); _taskManager.StartTask("scan", result.Value.Slug);
return result; return result;
@ -51,12 +51,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Show> ressources = await _libraryManager.GetShows( ICollection<Show> resources = await _libraryManager.GetShows(
ApiHelper.ParseWhere<Show>(where, x => x.Libraries.Any(y => y.ID == id)), ApiHelper.ParseWhere<Show>(where, x => x.Libraries.Any(y => y.ID == id)),
new Sort<Show>(sortBy), new Sort<Show>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -83,12 +83,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Show> ressources = await _libraryManager.GetShows( ICollection<Show> resources = await _libraryManager.GetShows(
ApiHelper.ParseWhere<Show>(where, x => x.Libraries.Any(y => y.Slug == slug)), ApiHelper.ParseWhere<Show>(where, x => x.Libraries.Any(y => y.Slug == slug)),
new Sort<Show>(sortBy), new Sort<Show>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -115,12 +115,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Collection> ressources = await _libraryManager.GetCollections( ICollection<Collection> resources = await _libraryManager.GetCollections(
ApiHelper.ParseWhere<Collection>(where, x => x.Libraries.Any(y => y.ID == id)), ApiHelper.ParseWhere<Collection>(where, x => x.Libraries.Any(y => y.ID == id)),
new Sort<Collection>(sortBy), new Sort<Collection>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -147,12 +147,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Collection> ressources = await _libraryManager.GetCollections( ICollection<Collection> resources = await _libraryManager.GetCollections(
ApiHelper.ParseWhere<Collection>(where, x => x.Libraries.Any(y => y.Slug == slug)), ApiHelper.ParseWhere<Collection>(where, x => x.Libraries.Any(y => y.Slug == slug)),
new Sort<Collection>(sortBy), new Sort<Collection>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -179,12 +179,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<LibraryItem> ressources = await _libraryManager.GetItemsFromLibrary(id, ICollection<LibraryItem> resources = await _libraryManager.GetItemsFromLibrary(id,
ApiHelper.ParseWhere<LibraryItem>(where), ApiHelper.ParseWhere<LibraryItem>(where),
new Sort<LibraryItem>(sortBy), new Sort<LibraryItem>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -211,12 +211,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<LibraryItem> ressources = await _libraryManager.GetItemsFromLibrary(slug, ICollection<LibraryItem> resources = await _libraryManager.GetItemsFromLibrary(slug,
ApiHelper.ParseWhere<LibraryItem>(where), ApiHelper.ParseWhere<LibraryItem>(where),
new Sort<LibraryItem>(sortBy), new Sort<LibraryItem>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {

View File

@ -40,12 +40,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<LibraryItem> ressources = await _libraryItems.GetAll( ICollection<LibraryItem> resources = await _libraryItems.GetAll(
ApiHelper.ParseWhere<LibraryItem>(where), ApiHelper.ParseWhere<LibraryItem>(where),
new Sort<LibraryItem>(sortBy), new Sort<LibraryItem>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return new Page<LibraryItem>(ressources, return new Page<LibraryItem>(resources,
_baseURL + Request.Path, _baseURL + Request.Path,
Request.Query.ToDictionary(x => x.Key, x => x.Value.ToString(), StringComparer.InvariantCultureIgnoreCase), Request.Query.ToDictionary(x => x.Key, x => x.Value.ToString(), StringComparer.InvariantCultureIgnoreCase),
limit); limit);

View File

@ -73,12 +73,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<ShowRole> ressources = await _libraryManager.GetRolesFromPeople(slug, ICollection<ShowRole> resources = await _libraryManager.GetRolesFromPeople(slug,
ApiHelper.ParseWhere<ShowRole>(where), ApiHelper.ParseWhere<ShowRole>(where),
new Sort<ShowRole>(sortBy), new Sort<ShowRole>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {

View File

@ -40,12 +40,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Episode> ressources = await _libraryManager.GetEpisodes( ICollection<Episode> resources = await _libraryManager.GetEpisodes(
ApiHelper.ParseWhere<Episode>(where, x => x.SeasonID == seasonID), ApiHelper.ParseWhere<Episode>(where, x => x.SeasonID == seasonID),
new Sort<Episode>(sortBy), new Sort<Episode>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -73,13 +73,13 @@ namespace Kyoo.Api
try try
{ {
ICollection<Episode> ressources = await _libraryManager.GetEpisodes( ICollection<Episode> resources = await _libraryManager.GetEpisodes(
ApiHelper.ParseWhere<Episode>(where, x => x.Show.Slug == showSlug ApiHelper.ParseWhere<Episode>(where, x => x.Show.Slug == showSlug
&& x.SeasonNumber == seasonNumber), && x.SeasonNumber == seasonNumber),
new Sort<Episode>(sortBy), new Sort<Episode>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -107,12 +107,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Episode> ressources = await _libraryManager.GetEpisodes( ICollection<Episode> resources = await _libraryManager.GetEpisodes(
ApiHelper.ParseWhere<Episode>(where, x => x.ShowID == showID && x.SeasonNumber == seasonNumber), ApiHelper.ParseWhere<Episode>(where, x => x.ShowID == showID && x.SeasonNumber == seasonNumber),
new Sort<Episode>(sortBy), new Sort<Episode>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {

View File

@ -40,12 +40,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Season> ressources = await _libraryManager.GetSeasons( ICollection<Season> resources = await _libraryManager.GetSeasons(
ApiHelper.ParseWhere<Season>(where, x => x.ShowID == showID), ApiHelper.ParseWhere<Season>(where, x => x.ShowID == showID),
new Sort<Season>(sortBy), new Sort<Season>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -72,12 +72,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Season> ressources = await _libraryManager.GetSeasons( ICollection<Season> resources = await _libraryManager.GetSeasons(
ApiHelper.ParseWhere<Season>(where, x => x.Show.Slug == slug), ApiHelper.ParseWhere<Season>(where, x => x.Show.Slug == slug),
new Sort<Season>(sortBy), new Sort<Season>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -104,12 +104,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Episode> ressources = await _libraryManager.GetEpisodes( ICollection<Episode> resources = await _libraryManager.GetEpisodes(
ApiHelper.ParseWhere<Episode>(where, x => x.ShowID == showID), ApiHelper.ParseWhere<Episode>(where, x => x.ShowID == showID),
new Sort<Episode>(sortBy), new Sort<Episode>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -136,12 +136,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Episode> ressources = await _libraryManager.GetEpisodes( ICollection<Episode> resources = await _libraryManager.GetEpisodes(
ApiHelper.ParseWhere<Episode>(where, x => x.Show.Slug == slug), ApiHelper.ParseWhere<Episode>(where, x => x.Show.Slug == slug),
new Sort<Episode>(sortBy), new Sort<Episode>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -167,12 +167,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<PeopleRole> ressources = await _libraryManager.GetPeopleFromShow(showID, ICollection<PeopleRole> resources = await _libraryManager.GetPeopleFromShow(showID,
ApiHelper.ParseWhere<PeopleRole>(where), ApiHelper.ParseWhere<PeopleRole>(where),
new Sort<PeopleRole>(sortBy), new Sort<PeopleRole>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -198,12 +198,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<PeopleRole> ressources = await _libraryManager.GetPeopleFromShow(slug, ICollection<PeopleRole> resources = await _libraryManager.GetPeopleFromShow(slug,
ApiHelper.ParseWhere<PeopleRole>(where), ApiHelper.ParseWhere<PeopleRole>(where),
new Sort<PeopleRole>(sortBy), new Sort<PeopleRole>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -230,12 +230,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Genre> ressources = await _libraryManager.GetGenres( ICollection<Genre> resources = await _libraryManager.GetGenres(
ApiHelper.ParseWhere<Genre>(where, x => x.Shows.Any(y => y.ID == showID)), ApiHelper.ParseWhere<Genre>(where, x => x.Shows.Any(y => y.ID == showID)),
new Sort<Genre>(sortBy), new Sort<Genre>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -262,12 +262,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Genre> ressources = await _libraryManager.GetGenres( ICollection<Genre> resources = await _libraryManager.GetGenres(
ApiHelper.ParseWhere<Genre>(where, x => x.Shows.Any(y => y.Slug == slug)), ApiHelper.ParseWhere<Genre>(where, x => x.Shows.Any(y => y.Slug == slug)),
new Sort<Genre>(sortBy), new Sort<Genre>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -322,12 +322,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Library> ressources = await _libraryManager.GetLibraries( ICollection<Library> resources = await _libraryManager.GetLibraries(
ApiHelper.ParseWhere<Library>(where, x => x.Shows.Any(y => y.ID == showID)), ApiHelper.ParseWhere<Library>(where, x => x.Shows.Any(y => y.ID == showID)),
new Sort<Library>(sortBy), new Sort<Library>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -354,12 +354,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Library> ressources = await _libraryManager.GetLibraries( ICollection<Library> resources = await _libraryManager.GetLibraries(
ApiHelper.ParseWhere<Library>(where, x => x.Shows.Any(y => y.Slug == slug)), ApiHelper.ParseWhere<Library>(where, x => x.Shows.Any(y => y.Slug == slug)),
new Sort<Library>(sortBy), new Sort<Library>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -386,12 +386,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Collection> ressources = await _libraryManager.GetCollections( ICollection<Collection> resources = await _libraryManager.GetCollections(
ApiHelper.ParseWhere<Collection>(where, x => x.Shows.Any(y => y.ID == showID)), ApiHelper.ParseWhere<Collection>(where, x => x.Shows.Any(y => y.ID == showID)),
new Sort<Collection>(sortBy), new Sort<Collection>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -418,12 +418,12 @@ namespace Kyoo.Api
try try
{ {
ICollection<Collection> ressources = await _libraryManager.GetCollections( ICollection<Collection> resources = await _libraryManager.GetCollections(
ApiHelper.ParseWhere<Collection>(where, x => x.Shows.Any(y => y.Slug == slug)), ApiHelper.ParseWhere<Collection>(where, x => x.Shows.Any(y => y.Slug == slug)),
new Sort<Collection>(sortBy), new Sort<Collection>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {

View File

@ -40,14 +40,14 @@ namespace Kyoo.Api
try try
{ {
ICollection<Show> ressources = await _libraryManager.GetShows( ICollection<Show> resources = await _libraryManager.GetShows(
ApiHelper.ParseWhere<Show>(where, x => x.StudioID == id), ApiHelper.ParseWhere<Show>(where, x => x.StudioID == id),
new Sort<Show>(sortBy), new Sort<Show>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
if (!ressources.Any() && await _libraryManager.GetStudio(id) == null) if (!resources.Any() && await _libraryManager.GetStudio(id) == null)
return NotFound(); return NotFound();
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {
@ -74,14 +74,14 @@ namespace Kyoo.Api
try try
{ {
ICollection<Show> ressources = await _libraryManager.GetShows( ICollection<Show> resources = await _libraryManager.GetShows(
ApiHelper.ParseWhere<Show>(where, x => x.Studio.Slug == slug), ApiHelper.ParseWhere<Show>(where, x => x.Studio.Slug == slug),
new Sort<Show>(sortBy), new Sort<Show>(sortBy),
new Pagination(limit, afterID)); new Pagination(limit, afterID));
if (!ressources.Any() && await _libraryManager.GetStudio(slug) == null) if (!resources.Any() && await _libraryManager.GetStudio(slug) == null)
return NotFound(); return NotFound();
return Page(ressources, limit); return Page(resources, limit);
} }
catch (ItemNotFound) catch (ItemNotFound)
{ {