From fb14eb4ef25623b8b967b074ef8f1f230f7ada8a Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Fri, 11 Sep 2020 00:35:21 +0200 Subject: [PATCH 1/7] Creating an expression rewritter that work with members --- Kyoo.Common/Controllers/IRepository.cs | 3 +- Kyoo.Common/ExpressionRewrite.cs | 46 +++++++++++++++++++ Kyoo.Common/Models/PeopleRole.cs | 2 + Kyoo.CommonAPI/ApiHelper.cs | 5 +- .../Repositories/PeopleRepository.cs | 20 -------- Kyoo/Models/Resources/CollectionDE.cs | 4 +- 6 files changed, 56 insertions(+), 24 deletions(-) create mode 100644 Kyoo.Common/ExpressionRewrite.cs diff --git a/Kyoo.Common/Controllers/IRepository.cs b/Kyoo.Common/Controllers/IRepository.cs index 62bf0250..47419e88 100644 --- a/Kyoo.Common/Controllers/IRepository.cs +++ b/Kyoo.Common/Controllers/IRepository.cs @@ -30,7 +30,7 @@ namespace Kyoo.Controllers public Sort(Expression> key, bool descendant = false) { - Key = key; + Key = ExpressionRewrite.Rewrite>(key); Descendant = descendant; if (Key == null || @@ -58,6 +58,7 @@ namespace Kyoo.Controllers Key = property.Type.IsValueType ? Expression.Lambda>(Expression.Convert(property, typeof(object)), param) : Expression.Lambda>(property, param); + Key = ExpressionRewrite.Rewrite>(Key); Descendant = order switch { diff --git a/Kyoo.Common/ExpressionRewrite.cs b/Kyoo.Common/ExpressionRewrite.cs new file mode 100644 index 00000000..fadc26b2 --- /dev/null +++ b/Kyoo.Common/ExpressionRewrite.cs @@ -0,0 +1,46 @@ +using System; +using System.Linq.Expressions; +using System.Reflection; + +namespace Kyoo +{ + public class ExpressionRewriteAttribute : Attribute + { + public string Link { get; } + public string Inner { get; } + + public ExpressionRewriteAttribute(string link, string inner = null) + { + Link = link; + Inner = inner; + } + } + + public class ExpressionRewrite : ExpressionVisitor + { + public static Expression Rewrite(Expression expression) + { + return new ExpressionRewrite().Visit(expression); + } + + public static Expression Rewrite(Expression expression) where T : Delegate + { + return (Expression)new ExpressionRewrite().Visit(expression); + } + + protected override Expression VisitMember(MemberExpression node) + { + ExpressionRewriteAttribute attr = node.Member.GetCustomAttribute(); + if (attr == null) + return base.VisitMember(node); + + Expression property = node.Expression; + foreach (string child in attr.Link.Split('.')) + property = Expression.Property(property, child); + + if (property is MemberExpression member) + Visit(member.Expression); + return property; + } + } +} \ No newline at end of file diff --git a/Kyoo.Common/Models/PeopleRole.cs b/Kyoo.Common/Models/PeopleRole.cs index edb760b9..870309a8 100644 --- a/Kyoo.Common/Models/PeopleRole.cs +++ b/Kyoo.Common/Models/PeopleRole.cs @@ -11,12 +11,14 @@ namespace Kyoo.Models [JsonIgnore] public int PeopleID { get; set; } [JsonIgnore] public virtual People People { get; set; } + [ExpressionRewrite(nameof(People) + "." + nameof(Models.People.Slug))] public string Slug { get => People.Slug; set => People.Slug = value; } + [ExpressionRewrite(nameof(People) + "."+ nameof(Models.People.Name))] public string Name { get => People.Name; diff --git a/Kyoo.CommonAPI/ApiHelper.cs b/Kyoo.CommonAPI/ApiHelper.cs index 7db41430..55b43878 100644 --- a/Kyoo.CommonAPI/ApiHelper.cs +++ b/Kyoo.CommonAPI/ApiHelper.cs @@ -71,8 +71,9 @@ namespace Kyoo.CommonApi else expression = condition; } - - return Expression.Lambda>(expression!, param); + + expression = ExpressionRewrite.Rewrite(expression); + return Expression.Lambda>(expression, param); } private static Expression ContainsResourceExpression(MemberExpression xProperty, string value) diff --git a/Kyoo/Controllers/Repositories/PeopleRepository.cs b/Kyoo/Controllers/Repositories/PeopleRepository.cs index 9ef29490..8bf57f02 100644 --- a/Kyoo/Controllers/Repositories/PeopleRepository.cs +++ b/Kyoo/Controllers/Repositories/PeopleRepository.cs @@ -98,16 +98,6 @@ namespace Kyoo.Controllers Sort sort = default, Pagination limit = default) { - if (sort.Key?.Body is MemberExpression member) - { - sort.Key = member.Member.Name switch - { - "Name" => x => x.People.Name, - "Slug" => x => x.People.Slug, - _ => sort.Key - }; - } - ICollection people = await ApplyFilters(_database.PeopleRoles.Where(x => x.ShowID == showID), id => _database.PeopleRoles.FirstOrDefaultAsync(x => x.ID == id), x => x.People.Name, @@ -124,16 +114,6 @@ namespace Kyoo.Controllers Sort sort = default, Pagination limit = default) { - if (sort.Key?.Body is MemberExpression member) - { - sort.Key = member.Member.Name switch - { - "Name" => x => x.People.Name, - "Slug" => x => x.People.Slug, - _ => sort.Key - }; - } - ICollection people = await ApplyFilters(_database.PeopleRoles.Where(x => x.Show.Slug == showSlug), id => _database.PeopleRoles.FirstOrDefaultAsync(x => x.ID == id), x => x.People.Name, diff --git a/Kyoo/Models/Resources/CollectionDE.cs b/Kyoo/Models/Resources/CollectionDE.cs index 8235b993..e1368a0c 100644 --- a/Kyoo/Models/Resources/CollectionDE.cs +++ b/Kyoo/Models/Resources/CollectionDE.cs @@ -15,7 +15,9 @@ namespace Kyoo.Models } [JsonIgnore] [NotMergable] public virtual IEnumerable LibraryLinks { get; set; } - /*[ExpressionRewrite(x => x.LibraryLinks, y => y.Genre)]*/ public override IEnumerable Libraries + + [ExpressionRewrite(nameof(LibraryLinks), nameof(GenreLink.Genre))] + public override IEnumerable Libraries { get => LibraryLinks?.Select(x => x.Library); set => LibraryLinks = value?.Select(x => new LibraryLink(x, this)); From 75c9d703f74df7e4276f9e88f2c61daf6224deb9 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sat, 12 Sep 2020 00:49:28 +0200 Subject: [PATCH 2/7] Fixing the expression convertor for imbricked lambdas --- Kyoo.Common/Utility.cs | 18 +++++------------- Kyoo.CommonAPI/ApiHelper.cs | 2 ++ 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/Kyoo.Common/Utility.cs b/Kyoo.Common/Utility.cs index baeab0f2..2718ff98 100644 --- a/Kyoo.Common/Utility.cs +++ b/Kyoo.Common/Utility.cs @@ -342,26 +342,18 @@ namespace Kyoo } internal Expression VisitAndConvert() - { - return (Expression)RunGenericMethod( - this, - "VisitLambda", - _expression.GetType().GetGenericArguments().First(), - _expression); - } - - protected override Expression VisitLambda(Expression node) { Type returnType = _expression.Type.GetGenericArguments().Last(); - Expression body = node.ReturnType == returnType - ? Visit(node.Body) - : Expression.Convert(Visit(node.Body)!, returnType); + Expression body = _expression.ReturnType == returnType + ? Visit(_expression.Body) + : Expression.Convert(Visit(_expression.Body)!, returnType); return Expression.Lambda(body!, _newParams); } protected override Expression VisitParameter(ParameterExpression node) { - return _newParams.First(x => x.Name == node.Name); + Console.WriteLine($"Rewritting parameter: {node.Name}"); + return _newParams.FirstOrDefault(x => x.Name == node.Name) ?? node; } } } diff --git a/Kyoo.CommonAPI/ApiHelper.cs b/Kyoo.CommonAPI/ApiHelper.cs index 55b43878..9573f2b6 100644 --- a/Kyoo.CommonAPI/ApiHelper.cs +++ b/Kyoo.CommonAPI/ApiHelper.cs @@ -23,6 +23,8 @@ namespace Kyoo.CommonApi public static Expression> ParseWhere(Dictionary where, Expression> defaultWhere = null) { + return defaultWhere; + if (where == null || where.Count == 0) return defaultWhere; From ca05817144094cfe1c07100abb5b7ad53c2475f1 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sat, 12 Sep 2020 00:49:42 +0200 Subject: [PATCH 3/7] oups --- Kyoo.Common/Utility.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Kyoo.Common/Utility.cs b/Kyoo.Common/Utility.cs index 2718ff98..e1fbbad8 100644 --- a/Kyoo.Common/Utility.cs +++ b/Kyoo.Common/Utility.cs @@ -352,7 +352,6 @@ namespace Kyoo protected override Expression VisitParameter(ParameterExpression node) { - Console.WriteLine($"Rewritting parameter: {node.Name}"); return _newParams.FirstOrDefault(x => x.Name == node.Name) ?? node; } } From 8d10b44b1d2bf79589f1705a0e1a0f0936de5e34 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sat, 12 Sep 2020 00:50:01 +0200 Subject: [PATCH 4/7] oups --- Kyoo.CommonAPI/ApiHelper.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Kyoo.CommonAPI/ApiHelper.cs b/Kyoo.CommonAPI/ApiHelper.cs index 9573f2b6..55b43878 100644 --- a/Kyoo.CommonAPI/ApiHelper.cs +++ b/Kyoo.CommonAPI/ApiHelper.cs @@ -23,8 +23,6 @@ namespace Kyoo.CommonApi public static Expression> ParseWhere(Dictionary where, Expression> defaultWhere = null) { - return defaultWhere; - if (where == null || where.Count == 0) return defaultWhere; From c42805e4151856971468e905bc096a5dd4da4671 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sun, 13 Sep 2020 15:22:51 +0200 Subject: [PATCH 5/7] Adding inner rewrite for expression rewriter --- Kyoo.Common/ExpressionRewrite.cs | 82 ++++++++++++++++++++++++++++++-- Kyoo.Common/Utility.cs | 4 +- Kyoo.CommonAPI/ApiHelper.cs | 11 +++-- Kyoo/Models/Resources/GenreDE.cs | 1 + Kyoo/Models/Resources/ShowDE.cs | 1 + 5 files changed, 91 insertions(+), 8 deletions(-) diff --git a/Kyoo.Common/ExpressionRewrite.cs b/Kyoo.Common/ExpressionRewrite.cs index fadc26b2..c7db9636 100644 --- a/Kyoo.Common/ExpressionRewrite.cs +++ b/Kyoo.Common/ExpressionRewrite.cs @@ -1,4 +1,6 @@ using System; +using System.Collections.Generic; +using System.Linq; using System.Linq.Expressions; using System.Reflection; @@ -18,6 +20,14 @@ namespace Kyoo public class ExpressionRewrite : ExpressionVisitor { + private string _inner; + private readonly List<(string inner, ParameterExpression param, ParameterExpression newParam)> _innerRewrites; + + private ExpressionRewrite() + { + _innerRewrites = new List<(string, ParameterExpression, ParameterExpression)>(); + } + public static Expression Rewrite(Expression expression) { return new ExpressionRewrite().Visit(expression); @@ -30,17 +40,81 @@ namespace Kyoo protected override Expression VisitMember(MemberExpression node) { - ExpressionRewriteAttribute attr = node.Member.GetCustomAttribute(); + (string inner, _, ParameterExpression p) = _innerRewrites.FirstOrDefault(x => x.param == node.Expression); + if (inner != null) + { + Expression param = p; + foreach (string accessor in inner.Split('.')) + param = Expression.Property(param, accessor); + node = Expression.Property(param, node.Member.Name); + } + + // Can't use node.Member directly because we want to support attribute override + MemberInfo member = node.Expression.Type.GetProperty(node.Member.Name) ?? node.Member; + ExpressionRewriteAttribute attr = member!.GetCustomAttribute(); if (attr == null) return base.VisitMember(node); - + Expression property = node.Expression; foreach (string child in attr.Link.Split('.')) property = Expression.Property(property, child); - if (property is MemberExpression member) - Visit(member.Expression); + if (property is MemberExpression expr) + Visit(expr.Expression); + _inner = attr.Inner; return property; } + + protected override Expression VisitLambda(Expression node) + { + (_, ParameterExpression oldParam, ParameterExpression param) = _innerRewrites + .FirstOrDefault(x => node.Parameters.Any(y => y == x.param)); + if (param == null) + return base.VisitLambda(node); + + ParameterExpression[] newParams = node.Parameters.Where(x => x != oldParam).Append(param).ToArray(); + return Expression.Lambda(Visit(node.Body)!, newParams); + } + + protected override Expression VisitMethodCall(MethodCallExpression node) + { + int count = node.Arguments.Count; + if (node.Object != null) + count++; + if (count != 2) + return base.VisitMethodCall(node); + + Expression instance = node.Object ?? node.Arguments.First(); + Expression argument = node.Object != null + ? node.Arguments.First() + : node.Arguments[1]; + + Type oldType = instance.Type; + instance = Visit(instance); + if (instance!.Type == oldType) + return base.VisitMethodCall(node); + + if (_inner != null && argument is LambdaExpression lambda) + { + // TODO this type handler will usually work with IEnumerable & others but won't work with everything. + Type type = oldType.GetGenericArguments().First(); + ParameterExpression oldParam = lambda.Parameters.FirstOrDefault(x => x.Type == type); + if (oldParam != null) + { + Type newType = instance.Type.GetGenericArguments().First(); + ParameterExpression newParam = Expression.Parameter(newType, oldParam.Name); + _innerRewrites.Add((_inner, oldParam, newParam)); + } + } + argument = Visit(argument); + + // TODO this method handler may not work for some methods (ex: method taking a Fun<> method won't have good generic arguments) + MethodInfo method = node.Method.IsGenericMethod + ? node.Method.GetGenericMethodDefinition().MakeGenericMethod(instance.Type.GetGenericArguments()) + : node.Method; + return node.Object != null + ? Expression.Call(instance, method!, argument) + : Expression.Call(null, method!, instance, argument!); + } } } \ No newline at end of file diff --git a/Kyoo.Common/Utility.cs b/Kyoo.Common/Utility.cs index e1fbbad8..2922acec 100644 --- a/Kyoo.Common/Utility.cs +++ b/Kyoo.Common/Utility.cs @@ -309,12 +309,14 @@ namespace Kyoo public static Expression Convert([CanBeNull] this Expression expr) where T : Delegate { - return expr switch + Expression e = expr switch { null => null, LambdaExpression lambda => new ExpressionConverter(lambda).VisitAndConvert(), _ => throw new ArgumentException("Can't convert a non lambda.") }; + + return ExpressionRewrite.Rewrite(e); } private class ExpressionConverter : ExpressionVisitor diff --git a/Kyoo.CommonAPI/ApiHelper.cs b/Kyoo.CommonAPI/ApiHelper.cs index 55b43878..9ae0067a 100644 --- a/Kyoo.CommonAPI/ApiHelper.cs +++ b/Kyoo.CommonAPI/ApiHelper.cs @@ -24,9 +24,14 @@ namespace Kyoo.CommonApi Expression> defaultWhere = null) { if (where == null || where.Count == 0) - return defaultWhere; - - ParameterExpression param = Expression.Parameter(typeof(T)); + { + if (defaultWhere == null) + return null; + Expression body = ExpressionRewrite.Rewrite(defaultWhere.Body); + return Expression.Lambda>(body, defaultWhere.Parameters.First()); + } + + ParameterExpression param = defaultWhere?.Parameters.First() ?? Expression.Parameter(typeof(T)); Expression expression = defaultWhere?.Body; foreach ((string key, string desired) in where) diff --git a/Kyoo/Models/Resources/GenreDE.cs b/Kyoo/Models/Resources/GenreDE.cs index aceafb05..3d5172ab 100644 --- a/Kyoo/Models/Resources/GenreDE.cs +++ b/Kyoo/Models/Resources/GenreDE.cs @@ -9,6 +9,7 @@ namespace Kyoo.Models { [JsonIgnore] [NotMergable] public virtual IEnumerable Links { get; set; } + [ExpressionRewrite(nameof(Links), nameof(GenreLink.Genre))] [JsonIgnore] [NotMergable] public override IEnumerable Shows { get => Links?.Select(x => x.Show); diff --git a/Kyoo/Models/Resources/ShowDE.cs b/Kyoo/Models/Resources/ShowDE.cs index f0b0868a..7d43f25c 100644 --- a/Kyoo/Models/Resources/ShowDE.cs +++ b/Kyoo/Models/Resources/ShowDE.cs @@ -11,6 +11,7 @@ namespace Kyoo.Models public class ShowDE : Show { [JsonIgnore] [NotMergable] public virtual IEnumerable GenreLinks { get; set; } + [ExpressionRewrite(nameof(GenreLinks), nameof(GenreLink.Genre))] public override IEnumerable Genres { get => GenreLinks?.Select(x => x.Genre); From 3ad5096d21a637f826ca5ad1d7383e2001e8bb41 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sun, 13 Sep 2020 15:26:56 +0200 Subject: [PATCH 6/7] Adding expression rewrite attributes to every item's link --- Kyoo/Models/Resources/CollectionDE.cs | 1 + Kyoo/Models/Resources/LibraryDE.cs | 3 +++ Kyoo/Models/Resources/ShowDE.cs | 3 ++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Kyoo/Models/Resources/CollectionDE.cs b/Kyoo/Models/Resources/CollectionDE.cs index e1368a0c..3f23faf8 100644 --- a/Kyoo/Models/Resources/CollectionDE.cs +++ b/Kyoo/Models/Resources/CollectionDE.cs @@ -8,6 +8,7 @@ namespace Kyoo.Models public class CollectionDE : Collection { [JsonIgnore] [NotMergable] public virtual IEnumerable Links { get; set; } + [ExpressionRewrite(nameof(Links), nameof(CollectionLink.Show))] public override IEnumerable Shows { get => Links?.Select(x => x.Show); diff --git a/Kyoo/Models/Resources/LibraryDE.cs b/Kyoo/Models/Resources/LibraryDE.cs index c474c4fd..652eaa88 100644 --- a/Kyoo/Models/Resources/LibraryDE.cs +++ b/Kyoo/Models/Resources/LibraryDE.cs @@ -8,6 +8,7 @@ namespace Kyoo.Models public class LibraryDE : Library { [JsonIgnore] [NotMergable] public virtual IEnumerable ProviderLinks { get; set; } + [ExpressionRewrite(nameof(ProviderLinks), nameof(ProviderLink.Provider))] public override IEnumerable Providers { get => ProviderLinks?.Select(x => x.Provider); @@ -15,6 +16,7 @@ namespace Kyoo.Models } [JsonIgnore] [NotMergable] public virtual IEnumerable Links { get; set; } + [ExpressionRewrite(nameof(Links), nameof(LibraryLink.Show))] public override IEnumerable Shows { get => Links?.Where(x => x.Show != null).Select(x => x.Show); @@ -22,6 +24,7 @@ namespace Kyoo.Models value?.Select(x => new LibraryLink(this, x)), Links?.Where(x => x.Show == null)); } + [ExpressionRewrite(nameof(Links), nameof(LibraryLink.Collection))] public override IEnumerable Collections { get => Links?.Where(x => x.Collection != null).Select(x => x.Collection); diff --git a/Kyoo/Models/Resources/ShowDE.cs b/Kyoo/Models/Resources/ShowDE.cs index 7d43f25c..c7c3b170 100644 --- a/Kyoo/Models/Resources/ShowDE.cs +++ b/Kyoo/Models/Resources/ShowDE.cs @@ -19,6 +19,7 @@ namespace Kyoo.Models } [JsonIgnore] [NotMergable] public virtual IEnumerable LibraryLinks { get; set; } + [ExpressionRewrite(nameof(LibraryLinks), nameof(LibraryLink.Library))] public override IEnumerable Libraries { get => LibraryLinks?.Select(x => x.Library); @@ -26,7 +27,7 @@ namespace Kyoo.Models } [JsonIgnore] [NotMergable] public virtual IEnumerable CollectionLinks { get; set; } - + [ExpressionRewrite(nameof(CollectionLinks), nameof(CollectionLink.Collection))] public override IEnumerable Collections { get => CollectionLinks?.Select(x => x.Collection); From 00bc1a1732e1df6ac506a9a2f8b6e7655f9da3a8 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sun, 13 Sep 2020 17:25:03 +0200 Subject: [PATCH 7/7] Cleaning the whole api with the help of the expression rewritter --- Kyoo.Common/Controllers/ILibraryManager.cs | 304 ++---------------- Kyoo.Common/Controllers/IRepository.cs | 279 +--------------- .../Implementations/LibraryManager.cs | 253 +-------------- Kyoo.Common/Models/PeopleRole.cs | 2 + .../Repositories/CollectionRepository.cs | 84 +---- .../Repositories/EpisodeRepository.cs | 84 +---- .../Repositories/GenreRepository.cs | 39 +-- .../Repositories/LibraryRepository.cs | 72 +---- .../Repositories/SeasonRepository.cs | 36 --- .../Repositories/ShowRepository.cs | 91 ------ .../Repositories/StudioRepository.cs | 23 -- .../Repositories/TrackRepository.cs | 61 +--- Kyoo/Tasks/Crawler.cs | 2 +- Kyoo/Views/API/CollectionApi.cs | 17 +- Kyoo/Views/API/EpisodeApi.cs | 24 +- Kyoo/Views/API/LibraryApi.cs | 17 +- Kyoo/Views/API/SeasonApi.cs | 18 +- Kyoo/Views/API/ShowApi.cs | 45 +-- 18 files changed, 113 insertions(+), 1338 deletions(-) diff --git a/Kyoo.Common/Controllers/ILibraryManager.cs b/Kyoo.Common/Controllers/ILibraryManager.cs index b89f251f..8e4ac262 100644 --- a/Kyoo.Common/Controllers/ILibraryManager.cs +++ b/Kyoo.Common/Controllers/ILibraryManager.cs @@ -57,245 +57,8 @@ namespace Kyoo.Controllers Task GetGenre(Expression> where); Task GetStudio(Expression> where); Task GetPerson(Expression> where); - - // Get by relations - Task> GetSeasonsFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetSeasonsFromShow(int showID, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetSeasonsFromShow(showID, where, new Sort(sort), limit); - Task> GetSeasonsFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetSeasonsFromShow(string showSlug, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetSeasonsFromShow(showSlug, where, new Sort(sort), limit); - - Task> GetEpisodesFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetEpisodesFromShow(int showID, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetEpisodesFromShow(showID, where, new Sort(sort), limit); - - Task> GetEpisodesFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetEpisodesFromShow(string showSlug, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetEpisodesFromShow(showSlug, where, new Sort(sort), limit); - - Task> GetEpisodesFromSeason(int seasonID, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetEpisodesFromSeason(int seasonID, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetEpisodesFromSeason(seasonID, where, new Sort(sort), limit); - - Task> GetEpisodesFromSeason(int showID, - int seasonNumber, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetEpisodesFromSeason(int showID, - int seasonNumber, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetEpisodesFromSeason(showID, seasonNumber, where, new Sort(sort), limit); - - Task> GetEpisodesFromSeason(string showSlug, - int seasonNumber, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetEpisodesFromSeason(string showSlug, - int seasonNumber, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetEpisodesFromSeason(showSlug, seasonNumber, where, new Sort(sort), limit); - - Task> GetPeopleFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetPeopleFromShow(int showID, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetPeopleFromShow(showID, where, new Sort(sort), limit); - - Task> GetPeopleFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetPeopleFromShow(string showSlug, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetPeopleFromShow(showSlug, where, new Sort(sort), limit); - - Task> GetGenresFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetGenresFromShow(int showID, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetGenresFromShow(showID, where, new Sort(sort), limit); - - Task> GetGenresFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetGenresFromShow(string showSlug, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetGenresFromShow(showSlug, where, new Sort(sort), limit); - - Task> GetTracksFromEpisode(int episodeID, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetTracksFromEpisode(int episodeID, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetTracksFromEpisode(episodeID, where, new Sort(sort), limit); - - Task> GetTracksFromEpisode(int showID, - int seasonNumber, - int episodeNumber, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetTracksFromEpisode(int showID, - int seasonNumber, - int episodeNumber, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetTracksFromEpisode(showID, seasonNumber, episodeNumber, where, new Sort(sort), limit); - - Task> GetTracksFromEpisode(string showSlug, - int seasonNumber, - int episodeNumber, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetTracksFromEpisode(string showSlug, - int seasonNumber, - int episodeNumber, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetTracksFromEpisode(showSlug, seasonNumber, episodeNumber, where, new Sort(sort), limit); - - Task GetStudioFromShow(int showID); - Task GetStudioFromShow(string showSlug); - Task GetShowFromSeason(int seasonID); - Task GetShowFromEpisode(int episodeID); - Task GetSeasonFromEpisode(int episodeID); - - Task> GetLibrariesFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetLibrariesFromShow(int showID, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetLibrariesFromShow(showID, where, new Sort(sort), limit); - - Task> GetLibrariesFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetLibrariesFromShow(string showSlug, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetLibrariesFromShow(showSlug, where, new Sort(sort), limit); - - Task> GetCollectionsFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetCollectionsFromShow(int showID, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetCollectionsFromShow(showID, where, new Sort(sort), limit); - - Task> GetCollectionsFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetCollectionsFromShow(string showSlug, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetCollectionsFromShow(showSlug, where, new Sort(sort), limit); - - Task> GetShowsFromLibrary(int id, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetShowsFromLibrary(int id, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetShowsFromLibrary(id, where, new Sort(sort), limit); - - Task> GetShowsFromLibrary(string slug, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetShowsFromLibrary(string slug, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetShowsFromLibrary(slug, where, new Sort(sort), limit); - - Task> GetCollectionsFromLibrary(int id, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetCollectionsFromLibrary(int id, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetCollectionsFromLibrary(id, where, new Sort(sort), limit); - - Task> GetCollectionsFromLibrary(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetCollectionsFromLibrary(string showSlug, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetCollectionsFromLibrary(showSlug, where, new Sort(sort), limit); + // Library Items relations Task> GetItemsFromLibrary(int id, Expression> where = null, Sort sort = default, @@ -316,46 +79,28 @@ namespace Kyoo.Controllers Pagination limit = default ) => GetItemsFromLibrary(librarySlug, where, new Sort(sort), limit); - Task> GetShowsFromCollection(int id, - Expression> where = null, - Sort sort = default, + // People Role relations + Task> GetPeopleFromShow(int showID, + Expression> where = null, + Sort sort = default, Pagination limit = default); - Task> GetShowsFromCollection(int id, - [Optional] Expression> where, - Expression> sort, + Task> GetPeopleFromShow(int showID, + [Optional] Expression> where, + Expression> sort, Pagination limit = default - ) => GetShowsFromCollection(id, where, new Sort(sort), limit); + ) => GetPeopleFromShow(showID, where, new Sort(sort), limit); - Task> GetShowsFromCollection(string slug, - Expression> where = null, - Sort sort = default, + Task> GetPeopleFromShow(string showSlug, + Expression> where = null, + Sort sort = default, Pagination limit = default); - Task> GetShowsFromCollection(string slug, - [Optional] Expression> where, - Expression> sort, + Task> GetPeopleFromShow(string showSlug, + [Optional] Expression> where, + Expression> sort, Pagination limit = default - ) => GetShowsFromCollection(slug, where, new Sort(sort), limit); - - Task> GetLibrariesFromCollection(int id, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetLibrariesFromCollection(int id, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetLibrariesFromCollection(id, where, new Sort(sort), limit); - - Task> GetLibrariesFromCollection(string slug, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetLibrariesFromCollection(string slug, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetLibrariesFromCollection(slug, where, new Sort(sort), limit); + ) => GetPeopleFromShow(showSlug, where, new Sort(sort), limit); + // Show Role relations Task> GetRolesFromPeople(int showID, Expression> where = null, Sort sort = default, @@ -376,7 +121,6 @@ namespace Kyoo.Controllers Pagination limit = default ) => GetRolesFromPeople(showSlug, where, new Sort(sort), limit); - // Helpers Task AddShowLink(int showID, int? libraryID, int? collectionID); Task AddShowLink([NotNull] Show show, Library library, Collection collection); @@ -391,10 +135,10 @@ namespace Kyoo.Controllers Task> GetShows(Expression> where = null, Sort sort = default, Pagination limit = default); - Task> GetSeasonsFromShow(Expression> where = null, + Task> GetSeasons(Expression> where = null, Sort sort = default, Pagination limit = default); - Task> GetEpisodesFromShow(Expression> where = null, + Task> GetEpisodes(Expression> where = null, Sort sort = default, Pagination limit = default); Task> GetTracks(Expression> where = null, @@ -425,14 +169,6 @@ namespace Kyoo.Controllers Expression> sort, Pagination limit = default ) => GetShows(where, new Sort(sort), limit); - Task> GetSeasonsFromShow([Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetSeasonsFromShow(where, new Sort(sort), limit); - Task> GetEpisodesFromShow([Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetEpisodesFromShow(where, new Sort(sort), limit); Task> GetTracks([Optional] Expression> where, Expression> sort, Pagination limit = default @@ -455,7 +191,7 @@ namespace Kyoo.Controllers ) => GetProviders(where, new Sort(sort), limit); - // Search + // Search Task> SearchLibraries(string searchQuery); Task> SearchCollections(string searchQuery); Task> SearchShows(string searchQuery); diff --git a/Kyoo.Common/Controllers/IRepository.cs b/Kyoo.Common/Controllers/IRepository.cs index 47419e88..e3ae3f65 100644 --- a/Kyoo.Common/Controllers/IRepository.cs +++ b/Kyoo.Common/Controllers/IRepository.cs @@ -110,49 +110,6 @@ namespace Kyoo.Controllers public interface IShowRepository : IRepository { Task AddShowLink(int showID, int? libraryID, int? collectionID); - - Task> GetFromLibrary(int id, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromLibrary(int id, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromLibrary(id, where, new Sort(sort), limit); - - Task> GetFromLibrary(string slug, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromLibrary(string slug, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromLibrary(slug, where, new Sort(sort), limit); - - Task> GetFromCollection(int id, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromCollection(int id, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromCollection(id, where, new Sort(sort), limit); - - Task> GetFromCollection(string slug, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromCollection(string slug, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromCollection(slug, where, new Sort(sort), limit); - - Task GetFromSeason(int seasonID); - Task GetFromEpisode(int episodeID); } public interface ISeasonRepository : IRepository @@ -160,28 +117,6 @@ namespace Kyoo.Controllers Task Get(int showID, int seasonNumber); Task Get(string showSlug, int seasonNumber); Task Delete(string showSlug, int seasonNumber); - - Task> GetFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromShow(int showID, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromShow(showID, where, new Sort(sort), limit); - - Task> GetFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromShow(string showSlug, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromShow(showSlug, where, new Sort(sort), limit); - - Task GetFromEpisode(int episodeID); } public interface IEpisodeRepository : IRepository @@ -192,143 +127,10 @@ namespace Kyoo.Controllers Task GetAbsolute(int showID, int absoluteNumber); Task GetAbsolute(string showSlug, int absoluteNumber); Task Delete(string showSlug, int seasonNumber, int episodeNumber); - - Task> GetFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromShow(int showID, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromShow(showID, where, new Sort(sort), limit); - - Task> GetFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromShow(string showSlug, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromShow(showSlug, where, new Sort(sort), limit); - - Task> GetFromSeason(int seasonID, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromSeason(int seasonID, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromSeason(seasonID, where, new Sort(sort), limit); - Task> GetFromSeason(int showID, - int seasonNumber, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromSeason(int showID, - int seasonNumber, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromSeason(showID, seasonNumber, where, new Sort(sort), limit); - Task> GetFromSeason(string showSlug, - int seasonNumber, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromSeason(string showSlug, - int seasonNumber, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromSeason(showSlug, seasonNumber, where, new Sort(sort), limit); } - public interface ITrackRepository : IRepository - { - Task> GetFromEpisode(int episodeID, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromEpisode(int episodeID, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromEpisode(episodeID, where, new Sort(sort), limit); - - Task> GetFromEpisode(int showID, - int seasonNumber, - int episodeNumber, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromEpisode(int showID, - int seasonNumber, - int episodeNumber, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromEpisode(showID, seasonNumber, episodeNumber, where, new Sort(sort), limit); - - Task> GetFromEpisode(string showSlug, - int seasonNumber, - int episodeNumber, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromEpisode(string showSlug, - int seasonNumber, - int episodeNumber, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromEpisode(showSlug, seasonNumber, episodeNumber, where, new Sort(sort), limit); - } - - public interface ILibraryRepository : IRepository - { - Task> GetFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromShow(int showID, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromShow(showID, where, new Sort(sort), limit); - - Task> GetFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromShow(string showSlug, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromShow(showSlug, where, new Sort(sort), limit); - - Task> GetFromCollection(int id, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromCollection(int id, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromCollection(id, where, new Sort(sort), limit); - - Task> GetFromCollection(string slug, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromCollection(string slug, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromCollection(slug, where, new Sort(sort), limit); - } + public interface ITrackRepository : IRepository { } + public interface ILibraryRepository : IRepository { } public interface ILibraryItemRepository : IRepository { @@ -353,79 +155,11 @@ namespace Kyoo.Controllers Expression> sort, Pagination limit = default ) => GetFromLibrary(librarySlug, where, new Sort(sort), limit); - } - - public interface ICollectionRepository : IRepository - { - Task> GetFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromShow(int showID, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromShow(showID, where, new Sort(sort), limit); + } - Task> GetFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromShow(string showSlug, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromShow(showSlug, where, new Sort(sort), limit); - - Task> GetFromLibrary(int id, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromLibrary(int id, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromLibrary(id, where, new Sort(sort), limit); - - Task> GetFromLibrary(string slug, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromLibrary(string slug, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromLibrary(slug, where, new Sort(sort), limit); - } - - public interface IGenreRepository : IRepository - { - Task> GetFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromShow(int showID, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromShow(showID, where, new Sort(sort), limit); - - Task> GetFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default); - Task> GetFromShow(string showSlug, - [Optional] Expression> where, - Expression> sort, - Pagination limit = default - ) => GetFromShow(showSlug, where, new Sort(sort), limit); - } - - public interface IStudioRepository : IRepository - { - Task GetFromShow(int showID); - Task GetFromShow(string showSlug); - } + public interface ICollectionRepository : IRepository { } + public interface IGenreRepository : IRepository { } + public interface IStudioRepository : IRepository { } public interface IPeopleRepository : IRepository { @@ -469,5 +203,6 @@ namespace Kyoo.Controllers Pagination limit = default ) => GetFromPeople(showSlug, where, new Sort(sort), limit); } + public interface IProviderRepository : IRepository {} } \ No newline at end of file diff --git a/Kyoo.Common/Controllers/Implementations/LibraryManager.cs b/Kyoo.Common/Controllers/Implementations/LibraryManager.cs index 9fcd0730..4ef27fb1 100644 --- a/Kyoo.Common/Controllers/Implementations/LibraryManager.cs +++ b/Kyoo.Common/Controllers/Implementations/LibraryManager.cs @@ -241,18 +241,18 @@ namespace Kyoo.Controllers return ShowRepository.GetAll(where, sort, limit); } - public Task> GetSeasonsFromShow(Expression> where = null, + public Task> GetSeasons(Expression> where = null, Sort sort = default, - Pagination page = default) + Pagination limit = default) { - return SeasonRepository.GetAll(where, sort, page); + return SeasonRepository.GetAll(where, sort, limit); } - public Task> GetEpisodesFromShow(Expression> where = null, + public Task> GetEpisodes(Expression> where = null, Sort sort = default, - Pagination page = default) + Pagination limit = default) { - return EpisodeRepository.GetAll(where, sort, page); + return EpisodeRepository.GetAll(where, sort, limit); } public Task> GetTracks(Expression> where = null, @@ -290,213 +290,6 @@ namespace Kyoo.Controllers return ProviderRepository.GetAll(where, sort, page); } - public Task> GetSeasonsFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return SeasonRepository.GetFromShow(showID, where, sort, limit); - } - - public Task> GetSeasonsFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return SeasonRepository.GetFromShow(showSlug, where, sort, limit); - } - - public Task> GetEpisodesFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return EpisodeRepository.GetFromShow(showID, where, sort, limit); - } - - public Task> GetEpisodesFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return EpisodeRepository.GetFromShow(showSlug, where, sort, limit); - } - - public Task> GetEpisodesFromSeason(int seasonID, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return EpisodeRepository.GetFromSeason(seasonID, where, sort, limit); - } - - public Task> GetEpisodesFromSeason(int showID, - int seasonNumber, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return EpisodeRepository.GetFromSeason(showID, seasonNumber, where, sort, limit); - } - - public Task> GetEpisodesFromSeason(string showSlug, - int seasonNumber, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return EpisodeRepository.GetFromSeason(showSlug, seasonNumber, where, sort, limit); - } - - public Task> GetPeopleFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return PeopleRepository.GetFromShow(showID, where, sort, limit); - } - - public Task> GetPeopleFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return PeopleRepository.GetFromShow(showSlug, where, sort, limit); - } - - public Task> GetGenresFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return GenreRepository.GetFromShow(showID, where, sort, limit); - } - - public Task> GetGenresFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return GenreRepository.GetFromShow(showSlug, where, sort, limit); - } - - public Task> GetTracksFromEpisode(int episodeID, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return TrackRepository.GetFromEpisode(episodeID, where, sort, limit); - } - - public Task> GetTracksFromEpisode(int showID, - int seasonNumber, - int episodeNumber, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return TrackRepository.GetFromEpisode(showID, seasonNumber, episodeNumber, where, sort, limit); - } - - public Task> GetTracksFromEpisode(string showSlug, - int seasonNumber, - int episodeNumber, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return TrackRepository.GetFromEpisode(showSlug, seasonNumber, episodeNumber, where, sort, limit); - } - - public Task GetStudioFromShow(int showID) - { - return StudioRepository.GetFromShow(showID); - } - - public Task GetStudioFromShow(string showSlug) - { - return StudioRepository.GetFromShow(showSlug); - } - - public Task GetShowFromSeason(int seasonID) - { - return ShowRepository.GetFromSeason(seasonID); - } - - public Task GetShowFromEpisode(int episodeID) - { - return ShowRepository.GetFromEpisode(episodeID); - } - - public Task GetSeasonFromEpisode(int episodeID) - { - return SeasonRepository.GetFromEpisode(episodeID); - } - - public Task> GetLibrariesFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return LibraryRepository.GetFromShow(showID, where, sort, limit); - } - - public Task> GetLibrariesFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return LibraryRepository.GetFromShow(showSlug, where, sort, limit); - } - - public Task> GetCollectionsFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return CollectionRepository.GetFromShow(showID, where, sort, limit); - } - - public Task> GetCollectionsFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return CollectionRepository.GetFromShow(showSlug, where, sort, limit); - } - - public Task> GetShowsFromLibrary(int id, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return ShowRepository.GetFromLibrary(id, where, sort, limit); - } - - public Task> GetShowsFromLibrary(string slug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return ShowRepository.GetFromLibrary(slug, where, sort, limit); - } - - public Task> GetCollectionsFromLibrary(int id, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return CollectionRepository.GetFromLibrary(id, where, sort, limit); - } - - public Task> GetCollectionsFromLibrary(string slug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return CollectionRepository.GetFromLibrary(slug, where, sort, limit); - } - public Task> GetItemsFromLibrary(int id, Expression> where = null, Sort sort = default, @@ -512,37 +305,21 @@ namespace Kyoo.Controllers { return LibraryItemRepository.GetFromLibrary(librarySlug, where, sort, limit); } - - public Task> GetShowsFromCollection(int id, - Expression> where = null, - Sort sort = default, + + public Task> GetPeopleFromShow(int showID, + Expression> where = null, + Sort sort = default, Pagination limit = default) { - return ShowRepository.GetFromCollection(id, where, sort, limit); - } - - public Task> GetShowsFromCollection(string slug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return ShowRepository.GetFromCollection(slug, where, sort, limit); + return PeopleRepository.GetFromShow(showID, where, sort, limit); } - public Task> GetLibrariesFromCollection(int id, - Expression> where = null, - Sort sort = default, + public Task> GetPeopleFromShow(string showSlug, + Expression> where = null, + Sort sort = default, Pagination limit = default) { - return LibraryRepository.GetFromCollection(id, where, sort, limit); - } - - public Task> GetLibrariesFromCollection(string slug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return LibraryRepository.GetFromCollection(slug, where, sort, limit); + return PeopleRepository.GetFromShow(showSlug, where, sort, limit); } public Task> GetRolesFromPeople(int id, diff --git a/Kyoo.Common/Models/PeopleRole.cs b/Kyoo.Common/Models/PeopleRole.cs index 870309a8..678ae7e7 100644 --- a/Kyoo.Common/Models/PeopleRole.cs +++ b/Kyoo.Common/Models/PeopleRole.cs @@ -25,12 +25,14 @@ namespace Kyoo.Models set => People.Name = value; } + [ExpressionRewrite(nameof(People) + "."+ nameof(Models.People.Poster))] public string Poster { get => People.Poster; set => People.Poster = value; } + [ExpressionRewrite(nameof(People) + "."+ nameof(Models.People.ExternalIDs))] public IEnumerable ExternalIDs { get => People.ExternalIDs; diff --git a/Kyoo/Controllers/Repositories/CollectionRepository.cs b/Kyoo/Controllers/Repositories/CollectionRepository.cs index 878292ee..230e79ae 100644 --- a/Kyoo/Controllers/Repositories/CollectionRepository.cs +++ b/Kyoo/Controllers/Repositories/CollectionRepository.cs @@ -4,9 +4,7 @@ using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using Kyoo.Models; -using Kyoo.Models.Exceptions; using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; namespace Kyoo.Controllers { @@ -14,15 +12,11 @@ namespace Kyoo.Controllers { private bool _disposed; private readonly DatabaseContext _database; - private readonly Lazy _shows; - private readonly Lazy _libraries; protected override Expression> DefaultSort => x => x.Name; - public CollectionRepository(DatabaseContext database, IServiceProvider services) : base(database) + public CollectionRepository(DatabaseContext database) : base(database) { _database = database; - _shows = new Lazy(services.GetRequiredService); - _libraries = new Lazy(services.GetRequiredService); } public override void Dispose() @@ -31,10 +25,6 @@ namespace Kyoo.Controllers return; _disposed = true; _database.Dispose(); - if (_shows.IsValueCreated) - _shows.Value.Dispose(); - if (_libraries.IsValueCreated) - _libraries.Value.Dispose(); } public override async ValueTask DisposeAsync() @@ -43,12 +33,8 @@ namespace Kyoo.Controllers return; _disposed = true; await _database.DisposeAsync(); - if (_shows.IsValueCreated) - await _shows.Value.DisposeAsync(); - if (_libraries.IsValueCreated) - await _libraries.Value.DisposeAsync(); } - + public override async Task> Search(string query) { return await _database.Collections @@ -79,71 +65,5 @@ namespace Kyoo.Controllers _database.Entry(link).State = EntityState.Deleted; await _database.SaveChangesAsync(); } - - public async Task> GetFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection collections = await ApplyFilters(_database.CollectionLinks - .Where(x => x.ShowID == showID) - .Select(x => (CollectionDE)x.Collection), - where, - sort, - limit); - if (!collections.Any() & await _shows.Value.Get(showID) == null) - throw new ItemNotFound(); - return collections; - } - - public async Task> GetFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection collections = await ApplyFilters(_database.CollectionLinks - .Where(x => x.Show.Slug == showSlug) - .Select(x => (CollectionDE)x.Collection), - where, - sort, - limit); - if (!collections.Any() & await _shows.Value.Get(showSlug) == null) - throw new ItemNotFound(); - return collections; - } - - public async Task> GetFromLibrary(int id, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection collections = await ApplyFilters(_database.LibraryLinks - .Where(x => x.LibraryID == id && x.CollectionID != null) - .Select(x => (CollectionDE)x.Collection), - where, - sort, - limit); - if (!collections.Any() && await _libraries.Value.Get(id) == null) - throw new ItemNotFound(); - return collections; - } - - public async Task> GetFromLibrary(string slug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection collections = await ApplyFilters(_database.LibraryLinks - .Where(x => x.Library.Slug == slug && x.CollectionID != null) - .Select(x => (CollectionDE)x.Collection), - where, - sort, - limit); - if (!collections.Any() && await _libraries.Value.Get(slug) == null) - throw new ItemNotFound(); - return collections; - } } - - } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/EpisodeRepository.cs b/Kyoo/Controllers/Repositories/EpisodeRepository.cs index 974271bc..fee27276 100644 --- a/Kyoo/Controllers/Repositories/EpisodeRepository.cs +++ b/Kyoo/Controllers/Repositories/EpisodeRepository.cs @@ -15,21 +15,13 @@ namespace Kyoo.Controllers private bool _disposed; private readonly DatabaseContext _database; private readonly IProviderRepository _providers; - private readonly IShowRepository _shows; - private readonly ISeasonRepository _seasons; protected override Expression> DefaultSort => x => x.EpisodeNumber; - public EpisodeRepository(DatabaseContext database, - IProviderRepository providers, - IShowRepository shows, - ISeasonRepository seasons) - : base(database) + public EpisodeRepository(DatabaseContext database, IProviderRepository providers) : base(database) { _database = database; _providers = providers; - _shows = shows; - _seasons = seasons; } @@ -131,80 +123,6 @@ namespace Kyoo.Controllers link.Provider = await _providers.CreateIfNotExists(link.Provider); } } - - public async Task> GetFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection episodes = await ApplyFilters(_database.Episodes.Where(x => x.ShowID == showID), - where, - sort, - limit); - if (!episodes.Any() && await _shows.Get(showID) == null) - throw new ItemNotFound(); - return episodes; - } - - public async Task> GetFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection episodes = await ApplyFilters(_database.Episodes.Where(x => x.Show.Slug == showSlug), - where, - sort, - limit); - if (!episodes.Any() && await _shows.Get(showSlug) == null) - throw new ItemNotFound(); - return episodes; - } - - public async Task> GetFromSeason(int seasonID, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection episodes = await ApplyFilters(_database.Episodes.Where(x => x.SeasonID == seasonID), - where, - sort, - limit); - if (!episodes.Any() && await _seasons.Get(seasonID) == null) - throw new ItemNotFound(); - return episodes; - } - - public async Task> GetFromSeason(int showID, - int seasonNumber, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection episodes = await ApplyFilters(_database.Episodes.Where(x => x.ShowID == showID - && x.SeasonNumber == seasonNumber), - where, - sort, - limit); - if (!episodes.Any() && await _seasons.Get(showID, seasonNumber) == null) - throw new ItemNotFound(); - return episodes; - } - - public async Task> GetFromSeason(string showSlug, - int seasonNumber, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection episodes = await ApplyFilters(_database.Episodes.Where(x => x.Show.Slug == showSlug - && x.SeasonNumber == seasonNumber), - where, - sort, - limit); - if (!episodes.Any() && await _seasons.Get(showSlug, seasonNumber) == null) - throw new ItemNotFound(); - return episodes; - } public async Task Delete(string showSlug, int seasonNumber, int episodeNumber) { diff --git a/Kyoo/Controllers/Repositories/GenreRepository.cs b/Kyoo/Controllers/Repositories/GenreRepository.cs index 5d86abd2..549c2dc5 100644 --- a/Kyoo/Controllers/Repositories/GenreRepository.cs +++ b/Kyoo/Controllers/Repositories/GenreRepository.cs @@ -14,14 +14,12 @@ namespace Kyoo.Controllers { private bool _disposed; private readonly DatabaseContext _database; - private readonly Lazy _shows; protected override Expression> DefaultSort => x => x.Slug; - public GenreRepository(DatabaseContext database, IServiceProvider services) : base(database) + public GenreRepository(DatabaseContext database) : base(database) { _database = database; - _shows = new Lazy(services.GetRequiredService); } public override void Dispose() @@ -30,8 +28,6 @@ namespace Kyoo.Controllers return; _disposed = true; _database.Dispose(); - if (_shows.IsValueCreated) - _shows.Value.Dispose(); } public override async ValueTask DisposeAsync() @@ -40,8 +36,6 @@ namespace Kyoo.Controllers return; _disposed = true; await _database.DisposeAsync(); - if (_shows.IsValueCreated) - await _shows.Value.DisposeAsync(); } public override async Task> Search(string query) @@ -71,36 +65,5 @@ namespace Kyoo.Controllers _database.Entry(link).State = EntityState.Deleted; await _database.SaveChangesAsync(); } - - public async Task> GetFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection genres = await ApplyFilters(_database.GenreLinks.Where(x => x.ShowID == showID) - .Select(x => (GenreDE)x.Genre), - where, - sort, - limit); - if (!genres.Any() && await _shows.Value.Get(showID) == null) - throw new ItemNotFound(); - return genres; - } - - public async Task> GetFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection genres = await ApplyFilters(_database.GenreLinks - .Where(x => x.Show.Slug == showSlug) - .Select(x => (GenreDE)x.Genre), - where, - sort, - limit); - if (!genres.Any() && await _shows.Value.Get(showSlug) == null) - throw new ItemNotFound(); - return genres; - } } } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/LibraryRepository.cs b/Kyoo/Controllers/Repositories/LibraryRepository.cs index 665aa032..225f2532 100644 --- a/Kyoo/Controllers/Repositories/LibraryRepository.cs +++ b/Kyoo/Controllers/Repositories/LibraryRepository.cs @@ -15,16 +15,14 @@ namespace Kyoo.Controllers private bool _disposed; private readonly DatabaseContext _database; private readonly IProviderRepository _providers; - private readonly Lazy _shows; protected override Expression> DefaultSort => x => x.ID; - public LibraryRepository(DatabaseContext database, IProviderRepository providers, IServiceProvider services) + public LibraryRepository(DatabaseContext database, IProviderRepository providers) : base(database) { _database = database; _providers = providers; - _shows = new Lazy(services.GetRequiredService); } public override void Dispose() @@ -34,8 +32,6 @@ namespace Kyoo.Controllers _disposed = true; _database.Dispose(); _providers.Dispose(); - if (_shows.IsValueCreated) - _shows.Value.Dispose(); } public override async ValueTask DisposeAsync() @@ -45,8 +41,6 @@ namespace Kyoo.Controllers _disposed = true; await _database.DisposeAsync(); await _providers.DisposeAsync(); - if (_shows.IsValueCreated) - await _shows.Value.DisposeAsync(); } public override async Task> Search(string query) @@ -99,69 +93,5 @@ namespace Kyoo.Controllers _database.Entry(entry).State = EntityState.Deleted; await _database.SaveChangesAsync(); } - - public async Task> GetFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection libraries = await ApplyFilters(_database.LibraryLinks - .Where(x => x.ShowID == showID) - .Select(x => (LibraryDE)x.Library), - where, - sort, - limit); - if (!libraries.Any() && await _shows.Value.Get(showID) == null) - throw new ItemNotFound(); - return libraries; - } - - public async Task> GetFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection libraries = await ApplyFilters(_database.LibraryLinks - .Where(x => x.Show.Slug == showSlug) - .Select(x => (LibraryDE)x.Library), - where, - sort, - limit); - if (!libraries.Any() && await _shows.Value.Get(showSlug) == null) - throw new ItemNotFound(); - return libraries; - } - - public async Task> GetFromCollection(int id, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection libraries = await ApplyFilters(_database.LibraryLinks - .Where(x => x.CollectionID == id) - .Select(x => (LibraryDE)x.Library), - where, - sort, - limit); - if (!libraries.Any() && await _shows.Value.Get(id) == null) - throw new ItemNotFound(); - return libraries; - } - - public async Task> GetFromCollection(string slug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection libraries = await ApplyFilters(_database.LibraryLinks - .Where(x => x.Collection.Slug == slug) - .Select(x => (LibraryDE)x.Library), - where, - sort, - limit); - if (!libraries.Any() && await _shows.Value.Get(slug) == null) - throw new ItemNotFound(); - return libraries; - } } } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/SeasonRepository.cs b/Kyoo/Controllers/Repositories/SeasonRepository.cs index 7cb7243d..81a7c2af 100644 --- a/Kyoo/Controllers/Repositories/SeasonRepository.cs +++ b/Kyoo/Controllers/Repositories/SeasonRepository.cs @@ -17,20 +17,17 @@ namespace Kyoo.Controllers private readonly DatabaseContext _database; private readonly IProviderRepository _providers; private readonly Lazy _episodes; - private readonly IShowRepository _shows; protected override Expression> DefaultSort => x => x.SeasonNumber; public SeasonRepository(DatabaseContext database, IProviderRepository providers, - IShowRepository shows, IServiceProvider services) : base(database) { _database = database; _providers = providers; _episodes = new Lazy(services.GetRequiredService); - _shows = shows; } @@ -111,34 +108,6 @@ namespace Kyoo.Controllers } } - public async Task> GetFromShow(int showID, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection seasons = await ApplyFilters(_database.Seasons.Where(x => x.ShowID == showID), - where, - sort, - limit); - if (!seasons.Any() && await _shows.Get(showID) == null) - throw new ItemNotFound(); - return seasons; - } - - public async Task> GetFromShow(string showSlug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection seasons = await ApplyFilters(_database.Seasons.Where(x => x.Show.Slug == showSlug), - where, - sort, - limit); - if (!seasons.Any() && await _shows.Get(showSlug) == null) - throw new ItemNotFound(); - return seasons; - } - public async Task Delete(string showSlug, int seasonNumber) { Season obj = await Get(showSlug, seasonNumber); @@ -161,10 +130,5 @@ namespace Kyoo.Controllers if (obj.Episodes != null) await _episodes.Value.DeleteRange(obj.Episodes); } - - public Task GetFromEpisode(int episodeID) - { - return _database.Seasons.FirstOrDefaultAsync(x => x.Episodes.Any(y => y.ID == episodeID)); - } } } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index 3f8f6a3b..03505365 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -4,7 +4,6 @@ using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using Kyoo.Models; -using Kyoo.Models.Exceptions; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; @@ -20,8 +19,6 @@ namespace Kyoo.Controllers private readonly IProviderRepository _providers; private readonly Lazy _seasons; private readonly Lazy _episodes; - private readonly Lazy _libraries; - private readonly Lazy _collections; protected override Expression> DefaultSort => x => x.Title; public ShowRepository(DatabaseContext database, @@ -39,8 +36,6 @@ namespace Kyoo.Controllers _providers = providers; _seasons = new Lazy(services.GetRequiredService); _episodes = new Lazy(services.GetRequiredService); - _libraries = new Lazy(services.GetRequiredService); - _collections = new Lazy(services.GetRequiredService); } public override void Dispose() @@ -57,10 +52,6 @@ namespace Kyoo.Controllers _seasons.Value.Dispose(); if (_episodes.IsValueCreated) _episodes.Value.Dispose(); - if (_libraries.IsValueCreated) - _libraries.Value.Dispose(); - if (_collections.IsValueCreated) - _collections.Value.Dispose(); } public override async ValueTask DisposeAsync() @@ -77,10 +68,6 @@ namespace Kyoo.Controllers await _seasons.Value.DisposeAsync(); if (_episodes.IsValueCreated) await _episodes.Value.DisposeAsync(); - if (_libraries.IsValueCreated) - await _libraries.Value.DisposeAsync(); - if (_collections.IsValueCreated) - await _collections.Value.DisposeAsync(); } public override async Task> Search(string query) @@ -186,83 +173,5 @@ namespace Kyoo.Controllers if (obj.Episodes != null) await _episodes.Value.DeleteRange(obj.Episodes); } - - public async Task> GetFromLibrary(int id, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection shows = await ApplyFilters(_database.LibraryLinks - .Where(x => x.LibraryID == id && x.ShowID != null) - .Select(x => (ShowDE)x.Show), - where, - sort, - limit); - if (!shows.Any() && await _libraries.Value.Get(id) == null) - throw new ItemNotFound(); - return shows; - } - - public async Task> GetFromLibrary(string slug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection shows = await ApplyFilters(_database.LibraryLinks - .Where(x => x.Library.Slug == slug && x.ShowID != null) - .Select(x => (ShowDE)x.Show), - where, - sort, - limit); - if (!shows.Any() && await _libraries.Value.Get(slug) == null) - throw new ItemNotFound(); - return shows; - } - - public async Task> GetFromCollection(int id, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection shows = await ApplyFilters(_database.CollectionLinks - .Where(x => x.CollectionID== id) - .Select(x => (ShowDE)x.Show), - where, - sort, - limit); - if (!shows.Any() && await _libraries.Value.Get(id) == null) - throw new ItemNotFound(); - return shows; - } - - public async Task> GetFromCollection(string slug, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection shows = await ApplyFilters(_database.CollectionLinks - .Where(x => x.Collection.Slug == slug) - .Select(x => (ShowDE)x.Show), - where, - sort, - limit); - if (!shows.Any() && await _libraries.Value.Get(slug) == null) - throw new ItemNotFound(); - return shows; - } - - public Task GetFromSeason(int seasonID) - { - return _database.Shows - .FirstOrDefaultAsync(x => x.Seasons.Any(y => y.ID == seasonID)) - .Cast(); - } - - public Task GetFromEpisode(int episodeID) - { - return _database.Shows - .FirstOrDefaultAsync(x => x.Episodes.Any(y => y.ID == episodeID)) - .Cast(); - } } } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/StudioRepository.cs b/Kyoo/Controllers/Repositories/StudioRepository.cs index a8922f90..eebf0fdc 100644 --- a/Kyoo/Controllers/Repositories/StudioRepository.cs +++ b/Kyoo/Controllers/Repositories/StudioRepository.cs @@ -4,7 +4,6 @@ using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using Kyoo.Models; -using Kyoo.Models.Exceptions; using Microsoft.EntityFrameworkCore; namespace Kyoo.Controllers @@ -48,27 +47,5 @@ namespace Kyoo.Controllers show.StudioID = null; await _database.SaveChangesAsync(); } - - public async Task GetFromShow(int showID) - { - Studio studio = await _database.Shows - .Where(x => x.ID == showID) - .Select(x => x.Studio) - .FirstOrDefaultAsync(); - if (studio == null && !_database.Shows.Any(x => x.ID == showID)) - throw new ItemNotFound(); - return studio; - } - - public async Task GetFromShow(string showSlug) - { - Studio studio = await _database.Shows - .Where(x => x.Slug == showSlug) - .Select(x => x.Studio) - .FirstOrDefaultAsync(); - if (studio == null && !_database.Shows.Any(x => x.Slug == showSlug)) - throw new ItemNotFound(); - return studio; - } } } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/TrackRepository.cs b/Kyoo/Controllers/Repositories/TrackRepository.cs index ed4f6da4..724e5c93 100644 --- a/Kyoo/Controllers/Repositories/TrackRepository.cs +++ b/Kyoo/Controllers/Repositories/TrackRepository.cs @@ -1,13 +1,10 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Linq.Expressions; using System.Text.RegularExpressions; using System.Threading.Tasks; using Kyoo.Models; -using Kyoo.Models.Exceptions; using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; namespace Kyoo.Controllers { @@ -15,14 +12,12 @@ namespace Kyoo.Controllers { private bool _disposed; private readonly DatabaseContext _database; - private readonly Lazy _episodes; protected override Expression> DefaultSort => x => x.ID; - public TrackRepository(DatabaseContext database, IServiceProvider services) : base(database) + public TrackRepository(DatabaseContext database) : base(database) { _database = database; - _episodes = new Lazy(services.GetRequiredService); } public override void Dispose() @@ -31,8 +26,6 @@ namespace Kyoo.Controllers return; _disposed = true; _database.Dispose(); - if (_episodes.IsValueCreated) - _episodes.Value.Dispose(); } public override async ValueTask DisposeAsync() @@ -41,8 +34,6 @@ namespace Kyoo.Controllers return; _disposed = true; await _database.DisposeAsync(); - if (_episodes.IsValueCreated) - await _episodes.Value.DisposeAsync(); } public override Task Get(string slug) @@ -97,55 +88,5 @@ namespace Kyoo.Controllers _database.Entry(obj).State = EntityState.Deleted; await _database.SaveChangesAsync(); } - - public async Task> GetFromEpisode(int episodeID, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection tracks = await ApplyFilters(_database.Tracks.Where(x => x.EpisodeID == episodeID), - where, - sort, - limit); - if (!tracks.Any() && await _episodes.Value.Get(episodeID) == null) - throw new ItemNotFound(); - return tracks; - } - - public async Task> GetFromEpisode(int showID, - int seasonNumber, - int episodeNumber, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection tracks = await ApplyFilters(_database.Tracks.Where(x => x.Episode.ShowID == showID - && x.Episode.SeasonNumber == seasonNumber - && x.Episode.EpisodeNumber == episodeNumber), - where, - sort, - limit); - if (!tracks.Any() && await _episodes.Value.Get(showID, seasonNumber, episodeNumber) == null) - throw new ItemNotFound(); - return tracks; - } - - public async Task> GetFromEpisode(string showSlug, - int seasonNumber, - int episodeNumber, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection tracks = await ApplyFilters(_database.Tracks.Where(x => x.Episode.Show.Slug == showSlug - && x.Episode.SeasonNumber == seasonNumber - && x.Episode.EpisodeNumber == episodeNumber), - where, - sort, - limit); - if (!tracks.Any() && await _episodes.Value.Get(showSlug, seasonNumber, episodeNumber) == null) - throw new ItemNotFound(); - return tracks; - } } } \ No newline at end of file diff --git a/Kyoo/Tasks/Crawler.cs b/Kyoo/Tasks/Crawler.cs index 572abf84..bdc48342 100644 --- a/Kyoo/Tasks/Crawler.cs +++ b/Kyoo/Tasks/Crawler.cs @@ -63,7 +63,7 @@ namespace Kyoo.Controllers if (!Directory.Exists(show.Path)) await libraryManager.DeleteShow(show); - ICollection episodes = await libraryManager.GetEpisodesFromShow(); + ICollection episodes = await libraryManager.GetEpisodes(); ICollection libraries = argument == null ? await libraryManager.GetLibraries() : new [] { await libraryManager.GetLibrary(argument)}; diff --git a/Kyoo/Views/API/CollectionApi.cs b/Kyoo/Views/API/CollectionApi.cs index bb9675d2..501f15bc 100644 --- a/Kyoo/Views/API/CollectionApi.cs +++ b/Kyoo/Views/API/CollectionApi.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Kyoo.Controllers; using Kyoo.Models; using Microsoft.AspNetCore.Mvc; @@ -39,8 +40,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetShowsFromCollection(id, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetShows( + ApiHelper.ParseWhere(where, x => x.Collections.Any(y => y.ID == id)), new Sort(sortBy), new Pagination(limit, afterID)); @@ -71,8 +72,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetShowsFromCollection(slug, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetShows( + ApiHelper.ParseWhere(where, x => x.Collections.Any(y => y.Slug == slug)), new Sort(sortBy), new Pagination(limit, afterID)); @@ -103,8 +104,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetLibrariesFromCollection(id, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetLibraries( + ApiHelper.ParseWhere(where, x => x.Collections.Any(y => y.ID == id)), new Sort(sortBy), new Pagination(limit, afterID)); @@ -135,8 +136,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetLibrariesFromCollection(slug, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetLibraries( + ApiHelper.ParseWhere(where, x => x.Collections.Any(y => y.Slug == slug)), new Sort(sortBy), new Pagination(limit, afterID)); diff --git a/Kyoo/Views/API/EpisodeApi.cs b/Kyoo/Views/API/EpisodeApi.cs index af29a341..13400016 100644 --- a/Kyoo/Views/API/EpisodeApi.cs +++ b/Kyoo/Views/API/EpisodeApi.cs @@ -2,6 +2,7 @@ using Kyoo.Models; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Kyoo.CommonApi; using Kyoo.Controllers; @@ -28,7 +29,7 @@ namespace Kyoo.Api [Authorize(Policy = "Read")] public async Task> GetShow(int episodeID) { - return await _libraryManager.GetShowFromEpisode(episodeID); + return await _libraryManager.GetShow(x => x.Episodes.Any(y => y.ID == episodeID)); } [HttpGet("{showSlug}-s{seasonNumber:int}e{episodeNumber:int}/show")] @@ -49,7 +50,7 @@ namespace Kyoo.Api [Authorize(Policy = "Read")] public async Task> GetSeason(int episodeID) { - return await _libraryManager.GetSeasonFromEpisode(episodeID); + return await _libraryManager.GetSeason(x => x.Episodes.Any(y => y.ID == episodeID)); } [HttpGet("{showSlug}-s{seasonNumber:int}e{episodeNumber:int}/season")] @@ -81,8 +82,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetTracksFromEpisode(episodeID, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetTracks( + ApiHelper.ParseWhere(where, x => x.Episode.ID == episodeID), new Sort(sortBy), new Pagination(limit, afterID)); @@ -115,10 +116,10 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetTracksFromEpisode(showID, - seasonNumber, - episodeNumber, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetTracks( + ApiHelper.ParseWhere(where, x => x.Episode.ShowID == showID + && x.Episode.SeasonNumber == seasonNumber + && x.Episode.EpisodeNumber == episodeNumber), new Sort(sortBy), new Pagination(limit, afterID)); @@ -151,10 +152,9 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetTracksFromEpisode(showSlug, - seasonNumber, - episodeNumber, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetTracks(ApiHelper.ParseWhere(where, x => x.Episode.Show.Slug == showSlug + && x.Episode.SeasonNumber == seasonNumber + && x.Episode.EpisodeNumber == episodeNumber), new Sort(sortBy), new Pagination(limit, afterID)); diff --git a/Kyoo/Views/API/LibraryApi.cs b/Kyoo/Views/API/LibraryApi.cs index 86b00a66..8e573bf4 100644 --- a/Kyoo/Views/API/LibraryApi.cs +++ b/Kyoo/Views/API/LibraryApi.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using Kyoo.Controllers; using Kyoo.Models; using Microsoft.AspNetCore.Mvc; @@ -50,8 +51,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetShowsFromLibrary(id, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetShows( + ApiHelper.ParseWhere(where, x => x.Libraries.Any(y => y.ID == id)), new Sort(sortBy), new Pagination(limit, afterID)); @@ -82,8 +83,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetShowsFromLibrary(slug, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetShows( + ApiHelper.ParseWhere(where, x => x.Libraries.Any(y => y.Slug == slug)), new Sort(sortBy), new Pagination(limit, afterID)); @@ -114,8 +115,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetCollectionsFromLibrary(id, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetCollections( + ApiHelper.ParseWhere(where, x => x.Libraries.Any(y => y.ID == id)), new Sort(sortBy), new Pagination(limit, afterID)); @@ -146,8 +147,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetCollectionsFromLibrary(slug, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetCollections( + ApiHelper.ParseWhere(where, x => x.Libraries.Any(y => y.Slug == slug)), new Sort(sortBy), new Pagination(limit, afterID)); diff --git a/Kyoo/Views/API/SeasonApi.cs b/Kyoo/Views/API/SeasonApi.cs index 5825b370..819351b9 100644 --- a/Kyoo/Views/API/SeasonApi.cs +++ b/Kyoo/Views/API/SeasonApi.cs @@ -7,6 +7,7 @@ using Kyoo.Models; using Kyoo.Models.Exceptions; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using System.Linq; using Microsoft.Extensions.Configuration; namespace Kyoo.Api @@ -39,8 +40,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetEpisodesFromSeason(seasonID, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetEpisodes( + ApiHelper.ParseWhere(where, x => x.SeasonID == seasonID), new Sort(sortBy), new Pagination(limit, afterID)); @@ -72,9 +73,9 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetEpisodesFromSeason(showSlug, - seasonNumber, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetEpisodes( + ApiHelper.ParseWhere(where, x => x.Show.Slug == showSlug + && x.SeasonNumber == seasonNumber), new Sort(sortBy), new Pagination(limit, afterID)); @@ -106,9 +107,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetEpisodesFromSeason(showID, - seasonNumber, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetEpisodes( + ApiHelper.ParseWhere(where, x => x.ShowID == showID && x.SeasonNumber == seasonNumber), new Sort(sortBy), new Pagination(limit, afterID)); @@ -128,7 +128,7 @@ namespace Kyoo.Api [Authorize(Policy = "Read")] public async Task> GetShow(int seasonID) { - return await _libraryManager.GetShowFromSeason(seasonID); + return await _libraryManager.GetShow(x => x.Seasons.Any(y => y.ID == seasonID)); } [HttpGet("{showSlug}-s{seasonNumber:int}/show")] diff --git a/Kyoo/Views/API/ShowApi.cs b/Kyoo/Views/API/ShowApi.cs index 76d5436e..8e764457 100644 --- a/Kyoo/Views/API/ShowApi.cs +++ b/Kyoo/Views/API/ShowApi.cs @@ -2,6 +2,7 @@ using Kyoo.Models; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Kyoo.CommonApi; using Kyoo.Controllers; @@ -39,8 +40,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetSeasonsFromShow(showID, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetSeasons( + ApiHelper.ParseWhere(where, x => x.ShowID == showID), new Sort(sortBy), new Pagination(limit, afterID)); @@ -71,8 +72,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetSeasonsFromShow(slug, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetSeasons( + ApiHelper.ParseWhere(where, x => x.Show.Slug == slug), new Sort(sortBy), new Pagination(limit, afterID)); @@ -103,8 +104,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetEpisodesFromShow(showID, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetEpisodes( + ApiHelper.ParseWhere(where, x => x.ShowID == showID), new Sort(sortBy), new Pagination(limit, afterID)); @@ -135,8 +136,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetEpisodesFromShow(slug, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetEpisodes( + ApiHelper.ParseWhere(where, x => x.Show.Slug == slug), new Sort(sortBy), new Pagination(limit, afterID)); @@ -229,8 +230,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetGenresFromShow(showID, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetGenres( + ApiHelper.ParseWhere(where, x => x.Shows.Any(y => y.ID == showID)), new Sort(sortBy), new Pagination(limit, afterID)); @@ -261,8 +262,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetGenresFromShow(slug, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetGenres( + ApiHelper.ParseWhere(where, x => x.Shows.Any(y => y.Slug == slug)), new Sort(sortBy), new Pagination(limit, afterID)); @@ -284,7 +285,7 @@ namespace Kyoo.Api { try { - return await _libraryManager.GetStudioFromShow(showID); + return await _libraryManager.GetStudio(x => x.Shows.Any(y => y.ID == showID)); } catch (ItemNotFound) { @@ -298,7 +299,7 @@ namespace Kyoo.Api { try { - return await _libraryManager.GetStudioFromShow(slug); + return await _libraryManager.GetStudio(x => x.Shows.Any(y => y.Slug == slug)); } catch (ItemNotFound) { @@ -321,8 +322,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetLibrariesFromShow(showID, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetLibraries( + ApiHelper.ParseWhere(where, x => x.Shows.Any(y => y.ID == showID)), new Sort(sortBy), new Pagination(limit, afterID)); @@ -353,8 +354,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetLibrariesFromShow(slug, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetLibraries( + ApiHelper.ParseWhere(where, x => x.Shows.Any(y => y.Slug == slug)), new Sort(sortBy), new Pagination(limit, afterID)); @@ -385,8 +386,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetCollectionsFromShow(showID, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetCollections( + ApiHelper.ParseWhere(where, x => x.Shows.Any(y => y.ID == showID)), new Sort(sortBy), new Pagination(limit, afterID)); @@ -417,8 +418,8 @@ namespace Kyoo.Api try { - ICollection ressources = await _libraryManager.GetCollectionsFromShow(slug, - ApiHelper.ParseWhere(where), + ICollection ressources = await _libraryManager.GetCollections( + ApiHelper.ParseWhere(where, x => x.Shows.Any(y => y.Slug == slug)), new Sort(sortBy), new Pagination(limit, afterID));