diff --git a/Kyoo.Common/Utility.cs b/Kyoo.Common/Utility.cs index ae13b2f7..423edf1f 100644 --- a/Kyoo.Common/Utility.cs +++ b/Kyoo.Common/Utility.cs @@ -239,6 +239,23 @@ namespace Kyoo return types.FirstOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition() == genericType); } + public static async IAsyncEnumerable SelectAsync(this IEnumerable self, Func> mapper) + { + using IEnumerator enumerator = self.GetEnumerator(); + + while (enumerator.MoveNext()) + yield return await mapper(enumerator.Current); + } + + public static async Task> ToListAsync(this IAsyncEnumerable self) + { + List ret = new(); + + await foreach(T i in self) + ret.Add(i); + return ret; + } + public static IEnumerable IfEmpty(this IEnumerable self, Action action) { using IEnumerator enumerator = self.GetEnumerator(); diff --git a/Kyoo.CommonAPI/LocalRepository.cs b/Kyoo.CommonAPI/LocalRepository.cs index 3f2b4cf6..0be49075 100644 --- a/Kyoo.CommonAPI/LocalRepository.cs +++ b/Kyoo.CommonAPI/LocalRepository.cs @@ -15,7 +15,7 @@ using Microsoft.EntityFrameworkCore.Metadata; namespace Kyoo.Controllers { - public abstract class LocalRepository + public abstract class LocalRepository : IRepository where T : class, IResource { protected readonly DbContext Database; @@ -53,6 +53,8 @@ namespace Kyoo.Controllers return Database.Set().FirstOrDefaultAsync(predicate); } + public abstract Task> Search(string query); + public virtual Task> GetAll(Expression> where = null, Sort sort = default, Pagination limit = default) @@ -256,112 +258,4 @@ namespace Kyoo.Controllers await Delete(slug); } } - - public abstract class LocalRepository : LocalRepository, IRepository - where T : class, IResource - where TInternal : class, T, new() - { - protected LocalRepository(DbContext database) : base(database) { } - - public new Task Get(int id) - { - return base.Get(id).Cast(); - } - - public new Task Get(string slug) - { - return base.Get(slug).Cast(); - } - - public Task Get(Expression> predicate) - { - return Get(predicate.Convert>()).Cast(); - } - - public abstract Task> Search(string query); - - public virtual Task> GetAll(Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - return ApplyFilters(Database.Set(), where, sort, limit); - } - - protected virtual async Task> ApplyFilters(IQueryable query, - Expression> where = null, - Sort sort = default, - Pagination limit = default) - { - ICollection items = await ApplyFilters(query, - base.Get, - DefaultSort, - where.Convert>(), - sort.To(), - limit); - - return items.ToList(); - } - - public virtual Task GetCount(Expression> where = null) - { - IQueryable query = Database.Set(); - if (where != null) - query = query.Where(where.Convert>()); - return query.CountAsync(); - } - - Task IRepository.Create(T item) - { - if (item == null) - throw new ArgumentNullException(nameof(item)); - TInternal obj = item as TInternal ?? new TInternal(); - if (!(item is TInternal)) - Utility.Assign(obj, item); - - return Create(obj).Cast() - .Then(x => item.ID = x.ID); - } - - Task IRepository.CreateIfNotExists(T item, bool silentFail) - { - if (item == null) - throw new ArgumentNullException(nameof(item)); - TInternal obj = item as TInternal ?? new TInternal(); - if (!(item is TInternal)) - Utility.Assign(obj, item); - - return CreateIfNotExists(obj, silentFail).Cast() - .Then(x => item.ID = x.ID); - } - - public Task Edit(T edited, bool resetOld) - { - if (edited == null) - throw new ArgumentNullException(nameof(edited)); - if (edited is TInternal intern) - return Edit(intern, resetOld).Cast(); - TInternal obj = new(); - Utility.Assign(obj, edited); - return base.Edit(obj, resetOld).Cast(); - } - - public abstract override Task Delete([NotNull] TInternal obj); - - Task IRepository.Delete(T obj) - { - if (obj == null) - throw new ArgumentNullException(nameof(obj)); - if (obj is TInternal intern) - return Delete(intern); - TInternal item = new(); - Utility.Assign(item, obj); - return Delete(item); - } - - public virtual async Task DeleteRange(IEnumerable objs) - { - foreach (T obj in objs) - await ((IRepository)this).Delete(obj); - } - } } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/CollectionRepository.cs b/Kyoo/Controllers/Repositories/CollectionRepository.cs index 230e79ae..d390e41f 100644 --- a/Kyoo/Controllers/Repositories/CollectionRepository.cs +++ b/Kyoo/Controllers/Repositories/CollectionRepository.cs @@ -8,11 +8,11 @@ using Microsoft.EntityFrameworkCore; namespace Kyoo.Controllers { - public class CollectionRepository : LocalRepository, ICollectionRepository + public class CollectionRepository : LocalRepository, ICollectionRepository { private bool _disposed; private readonly DatabaseContext _database; - protected override Expression> DefaultSort => x => x.Name; + protected override Expression> DefaultSort => x => x.Name; public CollectionRepository(DatabaseContext database) : base(database) { @@ -40,10 +40,10 @@ namespace Kyoo.Controllers return await _database.Collections .Where(x => EF.Functions.ILike(x.Name, $"%{query}%")) .Take(20) - .ToListAsync(); + .ToListAsync(); } - public override async Task Create(CollectionDE obj) + public override async Task Create(Collection obj) { await base.Create(obj); _database.Entry(obj).State = EntityState.Added; @@ -51,18 +51,12 @@ namespace Kyoo.Controllers return obj; } - public override async Task Delete(CollectionDE obj) + public override async Task Delete(Collection obj) { if (obj == null) throw new ArgumentNullException(nameof(obj)); _database.Entry(obj).State = EntityState.Deleted; - if (obj.Links != null) - foreach (CollectionLink link in obj.Links) - _database.Entry(link).State = EntityState.Deleted; - if (obj.LibraryLinks != null) - foreach (LibraryLink link in obj.LibraryLinks) - _database.Entry(link).State = EntityState.Deleted; await _database.SaveChangesAsync(); } } diff --git a/Kyoo/Controllers/Repositories/EpisodeRepository.cs b/Kyoo/Controllers/Repositories/EpisodeRepository.cs index a95bfcad..e618c6b9 100644 --- a/Kyoo/Controllers/Repositories/EpisodeRepository.cs +++ b/Kyoo/Controllers/Repositories/EpisodeRepository.cs @@ -86,7 +86,7 @@ namespace Kyoo.Controllers && x.AbsoluteNumber == absoluteNumber); } - public async Task> Search(string query) + public override async Task> Search(string query) { return await _database.Episodes .Where(x => EF.Functions.ILike(x.Title, $"%{query}%")) diff --git a/Kyoo/Controllers/Repositories/GenreRepository.cs b/Kyoo/Controllers/Repositories/GenreRepository.cs index 3a2261c6..c9ef602d 100644 --- a/Kyoo/Controllers/Repositories/GenreRepository.cs +++ b/Kyoo/Controllers/Repositories/GenreRepository.cs @@ -8,11 +8,11 @@ using Microsoft.EntityFrameworkCore; namespace Kyoo.Controllers { - public class GenreRepository : LocalRepository, IGenreRepository + public class GenreRepository : LocalRepository, IGenreRepository { private bool _disposed; private readonly DatabaseContext _database; - protected override Expression> DefaultSort => x => x.Slug; + protected override Expression> DefaultSort => x => x.Slug; public GenreRepository(DatabaseContext database) : base(database) @@ -41,10 +41,10 @@ namespace Kyoo.Controllers return await _database.Genres .Where(genre => EF.Functions.ILike(genre.Name, $"%{query}%")) .Take(20) - .ToListAsync(); + .ToListAsync(); } - public override async Task Create(GenreDE obj) + public override async Task Create(Genre obj) { await base.Create(obj); _database.Entry(obj).State = EntityState.Added; @@ -52,15 +52,12 @@ namespace Kyoo.Controllers return obj; } - public override async Task Delete(GenreDE obj) + public override async Task Delete(Genre obj) { if (obj == null) throw new ArgumentNullException(nameof(obj)); _database.Entry(obj).State = EntityState.Deleted; - if (obj.Links != null) - foreach (GenreLink link in obj.Links) - _database.Entry(link).State = EntityState.Deleted; await _database.SaveChangesAsync(); } } diff --git a/Kyoo/Controllers/Repositories/LibraryItemRepository.cs b/Kyoo/Controllers/Repositories/LibraryItemRepository.cs index 0119409c..b8c5cc17 100644 --- a/Kyoo/Controllers/Repositories/LibraryItemRepository.cs +++ b/Kyoo/Controllers/Repositories/LibraryItemRepository.cs @@ -71,7 +71,7 @@ namespace Kyoo.Controllers private IQueryable ItemsQuery => _database.Shows - // .Where(x => !_database.CollectionLinks.Any(y => y.ChildID == x.ID)) + .Where(x => !_database.CollectionLinks.Any(y => y.ChildID == x.ID)) .Select(LibraryItem.FromShow) .Concat(_database.Collections .Select(LibraryItem.FromCollection)); @@ -114,18 +114,17 @@ namespace Kyoo.Controllers public override Task Delete(LibraryItem obj) => throw new InvalidOperationException(); private IQueryable LibraryRelatedQuery(Expression> selector) - => throw new NotImplementedException(); - // => _database.LibraryLinks - // .Where(selector) - // .Select(x => x.Show) - // .Where(x => x != null) - // .Where(x => !_database.CollectionLinks.Any(y => y.ChildID == x.ID)) - // .Select(LibraryItem.FromShow) - // .Concat(_database.LibraryLinks - // .Where(selector) - // .Select(x => x.Collection) - // .Where(x => x != null) - // .Select(LibraryItem.FromCollection)); + => _database.LibraryLinks + .Where(selector) + .Select(x => x.Show) + .Where(x => x != null) + .Where(x => !_database.CollectionLinks.Any(y => y.ChildID == x.ID)) + .Select(LibraryItem.FromShow) + .Concat(_database.LibraryLinks + .Where(selector) + .Select(x => x.Collection) + .Where(x => x != null) + .Select(LibraryItem.FromCollection)); public async Task> GetFromLibrary(int id, Expression> where = null, diff --git a/Kyoo/Controllers/Repositories/LibraryRepository.cs b/Kyoo/Controllers/Repositories/LibraryRepository.cs index 86cdee90..f49691a9 100644 --- a/Kyoo/Controllers/Repositories/LibraryRepository.cs +++ b/Kyoo/Controllers/Repositories/LibraryRepository.cs @@ -10,12 +10,12 @@ using Microsoft.Extensions.DependencyInjection; namespace Kyoo.Controllers { - public class LibraryRepository : LocalRepository, ILibraryRepository + public class LibraryRepository : LocalRepository, ILibraryRepository { private bool _disposed; private readonly DatabaseContext _database; private readonly IProviderRepository _providers; - protected override Expression> DefaultSort => x => x.ID; + protected override Expression> DefaultSort => x => x.ID; public LibraryRepository(DatabaseContext database, IProviderRepository providers) @@ -48,22 +48,18 @@ namespace Kyoo.Controllers return await _database.Libraries .Where(x => EF.Functions.ILike(x.Name, $"%{query}%")) .Take(20) - .ToListAsync(); + .ToListAsync(); } - public override async Task Create(LibraryDE obj) + public override async Task Create(Library obj) { await base.Create(obj); _database.Entry(obj).State = EntityState.Added; - if (obj.ProviderLinks != null) - foreach (ProviderLink entry in obj.ProviderLinks) - _database.Entry(entry).State = EntityState.Added; - await _database.SaveChangesAsync($"Trying to insert a duplicated library (slug {obj.Slug} already exists)."); return obj; } - protected override async Task Validate(LibraryDE resource) + protected override async Task Validate(Library resource) { if (string.IsNullOrEmpty(resource.Slug)) throw new ArgumentException("The library's slug must be set and not empty"); @@ -73,25 +69,18 @@ namespace Kyoo.Controllers throw new ArgumentException("The library should have a least one path."); await base.Validate(resource); - - if (resource.ProviderLinks != null) - foreach (ProviderLink link in resource.ProviderLinks) - if (ShouldValidate(link)) - link.Child = await _providers.CreateIfNotExists(link.Child, true); + + resource.Providers = await resource.Providers + .SelectAsync(x => _providers.CreateIfNotExists(x, true)) + .ToListAsync(); } - public override async Task Delete(LibraryDE obj) + public override async Task Delete(Library obj) { if (obj == null) throw new ArgumentNullException(nameof(obj)); _database.Entry(obj).State = EntityState.Deleted; - if (obj.ProviderLinks != null) - foreach (ProviderLink entry in obj.ProviderLinks) - _database.Entry(entry).State = EntityState.Deleted; - if (obj.Links != null) - foreach (LibraryLink entry in obj.Links) - _database.Entry(entry).State = EntityState.Deleted; await _database.SaveChangesAsync(); } } diff --git a/Kyoo/Controllers/Repositories/PeopleRepository.cs b/Kyoo/Controllers/Repositories/PeopleRepository.cs index f537e59b..0deecccf 100644 --- a/Kyoo/Controllers/Repositories/PeopleRepository.cs +++ b/Kyoo/Controllers/Repositories/PeopleRepository.cs @@ -49,7 +49,7 @@ namespace Kyoo.Controllers await _shows.Value.DisposeAsync(); } - public async Task> Search(string query) + public override async Task> Search(string query) { return await _database.People .Where(people => EF.Functions.ILike(people.Name, $"%{query}%")) diff --git a/Kyoo/Controllers/Repositories/ProviderRepository.cs b/Kyoo/Controllers/Repositories/ProviderRepository.cs index 9dd112c0..1d229921 100644 --- a/Kyoo/Controllers/Repositories/ProviderRepository.cs +++ b/Kyoo/Controllers/Repositories/ProviderRepository.cs @@ -19,7 +19,7 @@ namespace Kyoo.Controllers _database = database; } - public async Task> Search(string query) + public override async Task> Search(string query) { return await _database.Providers .Where(x => EF.Functions.ILike(x.Name, $"%{query}%")) diff --git a/Kyoo/Controllers/Repositories/SeasonRepository.cs b/Kyoo/Controllers/Repositories/SeasonRepository.cs index 97bd8319..5fa057be 100644 --- a/Kyoo/Controllers/Repositories/SeasonRepository.cs +++ b/Kyoo/Controllers/Repositories/SeasonRepository.cs @@ -74,7 +74,7 @@ namespace Kyoo.Controllers && x.SeasonNumber == seasonNumber); } - public async Task> Search(string query) + public override async Task> Search(string query) { return await _database.Seasons .Where(x => EF.Functions.ILike(x.Title, $"%{query}%")) diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index 339ade96..468d6404 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -9,7 +9,7 @@ using Microsoft.Extensions.DependencyInjection; namespace Kyoo.Controllers { - public class ShowRepository : LocalRepository, IShowRepository + public class ShowRepository : LocalRepository, IShowRepository { private bool _disposed; private readonly DatabaseContext _database; @@ -19,7 +19,7 @@ namespace Kyoo.Controllers private readonly IProviderRepository _providers; private readonly Lazy _seasons; private readonly Lazy _episodes; - protected override Expression> DefaultSort => x => x.Title; + protected override Expression> DefaultSort => x => x.Title; public ShowRepository(DatabaseContext database, IStudioRepository studios, @@ -81,20 +81,10 @@ namespace Kyoo.Controllers .ToListAsync(); } - public override async Task Create(ShowDE obj) + public override async Task Create(Show obj) { await base.Create(obj); _database.Entry(obj).State = EntityState.Added; - - if (obj.GenreLinks != null) - { - foreach (GenreLink entry in obj.GenreLinks) - { - if (!(entry.Child is GenreDE)) - entry.Child = new GenreDE(entry.Child); - _database.Entry(entry).State = EntityState.Added; - } - } if (obj.People != null) foreach (PeopleRole entry in obj.People) @@ -107,17 +97,16 @@ namespace Kyoo.Controllers return obj; } - protected override async Task Validate(ShowDE resource) + protected override async Task Validate(Show resource) { await base.Validate(resource); if (ShouldValidate(resource.Studio)) resource.Studio = await _studios.CreateIfNotExists(resource.Studio, true); - if (resource.GenreLinks != null) - foreach (GenreLink link in resource.GenreLinks) - if (ShouldValidate(link)) - link.Child = await _genres.CreateIfNotExists(link.Child, true); + resource.Genres = await resource.Genres + .SelectAsync(x => _genres.CreateIfNotExists(x, true)) + .ToListAsync(); if (resource.People != null) foreach (PeopleRole link in resource.People) @@ -134,32 +123,30 @@ namespace Kyoo.Controllers { if (collectionID != null) { - // await _database.CollectionLinks.AddAsync(new CollectionLink {ParentID = collectionID.Value, ChildID = showID}); + + await _database.CollectionLinks.AddAsync(new CollectionLink {ParentID = collectionID.Value, ChildID = showID}); await _database.SaveIfNoDuplicates(); } if (libraryID != null) { - // await _database.LibraryLinks.AddAsync(new LibraryLink {LibraryID = libraryID.Value, ShowID = showID}); + await _database.LibraryLinks.AddAsync(new LibraryLink {LibraryID = libraryID.Value, ShowID = showID}); await _database.SaveIfNoDuplicates(); } if (libraryID != null && collectionID != null) { - // await _database.LibraryLinks.AddAsync(new LibraryLink {LibraryID = libraryID.Value, CollectionID = collectionID.Value}); + await _database.LibraryLinks.AddAsync(new LibraryLink {LibraryID = libraryID.Value, CollectionID = collectionID.Value}); await _database.SaveIfNoDuplicates(); } } - public override async Task Delete(ShowDE obj) + public override async Task Delete(Show obj) { if (obj == null) throw new ArgumentNullException(nameof(obj)); _database.Entry(obj).State = EntityState.Deleted; - if (obj.GenreLinks != null) - foreach (GenreLink entry in obj.GenreLinks) - _database.Entry(entry).State = EntityState.Deleted; if (obj.People != null) foreach (PeopleRole entry in obj.People) @@ -168,14 +155,6 @@ namespace Kyoo.Controllers if (obj.ExternalIDs != null) foreach (MetadataID entry in obj.ExternalIDs) _database.Entry(entry).State = EntityState.Deleted; - - if (obj.CollectionLinks != null) - foreach (CollectionLink entry in obj.CollectionLinks) - _database.Entry(entry).State = EntityState.Deleted; - - if (obj.LibraryLinks != null) - foreach (LibraryLink entry in obj.LibraryLinks) - _database.Entry(entry).State = EntityState.Deleted; await _database.SaveChangesAsync(); diff --git a/Kyoo/Controllers/Repositories/StudioRepository.cs b/Kyoo/Controllers/Repositories/StudioRepository.cs index eebf0fdc..d020de24 100644 --- a/Kyoo/Controllers/Repositories/StudioRepository.cs +++ b/Kyoo/Controllers/Repositories/StudioRepository.cs @@ -19,7 +19,7 @@ namespace Kyoo.Controllers _database = database; } - public async Task> Search(string query) + public override async Task> Search(string query) { return await _database.Studios .Where(x => EF.Functions.ILike(x.Name, $"%{query}%")) diff --git a/Kyoo/Controllers/Repositories/TrackRepository.cs b/Kyoo/Controllers/Repositories/TrackRepository.cs index ee5366aa..1008dab7 100644 --- a/Kyoo/Controllers/Repositories/TrackRepository.cs +++ b/Kyoo/Controllers/Repositories/TrackRepository.cs @@ -73,7 +73,7 @@ namespace Kyoo.Controllers && x.IsForced == forced); } - public Task> Search(string query) + public override Task> Search(string query) { throw new InvalidOperationException("Tracks do not support the search method."); } diff --git a/Kyoo/Models/DatabaseContext.cs b/Kyoo/Models/DatabaseContext.cs index dc10c390..bfb049df 100644 --- a/Kyoo/Models/DatabaseContext.cs +++ b/Kyoo/Models/DatabaseContext.cs @@ -119,12 +119,6 @@ namespace Kyoo modelBuilder.Entity() .HasIndex(x => new {x.ShowID, x.SeasonNumber, x.EpisodeNumber, x.AbsoluteNumber}) .IsUnique(); - modelBuilder.Entity() - .HasIndex(x => new {x.LibraryID, x.ShowID}) - .IsUnique(); - modelBuilder.Entity() - .HasIndex(x => new {x.LibraryID, x.CollectionID}) - .IsUnique(); } public override int SaveChanges() diff --git a/Kyoo/Models/Links/CollectionLink.cs b/Kyoo/Models/Links/CollectionLink.cs deleted file mode 100644 index 9af6d1df..00000000 --- a/Kyoo/Models/Links/CollectionLink.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace Kyoo.Models -{ - public class CollectionLink : IResourceLink - { - public int ParentID { get; set; } - public virtual Collection Parent { get; set; } - public int ChildID { get; set; } - public virtual Show Child { get; set; } - - public CollectionLink() { } - - public CollectionLink(Collection parent, Show child) - { - Parent = parent; - ParentID = parent.ID; - Child = child; - ChildID = child.ID; - } - } -} \ No newline at end of file diff --git a/Kyoo/Models/Links/GenreLink.cs b/Kyoo/Models/Links/GenreLink.cs deleted file mode 100644 index 09dbde70..00000000 --- a/Kyoo/Models/Links/GenreLink.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace Kyoo.Models -{ - public class GenreLink : IResourceLink - { - public int ParentID { get; set; } - public virtual Show Parent { get; set; } - public int ChildID { get; set; } - public virtual Genre Child { get; set; } - - public GenreLink() {} - - public GenreLink(Show parent, Genre child) - { - Parent = parent; - Child = child; - } - } -} \ No newline at end of file diff --git a/Kyoo/Models/Links/LibraryLink.cs b/Kyoo/Models/Links/LibraryLink.cs deleted file mode 100644 index 22120348..00000000 --- a/Kyoo/Models/Links/LibraryLink.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace Kyoo.Models -{ - public class LibraryLink - { - public int ID { get; set; } - public int LibraryID { get; set; } - public virtual Library Library { get; set; } - public int? ShowID { get; set; } - public virtual Show Show { get; set; } - public int? CollectionID { get; set; } - public virtual Collection Collection { get; set; } - - public LibraryLink() { } - - public LibraryLink(Library library, Show show) - { - Library = library; - Show = show; - } - - public LibraryLink(Library library, Collection collection) - { - Library = library; - Collection = collection; - } - } -} \ No newline at end of file diff --git a/Kyoo/Models/Links/ProviderLink.cs b/Kyoo/Models/Links/ProviderLink.cs deleted file mode 100644 index 584af900..00000000 --- a/Kyoo/Models/Links/ProviderLink.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Newtonsoft.Json; - -namespace Kyoo.Models -{ - public class ProviderLink : IResourceLink - { - [JsonIgnore] public int ParentID { get; set; } - [JsonIgnore] public virtual Library Parent { get; set; } - [JsonIgnore] public int ChildID { get; set; } - [JsonIgnore] public virtual ProviderID Child { get; set; } - - public ProviderLink() { } - - public ProviderLink(ProviderID child, Library parent) - { - Child = child; - Parent = parent; - } - } -} \ No newline at end of file diff --git a/Kyoo/Models/Resources/CollectionDE.cs b/Kyoo/Models/Resources/CollectionDE.cs deleted file mode 100644 index 10a53852..00000000 --- a/Kyoo/Models/Resources/CollectionDE.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using Kyoo.Models.Attributes; - -namespace Kyoo.Models -{ - public class CollectionDE : Collection - { - [SerializeIgnore] [NotMergable] public virtual ICollection Links { get; set; } - [ExpressionRewrite(nameof(Links), nameof(CollectionLink.Child))] - public override ICollection Shows - { - get => Links?.Select(x => x.Child).ToList(); - set => Links = value?.Select(x => new CollectionLink(this, x)).ToList(); - } - - [SerializeIgnore] [NotMergable] public virtual ICollection LibraryLinks { get; set; } - - [ExpressionRewrite(nameof(LibraryLinks), nameof(GenreLink.Child))] - public override ICollection Libraries - { - get => LibraryLinks?.Select(x => x.Library).ToList(); - set => LibraryLinks = value?.Select(x => new LibraryLink(x, this)).ToList(); - } - - public CollectionDE() {} - - public CollectionDE(Collection collection) - { - Utility.Assign(this, collection); - } - } -} \ No newline at end of file diff --git a/Kyoo/Models/Resources/GenreDE.cs b/Kyoo/Models/Resources/GenreDE.cs deleted file mode 100644 index 0a77198e..00000000 --- a/Kyoo/Models/Resources/GenreDE.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using Kyoo.Models.Attributes; - -namespace Kyoo.Models -{ - public class GenreDE : Genre - { - [SerializeIgnore] [NotMergable] public virtual ICollection Links { get; set; } - - [ExpressionRewrite(nameof(Links), nameof(GenreLink.Child))] - [SerializeIgnore] [NotMergable] public override ICollection Shows - { - get => Links?.Select(x => x.Parent).ToList(); - set => Links = value?.Select(x => new GenreLink(x, this)).ToList(); - } - - public GenreDE() {} - - public GenreDE(Genre item) - { - Utility.Assign(this, item); - } - } -} \ No newline at end of file diff --git a/Kyoo/Models/Resources/LibraryDE.cs b/Kyoo/Models/Resources/LibraryDE.cs deleted file mode 100644 index 47c94c18..00000000 --- a/Kyoo/Models/Resources/LibraryDE.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using Kyoo.Models.Attributes; - -namespace Kyoo.Models -{ - public class LibraryDE : Library - { - [EditableRelation] [SerializeIgnore] [NotMergable] public virtual ICollection ProviderLinks { get; set; } - [ExpressionRewrite(nameof(ProviderLinks), nameof(ProviderLink.Child))] - public override ICollection Providers - { - get => ProviderLinks?.Select(x => x.Child).ToList(); - set => ProviderLinks = value?.Select(x => new ProviderLink(x, this)).ToList(); - } - - [SerializeIgnore] [NotMergable] public virtual ICollection Links { get; set; } - [ExpressionRewrite(nameof(Links), nameof(LibraryLink.Show))] - public override ICollection Shows - { - get => Links?.Where(x => x.Show != null).Select(x => x.Show).ToList(); - set => Links = Utility.MergeLists( - value?.Select(x => new LibraryLink(this, x)), - Links?.Where(x => x.Show == null))?.ToList(); - } - [ExpressionRewrite(nameof(Links), nameof(LibraryLink.Collection))] - public override ICollection Collections - { - get => Links?.Where(x => x.Collection != null).Select(x => x.Collection).ToList(); - set => Links = Utility.MergeLists( - value?.Select(x => new LibraryLink(this, x)), - Links?.Where(x => x.Collection == null))?.ToList(); - } - - public LibraryDE() {} - - public LibraryDE(Library item) - { - Utility.Assign(this, item); - } - } -} \ No newline at end of file diff --git a/Kyoo/Models/Resources/ShowDE.cs b/Kyoo/Models/Resources/ShowDE.cs deleted file mode 100644 index 7491effe..00000000 --- a/Kyoo/Models/Resources/ShowDE.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using Kyoo.Models.Attributes; - -namespace Kyoo.Models -{ - public class ShowDE : Show - { - [EditableRelation] [SerializeIgnore] [NotMergable] public virtual ICollection GenreLinks { get; set; } - [ExpressionRewrite(nameof(GenreLinks), nameof(GenreLink.Child))] - public override ICollection Genres - { - get => GenreLinks?.Select(x => x.Child).ToList(); - set => GenreLinks = value?.Select(x => new GenreLink(this, x)).ToList(); - } - - [SerializeIgnore] [NotMergable] public virtual ICollection LibraryLinks { get; set; } - [ExpressionRewrite(nameof(LibraryLinks), nameof(LibraryLink.Library))] - public override ICollection Libraries - { - get => LibraryLinks?.Select(x => x.Library).ToList(); - set => LibraryLinks = value?.Select(x => new LibraryLink(x, this)).ToList(); - } - - [SerializeIgnore] [NotMergable] public virtual ICollection CollectionLinks { get; set; } - [ExpressionRewrite(nameof(CollectionLinks), nameof(CollectionLink.Parent))] - public override ICollection Collections - { - get => CollectionLinks?.Select(x => x.Parent).ToList(); - set => CollectionLinks = value?.Select(x => new CollectionLink(x, this)).ToList(); - } - - public ShowDE() {} - - public ShowDE(Show show) - { - Utility.Assign(this, show); - } - } -} \ No newline at end of file