From 6cb7946569577ab628b2563acc6e82296102860f Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Fri, 19 Jun 2020 19:10:08 +0200 Subject: [PATCH 01/12] Starting to rightfully handle the delete function --- Kyoo.Common/Controllers/IRepository.cs | 2 +- Kyoo.Common/Models/Show.cs | 16 ++++++++++++++ .../Repositories/EpisodeRepository.cs | 6 ++++++ .../Repositories/GenreRepository.cs | 2 +- .../Repositories/LibraryRepository.cs | 7 ++++++- .../Repositories/PeopleRepository.cs | 7 ++++++- .../Repositories/ProviderRepository.cs | 4 +++- .../Repositories/SeasonRepository.cs | 7 ++++++- .../Repositories/ShowRepository.cs | 21 +++++++++++++++++-- .../Repositories/StudioRepository.cs | 4 +++- .../Repositories/TrackRepository.cs | 4 +++- Kyoo/Models/DatabaseContext.cs | 4 +++- 12 files changed, 73 insertions(+), 11 deletions(-) diff --git a/Kyoo.Common/Controllers/IRepository.cs b/Kyoo.Common/Controllers/IRepository.cs index e1587908..e4c64b04 100644 --- a/Kyoo.Common/Controllers/IRepository.cs +++ b/Kyoo.Common/Controllers/IRepository.cs @@ -15,7 +15,7 @@ namespace Kyoo.Controllers Task Create([NotNull] T obj); Task CreateIfNotExists([NotNull] T obj); Task Edit([NotNull] T edited, bool resetOld); - Task Delete(T obj); + Task Delete([NotNull] T obj); } public interface IShowRepository : IRepository diff --git a/Kyoo.Common/Models/Show.cs b/Kyoo.Common/Models/Show.cs index a79ef71e..513bca0f 100644 --- a/Kyoo.Common/Models/Show.cs +++ b/Kyoo.Common/Models/Show.cs @@ -41,6 +41,22 @@ namespace Kyoo.Models [JsonIgnore] public virtual IEnumerable People { get; set; } [JsonIgnore] public virtual IEnumerable Seasons { get; set; } [JsonIgnore] public virtual IEnumerable Episodes { get; set; } + + [NotMergable] [JsonIgnore] public virtual IEnumerable LibraryLinks { get; set; } + + [NotMergable] [JsonIgnore] public IEnumerable Libraries + { + get => LibraryLinks?.Select(x => x.Library); + set => LibraryLinks = value?.Select(x => new LibraryLink(x, this)); + } + + [NotMergable] [JsonIgnore] public IEnumerable CollectionLinks { get; set; } + + [NotMergable] [JsonIgnore] public IEnumerable Collections + { + get => CollectionLinks.Select(x => x.Collection); + set => CollectionLinks = value?.Select(x => new CollectionLink(x, this)); + } public Show() { } diff --git a/Kyoo/Controllers/Repositories/EpisodeRepository.cs b/Kyoo/Controllers/Repositories/EpisodeRepository.cs index 4c698bbc..94a8c9b4 100644 --- a/Kyoo/Controllers/Repositories/EpisodeRepository.cs +++ b/Kyoo/Controllers/Repositories/EpisodeRepository.cs @@ -155,6 +155,12 @@ namespace Kyoo.Controllers public async Task Delete(Episode obj) { + if (obj.ExternalIDs != null) + foreach (MetadataID entry in obj.ExternalIDs) + _database.Entry(entry).State = EntityState.Deleted; + if (obj.Tracks != null) + foreach (Track entry in obj.Tracks) + _database.Entry(entry).State = EntityState.Deleted; _database.Episodes.Remove(obj); await _database.SaveChangesAsync(); } diff --git a/Kyoo/Controllers/Repositories/GenreRepository.cs b/Kyoo/Controllers/Repositories/GenreRepository.cs index a49249a8..91a4a295 100644 --- a/Kyoo/Controllers/Repositories/GenreRepository.cs +++ b/Kyoo/Controllers/Repositories/GenreRepository.cs @@ -56,7 +56,7 @@ namespace Kyoo.Controllers if (obj == null) throw new ArgumentNullException(nameof(obj)); - await _database.Genres.AddAsync(obj); + _database.Entry(obj).State = EntityState.Added; try { diff --git a/Kyoo/Controllers/Repositories/LibraryRepository.cs b/Kyoo/Controllers/Repositories/LibraryRepository.cs index 133b47fe..4f8a235b 100644 --- a/Kyoo/Controllers/Repositories/LibraryRepository.cs +++ b/Kyoo/Controllers/Repositories/LibraryRepository.cs @@ -126,7 +126,12 @@ namespace Kyoo.Controllers public async Task Delete(Library obj) { - _database.Libraries.Remove(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; await _database.SaveChangesAsync(); } } diff --git a/Kyoo/Controllers/Repositories/PeopleRepository.cs b/Kyoo/Controllers/Repositories/PeopleRepository.cs index a1689f25..3cd013f5 100644 --- a/Kyoo/Controllers/Repositories/PeopleRepository.cs +++ b/Kyoo/Controllers/Repositories/PeopleRepository.cs @@ -125,7 +125,12 @@ namespace Kyoo.Controllers public async Task Delete(People obj) { - _database.Peoples.Remove(obj); + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + _database.Entry(obj).State = EntityState.Deleted; + if (obj.ExternalIDs != null) + foreach (MetadataID entry in obj.ExternalIDs) + _database.Entry(entry).State = EntityState.Deleted; await _database.SaveChangesAsync(); } } diff --git a/Kyoo/Controllers/Repositories/ProviderRepository.cs b/Kyoo/Controllers/Repositories/ProviderRepository.cs index ab1abee9..51bb38fb 100644 --- a/Kyoo/Controllers/Repositories/ProviderRepository.cs +++ b/Kyoo/Controllers/Repositories/ProviderRepository.cs @@ -112,7 +112,9 @@ namespace Kyoo.Controllers public async Task Delete(ProviderID obj) { - _database.Providers.Remove(obj); + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + _database.Entry(obj).State = EntityState.Deleted; await _database.SaveChangesAsync(); } } diff --git a/Kyoo/Controllers/Repositories/SeasonRepository.cs b/Kyoo/Controllers/Repositories/SeasonRepository.cs index da117095..33d1dd3b 100644 --- a/Kyoo/Controllers/Repositories/SeasonRepository.cs +++ b/Kyoo/Controllers/Repositories/SeasonRepository.cs @@ -144,7 +144,12 @@ namespace Kyoo.Controllers public async Task Delete(Season obj) { - _database.Seasons.Remove(obj); + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + _database.Entry(obj).State = EntityState.Deleted; + if (obj.ExternalIDs != null) + foreach (MetadataID entry in obj.ExternalIDs) + _database.Entry(entry).State = EntityState.Deleted; await _database.SaveChangesAsync(); } diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index 7783cb82..4018d2e8 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -163,9 +163,26 @@ namespace Kyoo.Controllers } } - public async Task Delete(Show show) + public async Task Delete(Show obj) { - _database.Shows.Remove(show); + 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 (PeopleLink entry in obj.People) + _database.Entry(entry).State = EntityState.Deleted; + 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 8e7c3a02..4ca73397 100644 --- a/Kyoo/Controllers/Repositories/StudioRepository.cs +++ b/Kyoo/Controllers/Repositories/StudioRepository.cs @@ -111,7 +111,9 @@ namespace Kyoo.Controllers public async Task Delete(Studio obj) { - _database.Studios.Remove(obj); + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + _database.Entry(obj).State = EntityState.Deleted; await _database.SaveChangesAsync(); } } diff --git a/Kyoo/Controllers/Repositories/TrackRepository.cs b/Kyoo/Controllers/Repositories/TrackRepository.cs index 711ca9f7..d44cc45d 100644 --- a/Kyoo/Controllers/Repositories/TrackRepository.cs +++ b/Kyoo/Controllers/Repositories/TrackRepository.cs @@ -101,7 +101,9 @@ namespace Kyoo.Controllers public async Task Delete(Track obj) { - _database.Tracks.Remove(obj); + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + _database.Entry(obj).State = EntityState.Deleted; await _database.SaveChangesAsync(); } } diff --git a/Kyoo/Models/DatabaseContext.cs b/Kyoo/Models/DatabaseContext.cs index 86e3aea1..0c77f0eb 100644 --- a/Kyoo/Models/DatabaseContext.cs +++ b/Kyoo/Models/DatabaseContext.cs @@ -116,7 +116,9 @@ namespace Kyoo .Ignore(x => x.Shows); modelBuilder.Entity() - .Ignore(x => x.Genres); + .Ignore(x => x.Genres) + .Ignore(x => x.Libraries) + .Ignore(x => x.Collections); modelBuilder.Entity() .Ignore(x => x.Slug) From 15d8173433177a6842941f397fdb1c72a1b544ab Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Fri, 19 Jun 2020 19:11:39 +0200 Subject: [PATCH 02/12] Handle null references to the delete function --- Kyoo/Controllers/Repositories/CollectionRepository.cs | 2 ++ Kyoo/Controllers/Repositories/EpisodeRepository.cs | 3 +++ Kyoo/Controllers/Repositories/GenreRepository.cs | 3 +++ Kyoo/Controllers/Repositories/LibraryRepository.cs | 1 + Kyoo/Controllers/Repositories/PeopleRepository.cs | 1 + Kyoo/Controllers/Repositories/ProviderRepository.cs | 1 + Kyoo/Controllers/Repositories/SeasonRepository.cs | 1 + Kyoo/Controllers/Repositories/ShowRepository.cs | 1 + Kyoo/Controllers/Repositories/StudioRepository.cs | 1 + Kyoo/Controllers/Repositories/TrackRepository.cs | 1 + 10 files changed, 15 insertions(+) diff --git a/Kyoo/Controllers/Repositories/CollectionRepository.cs b/Kyoo/Controllers/Repositories/CollectionRepository.cs index 6e0151ef..4b2f4786 100644 --- a/Kyoo/Controllers/Repositories/CollectionRepository.cs +++ b/Kyoo/Controllers/Repositories/CollectionRepository.cs @@ -113,6 +113,8 @@ namespace Kyoo.Controllers public async Task Delete(Collection obj) { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); _database.Collections.Remove(obj); await _database.SaveChangesAsync(); } diff --git a/Kyoo/Controllers/Repositories/EpisodeRepository.cs b/Kyoo/Controllers/Repositories/EpisodeRepository.cs index 94a8c9b4..a60e1b20 100644 --- a/Kyoo/Controllers/Repositories/EpisodeRepository.cs +++ b/Kyoo/Controllers/Repositories/EpisodeRepository.cs @@ -155,6 +155,9 @@ namespace Kyoo.Controllers public async Task Delete(Episode obj) { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + if (obj.ExternalIDs != null) foreach (MetadataID entry in obj.ExternalIDs) _database.Entry(entry).State = EntityState.Deleted; diff --git a/Kyoo/Controllers/Repositories/GenreRepository.cs b/Kyoo/Controllers/Repositories/GenreRepository.cs index 91a4a295..116dd0ec 100644 --- a/Kyoo/Controllers/Repositories/GenreRepository.cs +++ b/Kyoo/Controllers/Repositories/GenreRepository.cs @@ -113,6 +113,9 @@ namespace Kyoo.Controllers public async Task Delete(Genre obj) { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + _database.Genres.Remove(obj); await _database.SaveChangesAsync(); } diff --git a/Kyoo/Controllers/Repositories/LibraryRepository.cs b/Kyoo/Controllers/Repositories/LibraryRepository.cs index 4f8a235b..dbbd5989 100644 --- a/Kyoo/Controllers/Repositories/LibraryRepository.cs +++ b/Kyoo/Controllers/Repositories/LibraryRepository.cs @@ -128,6 +128,7 @@ namespace Kyoo.Controllers { if (obj == null) throw new ArgumentNullException(nameof(obj)); + _database.Entry(obj).State = EntityState.Deleted; if (obj.ProviderLinks != null) foreach (ProviderLink entry in obj.ProviderLinks) diff --git a/Kyoo/Controllers/Repositories/PeopleRepository.cs b/Kyoo/Controllers/Repositories/PeopleRepository.cs index 3cd013f5..8f918905 100644 --- a/Kyoo/Controllers/Repositories/PeopleRepository.cs +++ b/Kyoo/Controllers/Repositories/PeopleRepository.cs @@ -127,6 +127,7 @@ namespace Kyoo.Controllers { if (obj == null) throw new ArgumentNullException(nameof(obj)); + _database.Entry(obj).State = EntityState.Deleted; if (obj.ExternalIDs != null) foreach (MetadataID entry in obj.ExternalIDs) diff --git a/Kyoo/Controllers/Repositories/ProviderRepository.cs b/Kyoo/Controllers/Repositories/ProviderRepository.cs index 51bb38fb..fffd7ffe 100644 --- a/Kyoo/Controllers/Repositories/ProviderRepository.cs +++ b/Kyoo/Controllers/Repositories/ProviderRepository.cs @@ -114,6 +114,7 @@ namespace Kyoo.Controllers { if (obj == null) throw new ArgumentNullException(nameof(obj)); + _database.Entry(obj).State = EntityState.Deleted; await _database.SaveChangesAsync(); } diff --git a/Kyoo/Controllers/Repositories/SeasonRepository.cs b/Kyoo/Controllers/Repositories/SeasonRepository.cs index 33d1dd3b..a91163a6 100644 --- a/Kyoo/Controllers/Repositories/SeasonRepository.cs +++ b/Kyoo/Controllers/Repositories/SeasonRepository.cs @@ -146,6 +146,7 @@ namespace Kyoo.Controllers { if (obj == null) throw new ArgumentNullException(nameof(obj)); + _database.Entry(obj).State = EntityState.Deleted; if (obj.ExternalIDs != null) foreach (MetadataID entry in obj.ExternalIDs) diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index 4018d2e8..1be13aba 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -167,6 +167,7 @@ namespace Kyoo.Controllers { if (obj == null) throw new ArgumentNullException(nameof(obj)); + _database.Entry(obj).State = EntityState.Deleted; if (obj.GenreLinks != null) foreach (GenreLink entry in obj.GenreLinks) diff --git a/Kyoo/Controllers/Repositories/StudioRepository.cs b/Kyoo/Controllers/Repositories/StudioRepository.cs index 4ca73397..2c598756 100644 --- a/Kyoo/Controllers/Repositories/StudioRepository.cs +++ b/Kyoo/Controllers/Repositories/StudioRepository.cs @@ -113,6 +113,7 @@ namespace Kyoo.Controllers { if (obj == null) throw new ArgumentNullException(nameof(obj)); + _database.Entry(obj).State = EntityState.Deleted; await _database.SaveChangesAsync(); } diff --git a/Kyoo/Controllers/Repositories/TrackRepository.cs b/Kyoo/Controllers/Repositories/TrackRepository.cs index d44cc45d..25d034e2 100644 --- a/Kyoo/Controllers/Repositories/TrackRepository.cs +++ b/Kyoo/Controllers/Repositories/TrackRepository.cs @@ -103,6 +103,7 @@ namespace Kyoo.Controllers { if (obj == null) throw new ArgumentNullException(nameof(obj)); + _database.Entry(obj).State = EntityState.Deleted; await _database.SaveChangesAsync(); } From 2aa87378fcb096480786fb501e92a620353dfd6d Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Fri, 19 Jun 2020 19:20:19 +0200 Subject: [PATCH 03/12] Handling related data in the collection delete --- Kyoo.Common/Models/Collection.cs | 8 ++++++++ Kyoo/Controllers/Repositories/CollectionRepository.cs | 9 ++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Kyoo.Common/Models/Collection.cs b/Kyoo.Common/Models/Collection.cs index 98881da2..5336c52c 100644 --- a/Kyoo.Common/Models/Collection.cs +++ b/Kyoo.Common/Models/Collection.cs @@ -19,6 +19,14 @@ namespace Kyoo.Models get => Links.Select(x => x.Show); set => Links = value.Select(x => new CollectionLink(this, x)); } + + [NotMergable] [JsonIgnore] public virtual IEnumerable LibraryLinks { get; set; } + + [NotMergable] [JsonIgnore] public IEnumerable Libraries + { + get => LibraryLinks?.Select(x => x.Library); + set => LibraryLinks = value?.Select(x => new LibraryLink(x, this)); + } public Collection() { } diff --git a/Kyoo/Controllers/Repositories/CollectionRepository.cs b/Kyoo/Controllers/Repositories/CollectionRepository.cs index 4b2f4786..5e3fcd43 100644 --- a/Kyoo/Controllers/Repositories/CollectionRepository.cs +++ b/Kyoo/Controllers/Repositories/CollectionRepository.cs @@ -115,7 +115,14 @@ namespace Kyoo.Controllers { if (obj == null) throw new ArgumentNullException(nameof(obj)); - _database.Collections.Remove(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(); } } From 40c3fcbb91487a3c1f3a8bbef560f8198a9202c5 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Fri, 19 Jun 2020 19:25:19 +0200 Subject: [PATCH 04/12] The EpisodeRepository now uses the TrackRepository --- Kyoo/Controllers/Repositories/EpisodeRepository.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Kyoo/Controllers/Repositories/EpisodeRepository.cs b/Kyoo/Controllers/Repositories/EpisodeRepository.cs index a60e1b20..c26aae88 100644 --- a/Kyoo/Controllers/Repositories/EpisodeRepository.cs +++ b/Kyoo/Controllers/Repositories/EpisodeRepository.cs @@ -12,12 +12,14 @@ namespace Kyoo.Controllers { private readonly DatabaseContext _database; private readonly IProviderRepository _providers; + private readonly ITrackRepository _tracks; - public EpisodeRepository(DatabaseContext database, IProviderRepository providers) + public EpisodeRepository(DatabaseContext database, IProviderRepository providers, ITrackRepository tracks) { _database = database; _providers = providers; + _tracks = tracks; } public void Dispose() @@ -83,10 +85,11 @@ namespace Kyoo.Controllers if (obj.ExternalIDs != null) foreach (MetadataID entry in obj.ExternalIDs) _database.Entry(entry).State = EntityState.Added; - if (obj.Tracks != null) - foreach (Track entry in obj.Tracks) - _database.Entry(entry).State = EntityState.Added; + if (obj.Tracks != null) + foreach (Track track in obj.Tracks) + await _tracks.Create(track); + try { await _database.SaveChangesAsync(); @@ -163,7 +166,7 @@ namespace Kyoo.Controllers _database.Entry(entry).State = EntityState.Deleted; if (obj.Tracks != null) foreach (Track entry in obj.Tracks) - _database.Entry(entry).State = EntityState.Deleted; + await _tracks.Delete(entry); _database.Episodes.Remove(obj); await _database.SaveChangesAsync(); } From 25274548c48674f51e6d2d6de3c2a0800db10f66 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Fri, 19 Jun 2020 19:29:34 +0200 Subject: [PATCH 05/12] Handlink genre link deletion --- Kyoo.Common/Models/Genre.cs | 13 +++++++++++-- Kyoo/Controllers/Repositories/GenreRepository.cs | 7 +++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Kyoo.Common/Models/Genre.cs b/Kyoo.Common/Models/Genre.cs index 1935189e..d4c43ce1 100644 --- a/Kyoo.Common/Models/Genre.cs +++ b/Kyoo.Common/Models/Genre.cs @@ -1,4 +1,7 @@ -using Newtonsoft.Json; +using System.Collections.Generic; +using System.Linq; +using Kyoo.Models.Attributes; +using Newtonsoft.Json; namespace Kyoo.Models { @@ -8,7 +11,13 @@ namespace Kyoo.Models public string Slug { get; set; } public string Name { get; set; } - // public IEnumerable Shows { get; set; } + [NotMergable] [JsonIgnore] public IEnumerable Links { get; set; } + + [NotMergable] [JsonIgnore] public IEnumerable Shows + { + get => Links.Select(x => x.Show); + set => Links = value?.Select(x => new GenreLink(x, this)); + } public Genre() {} diff --git a/Kyoo/Controllers/Repositories/GenreRepository.cs b/Kyoo/Controllers/Repositories/GenreRepository.cs index 116dd0ec..a9e444ea 100644 --- a/Kyoo/Controllers/Repositories/GenreRepository.cs +++ b/Kyoo/Controllers/Repositories/GenreRepository.cs @@ -115,8 +115,11 @@ namespace Kyoo.Controllers { if (obj == null) throw new ArgumentNullException(nameof(obj)); - - _database.Genres.Remove(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(); } } From 8ffa7b61fa325d1d3cd429f8ad8a1d06d334bb98 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Fri, 19 Jun 2020 19:30:36 +0200 Subject: [PATCH 06/12] Handling library links on deletion --- Kyoo/Controllers/Repositories/LibraryRepository.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Kyoo/Controllers/Repositories/LibraryRepository.cs b/Kyoo/Controllers/Repositories/LibraryRepository.cs index dbbd5989..c6171bc0 100644 --- a/Kyoo/Controllers/Repositories/LibraryRepository.cs +++ b/Kyoo/Controllers/Repositories/LibraryRepository.cs @@ -133,6 +133,9 @@ namespace Kyoo.Controllers 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(); } } From 04fae1fc65c5511143ecf88a2b20513c2a77f37c Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Fri, 19 Jun 2020 19:53:39 +0200 Subject: [PATCH 07/12] Handling people link deletion --- Kyoo/Controllers/Repositories/PeopleRepository.cs | 3 +++ Kyoo/Controllers/Repositories/ProviderRepository.cs | 1 + 2 files changed, 4 insertions(+) diff --git a/Kyoo/Controllers/Repositories/PeopleRepository.cs b/Kyoo/Controllers/Repositories/PeopleRepository.cs index 8f918905..6c3eb0c6 100644 --- a/Kyoo/Controllers/Repositories/PeopleRepository.cs +++ b/Kyoo/Controllers/Repositories/PeopleRepository.cs @@ -132,6 +132,9 @@ namespace Kyoo.Controllers if (obj.ExternalIDs != null) foreach (MetadataID entry in obj.ExternalIDs) _database.Entry(entry).State = EntityState.Deleted; + if (obj.Roles != null) + foreach (PeopleLink link in obj.Roles) + _database.Entry(link).State = EntityState.Deleted; await _database.SaveChangesAsync(); } } diff --git a/Kyoo/Controllers/Repositories/ProviderRepository.cs b/Kyoo/Controllers/Repositories/ProviderRepository.cs index fffd7ffe..156f9440 100644 --- a/Kyoo/Controllers/Repositories/ProviderRepository.cs +++ b/Kyoo/Controllers/Repositories/ProviderRepository.cs @@ -116,6 +116,7 @@ namespace Kyoo.Controllers throw new ArgumentNullException(nameof(obj)); _database.Entry(obj).State = EntityState.Deleted; + // TODO handle ExternalID deletion when they refer to this providerID. await _database.SaveChangesAsync(); } } From 48fc4fd249263420a1a84bd9f04772d5aabe2e47 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sat, 20 Jun 2020 18:08:19 +0200 Subject: [PATCH 08/12] Handling related entities for seasons, shows & studios --- .../Repositories/SeasonRepository.cs | 7 +++- .../Repositories/ShowRepository.cs | 33 +++++++++++-------- .../Repositories/StudioRepository.cs | 4 +++ 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/Kyoo/Controllers/Repositories/SeasonRepository.cs b/Kyoo/Controllers/Repositories/SeasonRepository.cs index a91163a6..e27cf755 100644 --- a/Kyoo/Controllers/Repositories/SeasonRepository.cs +++ b/Kyoo/Controllers/Repositories/SeasonRepository.cs @@ -12,12 +12,14 @@ namespace Kyoo.Controllers { private readonly DatabaseContext _database; private readonly IProviderRepository _providers; + private readonly IEpisodeRepository _episodes; - public SeasonRepository(DatabaseContext database, IProviderRepository providers) + public SeasonRepository(DatabaseContext database, IProviderRepository providers, IEpisodeRepository episodes) { _database = database; _providers = providers; + _episodes = episodes; } public void Dispose() @@ -151,6 +153,9 @@ namespace Kyoo.Controllers if (obj.ExternalIDs != null) foreach (MetadataID entry in obj.ExternalIDs) _database.Entry(entry).State = EntityState.Deleted; + if (obj.Episodes != null) + foreach (Episode episode in obj.Episodes) + await _episodes.Delete(episode); await _database.SaveChangesAsync(); } diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index 1be13aba..6821e61f 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -15,18 +15,24 @@ namespace Kyoo.Controllers private readonly IPeopleRepository _people; private readonly IGenreRepository _genres; private readonly IProviderRepository _providers; + private readonly ISeasonRepository _seasons; + private readonly IEpisodeRepository _episodes; public ShowRepository(DatabaseContext database, IStudioRepository studios, IPeopleRepository people, IGenreRepository genres, - IProviderRepository providers) + IProviderRepository providers, + ISeasonRepository seasons, + IEpisodeRepository episodes) { _database = database; _studios = studios; _people = people; _genres = genres; _providers = providers; + _seasons = seasons; + _episodes = episodes; } public void Dispose() @@ -40,19 +46,19 @@ namespace Kyoo.Controllers await Task.WhenAll(_database.DisposeAsync().AsTask(), _studios.DisposeAsync().AsTask()); } - public async Task Get(int id) + public Task Get(int id) { - return await _database.Shows.FirstOrDefaultAsync(x => x.ID == id); + return _database.Shows.FirstOrDefaultAsync(x => x.ID == id); } - public async Task Get(string slug) + public Task Get(string slug) { - return await _database.Shows.FirstOrDefaultAsync(x => x.Slug == slug); + return _database.Shows.FirstOrDefaultAsync(x => x.Slug == slug); } - public async Task GetByPath(string path) + public Task GetByPath(string path) { - return await _database.Shows.FirstOrDefaultAsync(x => x.Path == path); + return _database.Shows.FirstOrDefaultAsync(x => x.Path == path); } public async Task> Search(string query) @@ -145,22 +151,16 @@ namespace Kyoo.Controllers obj.StudioID = await _studios.CreateIfNotExists(obj.Studio); if (obj.GenreLinks != null) - { foreach (GenreLink link in obj.GenreLinks) link.GenreID = await _genres.CreateIfNotExists(link.Genre); - } if (obj.People != null) - { foreach (PeopleLink link in obj.People) link.PeopleID = await _people.CreateIfNotExists(link.People); - } if (obj.ExternalIDs != null) - { foreach (MetadataID link in obj.ExternalIDs) link.ProviderID = await _providers.CreateIfNotExists(link.Provider); - } } public async Task Delete(Show obj) @@ -184,6 +184,13 @@ namespace Kyoo.Controllers if (obj.LibraryLinks != null) foreach (LibraryLink entry in obj.LibraryLinks) _database.Entry(entry).State = EntityState.Deleted; + + if (obj.Seasons != null) + foreach (Season season in obj.Seasons) + await _seasons.Delete(season); + if (obj.Episodes != null) + foreach (Episode episode in obj.Episodes.Where(x => x.SeasonID == null)) + await _episodes.Delete(episode); await _database.SaveChangesAsync(); } diff --git a/Kyoo/Controllers/Repositories/StudioRepository.cs b/Kyoo/Controllers/Repositories/StudioRepository.cs index 2c598756..c9b56777 100644 --- a/Kyoo/Controllers/Repositories/StudioRepository.cs +++ b/Kyoo/Controllers/Repositories/StudioRepository.cs @@ -115,6 +115,10 @@ namespace Kyoo.Controllers throw new ArgumentNullException(nameof(obj)); _database.Entry(obj).State = EntityState.Deleted; + + // Using Dotnet-EF change discovery service to remove references to this studio on shows. + foreach (Show show in obj.Shows) + show.StudioID = null; await _database.SaveChangesAsync(); } } From 0952197cf6759da6b461bf06cb69a79cfb6de5b3 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sat, 20 Jun 2020 18:14:23 +0200 Subject: [PATCH 09/12] Adding id & slug based delete --- Kyoo.Common/Controllers/IRepository.cs | 4 ++++ .../Repositories/CollectionRepository.cs | 12 ++++++++++++ .../Repositories/EpisodeRepository.cs | 18 ++++++++++++++++++ .../Repositories/GenreRepository.cs | 12 ++++++++++++ .../Repositories/LibraryRepository.cs | 12 ++++++++++++ .../Repositories/PeopleRepository.cs | 12 ++++++++++++ .../Repositories/ProviderRepository.cs | 12 ++++++++++++ .../Repositories/SeasonRepository.cs | 18 ++++++++++++++++++ .../Controllers/Repositories/ShowRepository.cs | 12 ++++++++++++ .../Repositories/StudioRepository.cs | 12 ++++++++++++ .../Repositories/TrackRepository.cs | 12 ++++++++++++ 11 files changed, 136 insertions(+) diff --git a/Kyoo.Common/Controllers/IRepository.cs b/Kyoo.Common/Controllers/IRepository.cs index e4c64b04..705ff12f 100644 --- a/Kyoo.Common/Controllers/IRepository.cs +++ b/Kyoo.Common/Controllers/IRepository.cs @@ -15,6 +15,8 @@ namespace Kyoo.Controllers Task Create([NotNull] T obj); Task CreateIfNotExists([NotNull] T obj); Task Edit([NotNull] T edited, bool resetOld); + Task Delete(int id); + Task Delete(string slug); Task Delete([NotNull] T obj); } @@ -27,6 +29,7 @@ namespace Kyoo.Controllers public interface ISeasonRepository : IRepository { Task Get(string showSlug, int seasonNumber); + Task Delete(string showSlug, int seasonNumber); Task> GetSeasons(int showID); Task> GetSeasons(string showSlug); @@ -35,6 +38,7 @@ namespace Kyoo.Controllers public interface IEpisodeRepository : IRepository { Task Get(string showSlug, int seasonNumber, int episodeNumber); + Task Delete(string showSlug, int seasonNumber, int episodeNumber); Task> GetEpisodes(int showID, int seasonNumber); Task> GetEpisodes(string showSlug, int seasonNumber); diff --git a/Kyoo/Controllers/Repositories/CollectionRepository.cs b/Kyoo/Controllers/Repositories/CollectionRepository.cs index 5e3fcd43..139df7d4 100644 --- a/Kyoo/Controllers/Repositories/CollectionRepository.cs +++ b/Kyoo/Controllers/Repositories/CollectionRepository.cs @@ -111,6 +111,18 @@ namespace Kyoo.Controllers await _database.SaveChangesAsync(); } + public async Task Delete(int id) + { + Collection obj = await Get(id); + await Delete(obj); + } + + public async Task Delete(string slug) + { + Collection obj = await Get(slug); + await Delete(obj); + } + public async Task Delete(Collection obj) { if (obj == null) diff --git a/Kyoo/Controllers/Repositories/EpisodeRepository.cs b/Kyoo/Controllers/Repositories/EpisodeRepository.cs index c26aae88..ca7e4027 100644 --- a/Kyoo/Controllers/Repositories/EpisodeRepository.cs +++ b/Kyoo/Controllers/Repositories/EpisodeRepository.cs @@ -156,6 +156,24 @@ namespace Kyoo.Controllers } } + public async Task Delete(int id) + { + Episode obj = await Get(id); + await Delete(obj); + } + + public async Task Delete(string slug) + { + Episode obj = await Get(slug); + await Delete(obj); + } + + public async Task Delete(string showSlug, int seasonNumber, int episodeNumber) + { + Episode obj = await Get(showSlug, seasonNumber, episodeNumber); + await Delete(obj); + } + public async Task Delete(Episode obj) { if (obj == null) diff --git a/Kyoo/Controllers/Repositories/GenreRepository.cs b/Kyoo/Controllers/Repositories/GenreRepository.cs index a9e444ea..0da62f6d 100644 --- a/Kyoo/Controllers/Repositories/GenreRepository.cs +++ b/Kyoo/Controllers/Repositories/GenreRepository.cs @@ -110,6 +110,18 @@ namespace Kyoo.Controllers Utility.Merge(old, edited); await _database.SaveChangesAsync(); } + + public async Task Delete(int id) + { + Genre obj = await Get(id); + await Delete(obj); + } + + public async Task Delete(string slug) + { + Genre obj = await Get(slug); + await Delete(obj); + } public async Task Delete(Genre obj) { diff --git a/Kyoo/Controllers/Repositories/LibraryRepository.cs b/Kyoo/Controllers/Repositories/LibraryRepository.cs index c6171bc0..5f29e98e 100644 --- a/Kyoo/Controllers/Repositories/LibraryRepository.cs +++ b/Kyoo/Controllers/Repositories/LibraryRepository.cs @@ -124,6 +124,18 @@ namespace Kyoo.Controllers link.ProviderID = await _providers.CreateIfNotExists(link.Provider); } + public async Task Delete(int id) + { + Library obj = await Get(id); + await Delete(obj); + } + + public async Task Delete(string slug) + { + Library obj = await Get(slug); + await Delete(obj); + } + public async Task Delete(Library obj) { if (obj == null) diff --git a/Kyoo/Controllers/Repositories/PeopleRepository.cs b/Kyoo/Controllers/Repositories/PeopleRepository.cs index 6c3eb0c6..60102aff 100644 --- a/Kyoo/Controllers/Repositories/PeopleRepository.cs +++ b/Kyoo/Controllers/Repositories/PeopleRepository.cs @@ -122,6 +122,18 @@ namespace Kyoo.Controllers foreach (MetadataID link in obj.ExternalIDs) link.ProviderID = await _providers.CreateIfNotExists(link.Provider); } + + public async Task Delete(int id) + { + People obj = await Get(id); + await Delete(obj); + } + + public async Task Delete(string slug) + { + People obj = await Get(slug); + await Delete(obj); + } public async Task Delete(People obj) { diff --git a/Kyoo/Controllers/Repositories/ProviderRepository.cs b/Kyoo/Controllers/Repositories/ProviderRepository.cs index 156f9440..0ed4614d 100644 --- a/Kyoo/Controllers/Repositories/ProviderRepository.cs +++ b/Kyoo/Controllers/Repositories/ProviderRepository.cs @@ -110,6 +110,18 @@ namespace Kyoo.Controllers await _database.SaveChangesAsync(); } + public async Task Delete(int id) + { + ProviderID obj = await Get(id); + await Delete(obj); + } + + public async Task Delete(string slug) + { + ProviderID obj = await Get(slug); + await Delete(obj); + } + public async Task Delete(ProviderID obj) { if (obj == null) diff --git a/Kyoo/Controllers/Repositories/SeasonRepository.cs b/Kyoo/Controllers/Repositories/SeasonRepository.cs index e27cf755..7ed56125 100644 --- a/Kyoo/Controllers/Repositories/SeasonRepository.cs +++ b/Kyoo/Controllers/Repositories/SeasonRepository.cs @@ -143,6 +143,24 @@ namespace Kyoo.Controllers link.ProviderID = await _providers.CreateIfNotExists(link.Provider); } } + + public async Task Delete(int id) + { + Season obj = await Get(id); + await Delete(obj); + } + + public async Task Delete(string slug) + { + Season obj = await Get(slug); + await Delete(obj); + } + + public async Task Delete(string showSlug, int seasonNumber) + { + Season obj = await Get(showSlug, seasonNumber); + await Delete(obj); + } public async Task Delete(Season obj) { diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index 6821e61f..f355c5cc 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -163,6 +163,18 @@ namespace Kyoo.Controllers link.ProviderID = await _providers.CreateIfNotExists(link.Provider); } + public async Task Delete(int id) + { + Show obj = await Get(id); + await Delete(obj); + } + + public async Task Delete(string slug) + { + Show obj = await Get(slug); + await Delete(obj); + } + public async Task Delete(Show obj) { if (obj == null) diff --git a/Kyoo/Controllers/Repositories/StudioRepository.cs b/Kyoo/Controllers/Repositories/StudioRepository.cs index c9b56777..e6bf7578 100644 --- a/Kyoo/Controllers/Repositories/StudioRepository.cs +++ b/Kyoo/Controllers/Repositories/StudioRepository.cs @@ -109,6 +109,18 @@ namespace Kyoo.Controllers await _database.SaveChangesAsync(); } + public async Task Delete(int id) + { + Studio obj = await Get(id); + await Delete(obj); + } + + public async Task Delete(string slug) + { + Studio obj = await Get(slug); + await Delete(obj); + } + public async Task Delete(Studio obj) { if (obj == null) diff --git a/Kyoo/Controllers/Repositories/TrackRepository.cs b/Kyoo/Controllers/Repositories/TrackRepository.cs index 25d034e2..89284f29 100644 --- a/Kyoo/Controllers/Repositories/TrackRepository.cs +++ b/Kyoo/Controllers/Repositories/TrackRepository.cs @@ -99,6 +99,18 @@ namespace Kyoo.Controllers await _database.SaveChangesAsync(); } + public async Task Delete(int id) + { + Track obj = await Get(id); + await Delete(obj); + } + + public async Task Delete(string slug) + { + Track obj = await Get(slug); + await Delete(obj); + } + public async Task Delete(Track obj) { if (obj == null) From 5944d948f16ef32c6b46cf732933013406c2206b Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sun, 21 Jun 2020 18:40:38 +0200 Subject: [PATCH 10/12] Deletion of episodes works --- Kyoo.Common/Models/Genre.cs | 2 +- Kyoo.Common/Models/Show.cs | 2 +- .../Repositories/EpisodeRepository.cs | 28 +- Kyoo/Models/DatabaseContext.cs | 6 +- .../20200618133537_Initial.Designer.cs | 640 ------------------ .../Internal/20200618133537_Initial.cs | 594 ---------------- .../Internal/DatabaseContextModelSnapshot.cs | 638 ----------------- Kyoo/Startup.cs | 6 +- Kyoo/Tasks/Crawler.cs | 25 +- 9 files changed, 49 insertions(+), 1892 deletions(-) delete mode 100644 Kyoo/Models/DatabaseMigrations/Internal/20200618133537_Initial.Designer.cs delete mode 100644 Kyoo/Models/DatabaseMigrations/Internal/20200618133537_Initial.cs delete mode 100644 Kyoo/Models/DatabaseMigrations/Internal/DatabaseContextModelSnapshot.cs diff --git a/Kyoo.Common/Models/Genre.cs b/Kyoo.Common/Models/Genre.cs index d4c43ce1..1f964eff 100644 --- a/Kyoo.Common/Models/Genre.cs +++ b/Kyoo.Common/Models/Genre.cs @@ -11,7 +11,7 @@ namespace Kyoo.Models public string Slug { get; set; } public string Name { get; set; } - [NotMergable] [JsonIgnore] public IEnumerable Links { get; set; } + [NotMergable] [JsonIgnore] public virtual IEnumerable Links { get; set; } [NotMergable] [JsonIgnore] public IEnumerable Shows { diff --git a/Kyoo.Common/Models/Show.cs b/Kyoo.Common/Models/Show.cs index 513bca0f..959856ee 100644 --- a/Kyoo.Common/Models/Show.cs +++ b/Kyoo.Common/Models/Show.cs @@ -50,7 +50,7 @@ namespace Kyoo.Models set => LibraryLinks = value?.Select(x => new LibraryLink(x, this)); } - [NotMergable] [JsonIgnore] public IEnumerable CollectionLinks { get; set; } + [NotMergable] [JsonIgnore] public virtual IEnumerable CollectionLinks { get; set; } [NotMergable] [JsonIgnore] public IEnumerable Collections { diff --git a/Kyoo/Controllers/Repositories/EpisodeRepository.cs b/Kyoo/Controllers/Repositories/EpisodeRepository.cs index ca7e4027..b6924c5c 100644 --- a/Kyoo/Controllers/Repositories/EpisodeRepository.cs +++ b/Kyoo/Controllers/Repositories/EpisodeRepository.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using Kyoo.Models; using Kyoo.Models.Exceptions; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.ChangeTracking; namespace Kyoo.Controllers { @@ -86,9 +87,10 @@ namespace Kyoo.Controllers foreach (MetadataID entry in obj.ExternalIDs) _database.Entry(entry).State = EntityState.Added; + // Since Episodes & Tracks are on the same DB, using a single commit is quicker. if (obj.Tracks != null) - foreach (Track track in obj.Tracks) - await _tracks.Create(track); + foreach (Track entry in obj.Tracks) + _database.Entry(entry).State = EntityState.Added; try { @@ -102,6 +104,16 @@ namespace Kyoo.Controllers throw new DuplicatedItemException($"Trying to insert a duplicated episode (slug {obj.Slug} already exists)."); throw; } + + // Since Episodes & Tracks are on the same DB, using a single commit is quicker. + /*if (obj.Tracks != null) + * foreach (Track track in obj.Tracks) + * { + * track.EpisodeID = obj.ID; + * await _tracks.Create(track); + * } + */ + return obj.ID; } @@ -179,13 +191,17 @@ namespace Kyoo.Controllers if (obj == null) throw new ArgumentNullException(nameof(obj)); + _database.Entry(obj).State = EntityState.Deleted; if (obj.ExternalIDs != null) foreach (MetadataID entry in obj.ExternalIDs) _database.Entry(entry).State = EntityState.Deleted; - if (obj.Tracks != null) - foreach (Track entry in obj.Tracks) - await _tracks.Delete(entry); - _database.Episodes.Remove(obj); + + // Since Tracks & Episodes are on the same database and handled by dotnet-ef, we can't use the repository to delete them. + /*if (obj.Tracks != null) + * foreach (Track entry in obj.Tracks) + * await _tracks.Delete(entry); + */ + await _database.SaveChangesAsync(); } diff --git a/Kyoo/Models/DatabaseContext.cs b/Kyoo/Models/DatabaseContext.cs index 0c77f0eb..1adc80d3 100644 --- a/Kyoo/Models/DatabaseContext.cs +++ b/Kyoo/Models/DatabaseContext.cs @@ -113,7 +113,8 @@ namespace Kyoo .Ignore(x => x.Providers); modelBuilder.Entity() - .Ignore(x => x.Shows); + .Ignore(x => x.Shows) + .Ignore(x => x.Libraries); modelBuilder.Entity() .Ignore(x => x.Genres) @@ -125,6 +126,9 @@ namespace Kyoo .Ignore(x => x.Name) .Ignore(x => x.ExternalIDs); + modelBuilder.Entity() + .Ignore(x => x.Shows); + modelBuilder.Entity() .HasIndex(x => x.Slug) diff --git a/Kyoo/Models/DatabaseMigrations/Internal/20200618133537_Initial.Designer.cs b/Kyoo/Models/DatabaseMigrations/Internal/20200618133537_Initial.Designer.cs deleted file mode 100644 index 5b5a5668..00000000 --- a/Kyoo/Models/DatabaseMigrations/Internal/20200618133537_Initial.Designer.cs +++ /dev/null @@ -1,640 +0,0 @@ -// -using System; -using Kyoo; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -namespace Kyoo.Models.DatabaseMigrations.Internal -{ - [DbContext(typeof(DatabaseContext))] - [Migration("20200618133537_Initial")] - partial class Initial - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn) - .HasAnnotation("ProductVersion", "3.1.3") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - modelBuilder.Entity("Kyoo.Models.Collection", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("ImgPrimary") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Overview") - .HasColumnType("text"); - - b.Property("Poster") - .HasColumnType("text"); - - b.Property("Slug") - .HasColumnType("text"); - - b.HasKey("ID"); - - b.HasIndex("Slug") - .IsUnique(); - - b.ToTable("Collections"); - }); - - modelBuilder.Entity("Kyoo.Models.CollectionLink", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("CollectionID") - .HasColumnType("integer"); - - b.Property("ShowID") - .HasColumnType("integer"); - - b.HasKey("ID"); - - b.HasIndex("CollectionID"); - - b.HasIndex("ShowID"); - - b.ToTable("CollectionLinks"); - }); - - modelBuilder.Entity("Kyoo.Models.Episode", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("AbsoluteNumber") - .HasColumnType("integer"); - - b.Property("EpisodeNumber") - .HasColumnType("integer"); - - b.Property("ImgPrimary") - .HasColumnType("text"); - - b.Property("Overview") - .HasColumnType("text"); - - b.Property("Path") - .HasColumnType("text"); - - b.Property("ReleaseDate") - .HasColumnType("timestamp without time zone"); - - b.Property("Runtime") - .HasColumnType("integer"); - - b.Property("SeasonID") - .HasColumnType("integer"); - - b.Property("SeasonNumber") - .HasColumnType("integer"); - - b.Property("ShowID") - .HasColumnType("integer"); - - b.Property("Title") - .HasColumnType("text"); - - b.HasKey("ID"); - - b.HasIndex("SeasonID"); - - b.HasIndex("ShowID", "SeasonNumber", "EpisodeNumber", "AbsoluteNumber") - .IsUnique(); - - b.ToTable("Episodes"); - }); - - modelBuilder.Entity("Kyoo.Models.Genre", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Slug") - .HasColumnType("text"); - - b.HasKey("ID"); - - b.HasIndex("Slug") - .IsUnique(); - - b.ToTable("Genres"); - }); - - modelBuilder.Entity("Kyoo.Models.GenreLink", b => - { - b.Property("ShowID") - .HasColumnType("integer"); - - b.Property("GenreID") - .HasColumnType("integer"); - - b.HasKey("ShowID", "GenreID"); - - b.HasIndex("GenreID"); - - b.ToTable("GenreLinks"); - }); - - modelBuilder.Entity("Kyoo.Models.Library", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Paths") - .HasColumnType("text"); - - b.Property("Slug") - .HasColumnType("text"); - - b.HasKey("ID"); - - b.HasIndex("Slug") - .IsUnique(); - - b.ToTable("Libraries"); - }); - - modelBuilder.Entity("Kyoo.Models.LibraryLink", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("CollectionID") - .HasColumnType("integer"); - - b.Property("LibraryID") - .HasColumnType("integer"); - - b.Property("ShowID") - .HasColumnType("integer"); - - b.HasKey("ID"); - - b.HasIndex("CollectionID"); - - b.HasIndex("LibraryID"); - - b.HasIndex("ShowID"); - - b.ToTable("LibraryLinks"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("DataID") - .HasColumnType("text"); - - b.Property("EpisodeID") - .HasColumnType("integer"); - - b.Property("Link") - .HasColumnType("text"); - - b.Property("PeopleID") - .HasColumnType("integer"); - - b.Property("ProviderID") - .HasColumnType("integer"); - - b.Property("SeasonID") - .HasColumnType("integer"); - - b.Property("ShowID") - .HasColumnType("integer"); - - b.HasKey("ID"); - - b.HasIndex("EpisodeID"); - - b.HasIndex("PeopleID"); - - b.HasIndex("ProviderID"); - - b.HasIndex("SeasonID"); - - b.HasIndex("ShowID"); - - b.ToTable("MetadataIds"); - }); - - modelBuilder.Entity("Kyoo.Models.People", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("ImgPrimary") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Slug") - .HasColumnType("text"); - - b.HasKey("ID"); - - b.HasIndex("Slug") - .IsUnique(); - - b.ToTable("Peoples"); - }); - - modelBuilder.Entity("Kyoo.Models.PeopleLink", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("PeopleID") - .HasColumnType("integer"); - - b.Property("Role") - .HasColumnType("text"); - - b.Property("ShowID") - .HasColumnType("integer"); - - b.Property("Type") - .HasColumnType("text"); - - b.HasKey("ID"); - - b.HasIndex("PeopleID"); - - b.HasIndex("ShowID"); - - b.ToTable("PeopleLinks"); - }); - - modelBuilder.Entity("Kyoo.Models.ProviderID", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Logo") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.HasKey("ID"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("Providers"); - }); - - modelBuilder.Entity("Kyoo.Models.ProviderLink", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("LibraryID") - .HasColumnType("integer"); - - b.Property("ProviderID") - .HasColumnType("integer"); - - b.HasKey("ID"); - - b.HasIndex("LibraryID"); - - b.HasIndex("ProviderID"); - - b.ToTable("ProviderLinks"); - }); - - modelBuilder.Entity("Kyoo.Models.Season", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("ImgPrimary") - .HasColumnType("text"); - - b.Property("Overview") - .HasColumnType("text"); - - b.Property("SeasonNumber") - .HasColumnType("integer"); - - b.Property("ShowID") - .HasColumnType("integer"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Year") - .HasColumnType("integer"); - - b.HasKey("ID"); - - b.HasIndex("ShowID", "SeasonNumber") - .IsUnique(); - - b.ToTable("Seasons"); - }); - - modelBuilder.Entity("Kyoo.Models.Show", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Aliases") - .HasColumnType("text"); - - b.Property("Backdrop") - .HasColumnType("text"); - - b.Property("EndYear") - .HasColumnType("integer"); - - b.Property("IsMovie") - .HasColumnType("boolean"); - - b.Property("Logo") - .HasColumnType("text"); - - b.Property("Overview") - .HasColumnType("text"); - - b.Property("Path") - .HasColumnType("text"); - - b.Property("Poster") - .HasColumnType("text"); - - b.Property("Slug") - .HasColumnType("text"); - - b.Property("StartYear") - .HasColumnType("integer"); - - b.Property("Status") - .HasColumnType("integer"); - - b.Property("StudioID") - .HasColumnType("integer"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("TrailerUrl") - .HasColumnType("text"); - - b.HasKey("ID"); - - b.HasIndex("StudioID"); - - b.ToTable("Shows"); - }); - - modelBuilder.Entity("Kyoo.Models.Studio", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Slug") - .HasColumnType("text"); - - b.HasKey("ID"); - - b.HasIndex("Slug") - .IsUnique(); - - b.ToTable("Studios"); - }); - - modelBuilder.Entity("Kyoo.Models.Track", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Codec") - .HasColumnType("text"); - - b.Property("EpisodeID") - .HasColumnType("integer"); - - b.Property("IsDefault") - .HasColumnType("boolean"); - - b.Property("IsExternal") - .HasColumnType("boolean"); - - b.Property("IsForced") - .HasColumnType("boolean"); - - b.Property("Language") - .HasColumnType("text"); - - b.Property("Path") - .HasColumnType("text"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Type") - .HasColumnType("integer"); - - b.HasKey("ID"); - - b.HasIndex("EpisodeID"); - - b.ToTable("Tracks"); - }); - - modelBuilder.Entity("Kyoo.Models.CollectionLink", b => - { - b.HasOne("Kyoo.Models.Collection", "Collection") - .WithMany("Links") - .HasForeignKey("CollectionID"); - - b.HasOne("Kyoo.Models.Show", "Show") - .WithMany() - .HasForeignKey("ShowID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Kyoo.Models.Episode", b => - { - b.HasOne("Kyoo.Models.Season", "Season") - .WithMany("Episodes") - .HasForeignKey("SeasonID"); - - b.HasOne("Kyoo.Models.Show", "Show") - .WithMany("Episodes") - .HasForeignKey("ShowID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Kyoo.Models.GenreLink", b => - { - b.HasOne("Kyoo.Models.Genre", "Genre") - .WithMany() - .HasForeignKey("GenreID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Show") - .WithMany("GenreLinks") - .HasForeignKey("ShowID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Kyoo.Models.LibraryLink", b => - { - b.HasOne("Kyoo.Models.Collection", "Collection") - .WithMany() - .HasForeignKey("CollectionID"); - - b.HasOne("Kyoo.Models.Library", "Library") - .WithMany("Links") - .HasForeignKey("LibraryID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Show") - .WithMany() - .HasForeignKey("ShowID"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Episode", "Episode") - .WithMany("ExternalIDs") - .HasForeignKey("EpisodeID"); - - b.HasOne("Kyoo.Models.People", "People") - .WithMany("ExternalIDs") - .HasForeignKey("PeopleID"); - - b.HasOne("Kyoo.Models.ProviderID", "Provider") - .WithMany() - .HasForeignKey("ProviderID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Season", "Season") - .WithMany("ExternalIDs") - .HasForeignKey("SeasonID"); - - b.HasOne("Kyoo.Models.Show", "Show") - .WithMany("ExternalIDs") - .HasForeignKey("ShowID"); - }); - - modelBuilder.Entity("Kyoo.Models.PeopleLink", b => - { - b.HasOne("Kyoo.Models.People", "People") - .WithMany("Roles") - .HasForeignKey("PeopleID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Show") - .WithMany("People") - .HasForeignKey("ShowID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Kyoo.Models.ProviderLink", b => - { - b.HasOne("Kyoo.Models.Library", "Library") - .WithMany("ProviderLinks") - .HasForeignKey("LibraryID"); - - b.HasOne("Kyoo.Models.ProviderID", "Provider") - .WithMany() - .HasForeignKey("ProviderID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Kyoo.Models.Season", b => - { - b.HasOne("Kyoo.Models.Show", "Show") - .WithMany("Seasons") - .HasForeignKey("ShowID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Kyoo.Models.Show", b => - { - b.HasOne("Kyoo.Models.Studio", "Studio") - .WithMany("Shows") - .HasForeignKey("StudioID"); - }); - - modelBuilder.Entity("Kyoo.Models.Track", b => - { - b.HasOne("Kyoo.Models.Episode", "Episode") - .WithMany("Tracks") - .HasForeignKey("EpisodeID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Kyoo/Models/DatabaseMigrations/Internal/20200618133537_Initial.cs b/Kyoo/Models/DatabaseMigrations/Internal/20200618133537_Initial.cs deleted file mode 100644 index 6890dbb9..00000000 --- a/Kyoo/Models/DatabaseMigrations/Internal/20200618133537_Initial.cs +++ /dev/null @@ -1,594 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -namespace Kyoo.Models.DatabaseMigrations.Internal -{ - public partial class Initial : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "Collections", - columns: table => new - { - ID = table.Column(nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - Slug = table.Column(nullable: true), - Name = table.Column(nullable: true), - Poster = table.Column(nullable: true), - Overview = table.Column(nullable: true), - ImgPrimary = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Collections", x => x.ID); - }); - - migrationBuilder.CreateTable( - name: "Genres", - columns: table => new - { - ID = table.Column(nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - Slug = table.Column(nullable: true), - Name = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Genres", x => x.ID); - }); - - migrationBuilder.CreateTable( - name: "Libraries", - columns: table => new - { - ID = table.Column(nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - Slug = table.Column(nullable: true), - Name = table.Column(nullable: true), - Paths = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Libraries", x => x.ID); - }); - - migrationBuilder.CreateTable( - name: "Peoples", - columns: table => new - { - ID = table.Column(nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - Slug = table.Column(nullable: true), - Name = table.Column(nullable: true), - ImgPrimary = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Peoples", x => x.ID); - }); - - migrationBuilder.CreateTable( - name: "Providers", - columns: table => new - { - ID = table.Column(nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - Name = table.Column(nullable: true), - Logo = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Providers", x => x.ID); - }); - - migrationBuilder.CreateTable( - name: "Studios", - columns: table => new - { - ID = table.Column(nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - Slug = table.Column(nullable: true), - Name = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Studios", x => x.ID); - }); - - migrationBuilder.CreateTable( - name: "ProviderLinks", - columns: table => new - { - ID = table.Column(nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - ProviderID = table.Column(nullable: false), - LibraryID = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_ProviderLinks", x => x.ID); - table.ForeignKey( - name: "FK_ProviderLinks_Libraries_LibraryID", - column: x => x.LibraryID, - principalTable: "Libraries", - principalColumn: "ID", - onDelete: ReferentialAction.Restrict); - table.ForeignKey( - name: "FK_ProviderLinks_Providers_ProviderID", - column: x => x.ProviderID, - principalTable: "Providers", - principalColumn: "ID", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Shows", - columns: table => new - { - ID = table.Column(nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - Slug = table.Column(nullable: true), - Title = table.Column(nullable: true), - Aliases = table.Column(nullable: true), - Path = table.Column(nullable: true), - Overview = table.Column(nullable: true), - Status = table.Column(nullable: true), - TrailerUrl = table.Column(nullable: true), - StartYear = table.Column(nullable: true), - EndYear = table.Column(nullable: true), - Poster = table.Column(nullable: true), - Logo = table.Column(nullable: true), - Backdrop = table.Column(nullable: true), - IsMovie = table.Column(nullable: false), - StudioID = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Shows", x => x.ID); - table.ForeignKey( - name: "FK_Shows_Studios_StudioID", - column: x => x.StudioID, - principalTable: "Studios", - principalColumn: "ID", - onDelete: ReferentialAction.Restrict); - }); - - migrationBuilder.CreateTable( - name: "CollectionLinks", - columns: table => new - { - ID = table.Column(nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - CollectionID = table.Column(nullable: true), - ShowID = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_CollectionLinks", x => x.ID); - table.ForeignKey( - name: "FK_CollectionLinks_Collections_CollectionID", - column: x => x.CollectionID, - principalTable: "Collections", - principalColumn: "ID", - onDelete: ReferentialAction.Restrict); - table.ForeignKey( - name: "FK_CollectionLinks_Shows_ShowID", - column: x => x.ShowID, - principalTable: "Shows", - principalColumn: "ID", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "GenreLinks", - columns: table => new - { - ShowID = table.Column(nullable: false), - GenreID = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_GenreLinks", x => new { x.ShowID, x.GenreID }); - table.ForeignKey( - name: "FK_GenreLinks_Genres_GenreID", - column: x => x.GenreID, - principalTable: "Genres", - principalColumn: "ID", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_GenreLinks_Shows_ShowID", - column: x => x.ShowID, - principalTable: "Shows", - principalColumn: "ID", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "LibraryLinks", - columns: table => new - { - ID = table.Column(nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - LibraryID = table.Column(nullable: false), - ShowID = table.Column(nullable: true), - CollectionID = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_LibraryLinks", x => x.ID); - table.ForeignKey( - name: "FK_LibraryLinks_Collections_CollectionID", - column: x => x.CollectionID, - principalTable: "Collections", - principalColumn: "ID", - onDelete: ReferentialAction.Restrict); - table.ForeignKey( - name: "FK_LibraryLinks_Libraries_LibraryID", - column: x => x.LibraryID, - principalTable: "Libraries", - principalColumn: "ID", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_LibraryLinks_Shows_ShowID", - column: x => x.ShowID, - principalTable: "Shows", - principalColumn: "ID", - onDelete: ReferentialAction.Restrict); - }); - - migrationBuilder.CreateTable( - name: "PeopleLinks", - columns: table => new - { - ID = table.Column(nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - PeopleID = table.Column(nullable: false), - ShowID = table.Column(nullable: false), - Role = table.Column(nullable: true), - Type = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_PeopleLinks", x => x.ID); - table.ForeignKey( - name: "FK_PeopleLinks_Peoples_PeopleID", - column: x => x.PeopleID, - principalTable: "Peoples", - principalColumn: "ID", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_PeopleLinks_Shows_ShowID", - column: x => x.ShowID, - principalTable: "Shows", - principalColumn: "ID", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Seasons", - columns: table => new - { - ID = table.Column(nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - ShowID = table.Column(nullable: false), - SeasonNumber = table.Column(nullable: false), - Title = table.Column(nullable: true), - Overview = table.Column(nullable: true), - Year = table.Column(nullable: true), - ImgPrimary = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Seasons", x => x.ID); - table.ForeignKey( - name: "FK_Seasons_Shows_ShowID", - column: x => x.ShowID, - principalTable: "Shows", - principalColumn: "ID", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Episodes", - columns: table => new - { - ID = table.Column(nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - ShowID = table.Column(nullable: false), - SeasonID = table.Column(nullable: true), - SeasonNumber = table.Column(nullable: false), - EpisodeNumber = table.Column(nullable: false), - AbsoluteNumber = table.Column(nullable: false), - Path = table.Column(nullable: true), - Title = table.Column(nullable: true), - Overview = table.Column(nullable: true), - ReleaseDate = table.Column(nullable: true), - Runtime = table.Column(nullable: false), - ImgPrimary = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Episodes", x => x.ID); - table.ForeignKey( - name: "FK_Episodes_Seasons_SeasonID", - column: x => x.SeasonID, - principalTable: "Seasons", - principalColumn: "ID", - onDelete: ReferentialAction.Restrict); - table.ForeignKey( - name: "FK_Episodes_Shows_ShowID", - column: x => x.ShowID, - principalTable: "Shows", - principalColumn: "ID", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "MetadataIds", - columns: table => new - { - ID = table.Column(nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - ProviderID = table.Column(nullable: false), - ShowID = table.Column(nullable: true), - EpisodeID = table.Column(nullable: true), - SeasonID = table.Column(nullable: true), - PeopleID = table.Column(nullable: true), - DataID = table.Column(nullable: true), - Link = table.Column(nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_MetadataIds", x => x.ID); - table.ForeignKey( - name: "FK_MetadataIds_Episodes_EpisodeID", - column: x => x.EpisodeID, - principalTable: "Episodes", - principalColumn: "ID", - onDelete: ReferentialAction.Restrict); - table.ForeignKey( - name: "FK_MetadataIds_Peoples_PeopleID", - column: x => x.PeopleID, - principalTable: "Peoples", - principalColumn: "ID", - onDelete: ReferentialAction.Restrict); - table.ForeignKey( - name: "FK_MetadataIds_Providers_ProviderID", - column: x => x.ProviderID, - principalTable: "Providers", - principalColumn: "ID", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_MetadataIds_Seasons_SeasonID", - column: x => x.SeasonID, - principalTable: "Seasons", - principalColumn: "ID", - onDelete: ReferentialAction.Restrict); - table.ForeignKey( - name: "FK_MetadataIds_Shows_ShowID", - column: x => x.ShowID, - principalTable: "Shows", - principalColumn: "ID", - onDelete: ReferentialAction.Restrict); - }); - - migrationBuilder.CreateTable( - name: "Tracks", - columns: table => new - { - ID = table.Column(nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - Title = table.Column(nullable: true), - Language = table.Column(nullable: true), - Codec = table.Column(nullable: true), - Path = table.Column(nullable: true), - Type = table.Column(nullable: false), - EpisodeID = table.Column(nullable: false), - IsDefault = table.Column(nullable: false), - IsForced = table.Column(nullable: false), - IsExternal = table.Column(nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Tracks", x => x.ID); - table.ForeignKey( - name: "FK_Tracks_Episodes_EpisodeID", - column: x => x.EpisodeID, - principalTable: "Episodes", - principalColumn: "ID", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_CollectionLinks_CollectionID", - table: "CollectionLinks", - column: "CollectionID"); - - migrationBuilder.CreateIndex( - name: "IX_CollectionLinks_ShowID", - table: "CollectionLinks", - column: "ShowID"); - - migrationBuilder.CreateIndex( - name: "IX_Collections_Slug", - table: "Collections", - column: "Slug", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Episodes_SeasonID", - table: "Episodes", - column: "SeasonID"); - - migrationBuilder.CreateIndex( - name: "IX_Episodes_ShowID_SeasonNumber_EpisodeNumber_AbsoluteNumber", - table: "Episodes", - columns: new[] { "ShowID", "SeasonNumber", "EpisodeNumber", "AbsoluteNumber" }, - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_GenreLinks_GenreID", - table: "GenreLinks", - column: "GenreID"); - - migrationBuilder.CreateIndex( - name: "IX_Genres_Slug", - table: "Genres", - column: "Slug", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Libraries_Slug", - table: "Libraries", - column: "Slug", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_LibraryLinks_CollectionID", - table: "LibraryLinks", - column: "CollectionID"); - - migrationBuilder.CreateIndex( - name: "IX_LibraryLinks_LibraryID", - table: "LibraryLinks", - column: "LibraryID"); - - migrationBuilder.CreateIndex( - name: "IX_LibraryLinks_ShowID", - table: "LibraryLinks", - column: "ShowID"); - - migrationBuilder.CreateIndex( - name: "IX_MetadataIds_EpisodeID", - table: "MetadataIds", - column: "EpisodeID"); - - migrationBuilder.CreateIndex( - name: "IX_MetadataIds_PeopleID", - table: "MetadataIds", - column: "PeopleID"); - - migrationBuilder.CreateIndex( - name: "IX_MetadataIds_ProviderID", - table: "MetadataIds", - column: "ProviderID"); - - migrationBuilder.CreateIndex( - name: "IX_MetadataIds_SeasonID", - table: "MetadataIds", - column: "SeasonID"); - - migrationBuilder.CreateIndex( - name: "IX_MetadataIds_ShowID", - table: "MetadataIds", - column: "ShowID"); - - migrationBuilder.CreateIndex( - name: "IX_PeopleLinks_PeopleID", - table: "PeopleLinks", - column: "PeopleID"); - - migrationBuilder.CreateIndex( - name: "IX_PeopleLinks_ShowID", - table: "PeopleLinks", - column: "ShowID"); - - migrationBuilder.CreateIndex( - name: "IX_Peoples_Slug", - table: "Peoples", - column: "Slug", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_ProviderLinks_LibraryID", - table: "ProviderLinks", - column: "LibraryID"); - - migrationBuilder.CreateIndex( - name: "IX_ProviderLinks_ProviderID", - table: "ProviderLinks", - column: "ProviderID"); - - migrationBuilder.CreateIndex( - name: "IX_Providers_Name", - table: "Providers", - column: "Name", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Seasons_ShowID_SeasonNumber", - table: "Seasons", - columns: new[] { "ShowID", "SeasonNumber" }, - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Shows_StudioID", - table: "Shows", - column: "StudioID"); - - migrationBuilder.CreateIndex( - name: "IX_Studios_Slug", - table: "Studios", - column: "Slug", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Tracks_EpisodeID", - table: "Tracks", - column: "EpisodeID"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "CollectionLinks"); - - migrationBuilder.DropTable( - name: "GenreLinks"); - - migrationBuilder.DropTable( - name: "LibraryLinks"); - - migrationBuilder.DropTable( - name: "MetadataIds"); - - migrationBuilder.DropTable( - name: "PeopleLinks"); - - migrationBuilder.DropTable( - name: "ProviderLinks"); - - migrationBuilder.DropTable( - name: "Tracks"); - - migrationBuilder.DropTable( - name: "Genres"); - - migrationBuilder.DropTable( - name: "Collections"); - - migrationBuilder.DropTable( - name: "Peoples"); - - migrationBuilder.DropTable( - name: "Libraries"); - - migrationBuilder.DropTable( - name: "Providers"); - - migrationBuilder.DropTable( - name: "Episodes"); - - migrationBuilder.DropTable( - name: "Seasons"); - - migrationBuilder.DropTable( - name: "Shows"); - - migrationBuilder.DropTable( - name: "Studios"); - } - } -} diff --git a/Kyoo/Models/DatabaseMigrations/Internal/DatabaseContextModelSnapshot.cs b/Kyoo/Models/DatabaseMigrations/Internal/DatabaseContextModelSnapshot.cs deleted file mode 100644 index 4b4f404d..00000000 --- a/Kyoo/Models/DatabaseMigrations/Internal/DatabaseContextModelSnapshot.cs +++ /dev/null @@ -1,638 +0,0 @@ -// -using System; -using Kyoo; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -namespace Kyoo.Models.DatabaseMigrations.Internal -{ - [DbContext(typeof(DatabaseContext))] - partial class DatabaseContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn) - .HasAnnotation("ProductVersion", "3.1.3") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - modelBuilder.Entity("Kyoo.Models.Collection", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("ImgPrimary") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Overview") - .HasColumnType("text"); - - b.Property("Poster") - .HasColumnType("text"); - - b.Property("Slug") - .HasColumnType("text"); - - b.HasKey("ID"); - - b.HasIndex("Slug") - .IsUnique(); - - b.ToTable("Collections"); - }); - - modelBuilder.Entity("Kyoo.Models.CollectionLink", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("CollectionID") - .HasColumnType("integer"); - - b.Property("ShowID") - .HasColumnType("integer"); - - b.HasKey("ID"); - - b.HasIndex("CollectionID"); - - b.HasIndex("ShowID"); - - b.ToTable("CollectionLinks"); - }); - - modelBuilder.Entity("Kyoo.Models.Episode", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("AbsoluteNumber") - .HasColumnType("integer"); - - b.Property("EpisodeNumber") - .HasColumnType("integer"); - - b.Property("ImgPrimary") - .HasColumnType("text"); - - b.Property("Overview") - .HasColumnType("text"); - - b.Property("Path") - .HasColumnType("text"); - - b.Property("ReleaseDate") - .HasColumnType("timestamp without time zone"); - - b.Property("Runtime") - .HasColumnType("integer"); - - b.Property("SeasonID") - .HasColumnType("integer"); - - b.Property("SeasonNumber") - .HasColumnType("integer"); - - b.Property("ShowID") - .HasColumnType("integer"); - - b.Property("Title") - .HasColumnType("text"); - - b.HasKey("ID"); - - b.HasIndex("SeasonID"); - - b.HasIndex("ShowID", "SeasonNumber", "EpisodeNumber", "AbsoluteNumber") - .IsUnique(); - - b.ToTable("Episodes"); - }); - - modelBuilder.Entity("Kyoo.Models.Genre", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Slug") - .HasColumnType("text"); - - b.HasKey("ID"); - - b.HasIndex("Slug") - .IsUnique(); - - b.ToTable("Genres"); - }); - - modelBuilder.Entity("Kyoo.Models.GenreLink", b => - { - b.Property("ShowID") - .HasColumnType("integer"); - - b.Property("GenreID") - .HasColumnType("integer"); - - b.HasKey("ShowID", "GenreID"); - - b.HasIndex("GenreID"); - - b.ToTable("GenreLinks"); - }); - - modelBuilder.Entity("Kyoo.Models.Library", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Paths") - .HasColumnType("text"); - - b.Property("Slug") - .HasColumnType("text"); - - b.HasKey("ID"); - - b.HasIndex("Slug") - .IsUnique(); - - b.ToTable("Libraries"); - }); - - modelBuilder.Entity("Kyoo.Models.LibraryLink", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("CollectionID") - .HasColumnType("integer"); - - b.Property("LibraryID") - .HasColumnType("integer"); - - b.Property("ShowID") - .HasColumnType("integer"); - - b.HasKey("ID"); - - b.HasIndex("CollectionID"); - - b.HasIndex("LibraryID"); - - b.HasIndex("ShowID"); - - b.ToTable("LibraryLinks"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("DataID") - .HasColumnType("text"); - - b.Property("EpisodeID") - .HasColumnType("integer"); - - b.Property("Link") - .HasColumnType("text"); - - b.Property("PeopleID") - .HasColumnType("integer"); - - b.Property("ProviderID") - .HasColumnType("integer"); - - b.Property("SeasonID") - .HasColumnType("integer"); - - b.Property("ShowID") - .HasColumnType("integer"); - - b.HasKey("ID"); - - b.HasIndex("EpisodeID"); - - b.HasIndex("PeopleID"); - - b.HasIndex("ProviderID"); - - b.HasIndex("SeasonID"); - - b.HasIndex("ShowID"); - - b.ToTable("MetadataIds"); - }); - - modelBuilder.Entity("Kyoo.Models.People", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("ImgPrimary") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Slug") - .HasColumnType("text"); - - b.HasKey("ID"); - - b.HasIndex("Slug") - .IsUnique(); - - b.ToTable("Peoples"); - }); - - modelBuilder.Entity("Kyoo.Models.PeopleLink", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("PeopleID") - .HasColumnType("integer"); - - b.Property("Role") - .HasColumnType("text"); - - b.Property("ShowID") - .HasColumnType("integer"); - - b.Property("Type") - .HasColumnType("text"); - - b.HasKey("ID"); - - b.HasIndex("PeopleID"); - - b.HasIndex("ShowID"); - - b.ToTable("PeopleLinks"); - }); - - modelBuilder.Entity("Kyoo.Models.ProviderID", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Logo") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.HasKey("ID"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("Providers"); - }); - - modelBuilder.Entity("Kyoo.Models.ProviderLink", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("LibraryID") - .HasColumnType("integer"); - - b.Property("ProviderID") - .HasColumnType("integer"); - - b.HasKey("ID"); - - b.HasIndex("LibraryID"); - - b.HasIndex("ProviderID"); - - b.ToTable("ProviderLinks"); - }); - - modelBuilder.Entity("Kyoo.Models.Season", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("ImgPrimary") - .HasColumnType("text"); - - b.Property("Overview") - .HasColumnType("text"); - - b.Property("SeasonNumber") - .HasColumnType("integer"); - - b.Property("ShowID") - .HasColumnType("integer"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Year") - .HasColumnType("integer"); - - b.HasKey("ID"); - - b.HasIndex("ShowID", "SeasonNumber") - .IsUnique(); - - b.ToTable("Seasons"); - }); - - modelBuilder.Entity("Kyoo.Models.Show", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Aliases") - .HasColumnType("text"); - - b.Property("Backdrop") - .HasColumnType("text"); - - b.Property("EndYear") - .HasColumnType("integer"); - - b.Property("IsMovie") - .HasColumnType("boolean"); - - b.Property("Logo") - .HasColumnType("text"); - - b.Property("Overview") - .HasColumnType("text"); - - b.Property("Path") - .HasColumnType("text"); - - b.Property("Poster") - .HasColumnType("text"); - - b.Property("Slug") - .HasColumnType("text"); - - b.Property("StartYear") - .HasColumnType("integer"); - - b.Property("Status") - .HasColumnType("integer"); - - b.Property("StudioID") - .HasColumnType("integer"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("TrailerUrl") - .HasColumnType("text"); - - b.HasKey("ID"); - - b.HasIndex("StudioID"); - - b.ToTable("Shows"); - }); - - modelBuilder.Entity("Kyoo.Models.Studio", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Slug") - .HasColumnType("text"); - - b.HasKey("ID"); - - b.HasIndex("Slug") - .IsUnique(); - - b.ToTable("Studios"); - }); - - modelBuilder.Entity("Kyoo.Models.Track", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - - b.Property("Codec") - .HasColumnType("text"); - - b.Property("EpisodeID") - .HasColumnType("integer"); - - b.Property("IsDefault") - .HasColumnType("boolean"); - - b.Property("IsExternal") - .HasColumnType("boolean"); - - b.Property("IsForced") - .HasColumnType("boolean"); - - b.Property("Language") - .HasColumnType("text"); - - b.Property("Path") - .HasColumnType("text"); - - b.Property("Title") - .HasColumnType("text"); - - b.Property("Type") - .HasColumnType("integer"); - - b.HasKey("ID"); - - b.HasIndex("EpisodeID"); - - b.ToTable("Tracks"); - }); - - modelBuilder.Entity("Kyoo.Models.CollectionLink", b => - { - b.HasOne("Kyoo.Models.Collection", "Collection") - .WithMany("Links") - .HasForeignKey("CollectionID"); - - b.HasOne("Kyoo.Models.Show", "Show") - .WithMany() - .HasForeignKey("ShowID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Kyoo.Models.Episode", b => - { - b.HasOne("Kyoo.Models.Season", "Season") - .WithMany("Episodes") - .HasForeignKey("SeasonID"); - - b.HasOne("Kyoo.Models.Show", "Show") - .WithMany("Episodes") - .HasForeignKey("ShowID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Kyoo.Models.GenreLink", b => - { - b.HasOne("Kyoo.Models.Genre", "Genre") - .WithMany() - .HasForeignKey("GenreID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Show") - .WithMany("GenreLinks") - .HasForeignKey("ShowID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Kyoo.Models.LibraryLink", b => - { - b.HasOne("Kyoo.Models.Collection", "Collection") - .WithMany() - .HasForeignKey("CollectionID"); - - b.HasOne("Kyoo.Models.Library", "Library") - .WithMany("Links") - .HasForeignKey("LibraryID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Show") - .WithMany() - .HasForeignKey("ShowID"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Episode", "Episode") - .WithMany("ExternalIDs") - .HasForeignKey("EpisodeID"); - - b.HasOne("Kyoo.Models.People", "People") - .WithMany("ExternalIDs") - .HasForeignKey("PeopleID"); - - b.HasOne("Kyoo.Models.ProviderID", "Provider") - .WithMany() - .HasForeignKey("ProviderID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Season", "Season") - .WithMany("ExternalIDs") - .HasForeignKey("SeasonID"); - - b.HasOne("Kyoo.Models.Show", "Show") - .WithMany("ExternalIDs") - .HasForeignKey("ShowID"); - }); - - modelBuilder.Entity("Kyoo.Models.PeopleLink", b => - { - b.HasOne("Kyoo.Models.People", "People") - .WithMany("Roles") - .HasForeignKey("PeopleID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Show") - .WithMany("People") - .HasForeignKey("ShowID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Kyoo.Models.ProviderLink", b => - { - b.HasOne("Kyoo.Models.Library", "Library") - .WithMany("ProviderLinks") - .HasForeignKey("LibraryID"); - - b.HasOne("Kyoo.Models.ProviderID", "Provider") - .WithMany() - .HasForeignKey("ProviderID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Kyoo.Models.Season", b => - { - b.HasOne("Kyoo.Models.Show", "Show") - .WithMany("Seasons") - .HasForeignKey("ShowID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Kyoo.Models.Show", b => - { - b.HasOne("Kyoo.Models.Studio", "Studio") - .WithMany("Shows") - .HasForeignKey("StudioID"); - }); - - modelBuilder.Entity("Kyoo.Models.Track", b => - { - b.HasOne("Kyoo.Models.Episode", "Episode") - .WithMany("Tracks") - .HasForeignKey("EpisodeID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Kyoo/Startup.cs b/Kyoo/Startup.cs index 65f99812..0c19d8d7 100644 --- a/Kyoo/Startup.cs +++ b/Kyoo/Startup.cs @@ -46,9 +46,9 @@ namespace Kyoo services.AddDbContext(options => { options.UseLazyLoadingProxies() - .UseNpgsql(_configuration.GetConnectionString("Database")) - .EnableSensitiveDataLogging(); - // .UseLoggerFactory(LoggerFactory.Create(builder => builder.AddConsole())); + .UseNpgsql(_configuration.GetConnectionString("Database")); + //.EnableSensitiveDataLogging() + //.UseLoggerFactory(LoggerFactory.Create(builder => builder.AddConsole())); }, ServiceLifetime.Transient); services.AddDbContext(options => diff --git a/Kyoo/Tasks/Crawler.cs b/Kyoo/Tasks/Crawler.cs index e89347f0..c619ad8f 100644 --- a/Kyoo/Tasks/Crawler.cs +++ b/Kyoo/Tasks/Crawler.cs @@ -58,6 +58,11 @@ namespace Kyoo.Controllers using IServiceScope serviceScope = _serviceProvider.CreateScope(); await using ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService(); + + // foreach (Show show in await libraryManager.GetShows()) + // if (!Directory.Exists(show.Path)) + // await libraryManager.DeleteShow(show); + ICollection episodes = await libraryManager.GetEpisodes(); ICollection libraries = argument == null ? await libraryManager.GetLibraries() @@ -135,12 +140,12 @@ namespace Kyoo.Controllers { if (token.IsCancellationRequested) return; - - try + + try { using IServiceScope serviceScope = _serviceProvider.CreateScope(); await using ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService(); - + string patern = _config.GetValue("regex"); Regex regex = new Regex(patern, RegexOptions.IgnoreCase); Match match = regex.Match(relativePath); @@ -160,12 +165,12 @@ namespace Kyoo.Controllers else { Season season = await GetSeason(libraryManager, show, seasonNumber, library); - Episode episode = await GetEpisode(libraryManager, - show, - season, - episodeNumber, + Episode episode = await GetEpisode(libraryManager, + show, + season, + episodeNumber, absoluteNumber, - path, + path, library); await libraryManager.RegisterEpisode(episode); } @@ -173,6 +178,10 @@ namespace Kyoo.Controllers await libraryManager.AddShowLink(show, library, collection); Console.WriteLine($"Episode at {path} registered."); } + catch (DuplicatedItemException ex) + { + await Console.Error.WriteLineAsync($"{path}: {ex.Message}"); + } catch (Exception ex) { await Console.Error.WriteLineAsync($"Unknown exception thrown while registering episode at {path}." + From cf713cf5fa2e0b8423c5a222cbad66070cde6e62 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Mon, 22 Jun 2020 04:24:57 +0200 Subject: [PATCH 11/12] Implementing delete range --- Kyoo.Common/Controllers/IRepository.cs | 9 +++ .../Repositories/CollectionRepository.cs | 18 ++++++ .../Repositories/EpisodeRepository.cs | 54 +++++++++------- .../Repositories/GenreRepository.cs | 18 ++++++ .../Repositories/LibraryRepository.cs | 18 ++++++ .../Repositories/PeopleRepository.cs | 18 ++++++ .../Repositories/ProviderRepository.cs | 18 ++++++ .../Repositories/SeasonRepository.cs | 31 +++++++-- .../Repositories/ShowRepository.cs | 64 ++++++++++++------- .../Repositories/StudioRepository.cs | 18 ++++++ .../Repositories/TrackRepository.cs | 18 ++++++ Kyoo/Startup.cs | 6 +- Kyoo/Tasks/Crawler.cs | 6 +- 13 files changed, 237 insertions(+), 59 deletions(-) diff --git a/Kyoo.Common/Controllers/IRepository.cs b/Kyoo.Common/Controllers/IRepository.cs index 705ff12f..caef30a6 100644 --- a/Kyoo.Common/Controllers/IRepository.cs +++ b/Kyoo.Common/Controllers/IRepository.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using JetBrains.Annotations; using Kyoo.Models; @@ -15,9 +16,17 @@ namespace Kyoo.Controllers Task Create([NotNull] T obj); Task CreateIfNotExists([NotNull] T obj); Task Edit([NotNull] T edited, bool resetOld); + Task Delete(int id); Task Delete(string slug); Task Delete([NotNull] T obj); + + Task DeleteRange(params T[] objs) => DeleteRange(objs.AsEnumerable()); + Task DeleteRange(IEnumerable objs); + Task DeleteRange(params int[] ids) => DeleteRange(ids.AsEnumerable()); + Task DeleteRange(IEnumerable ids); + Task DeleteRange(params string[] slugs) => DeleteRange(slugs.AsEnumerable()); + Task DeleteRange(IEnumerable slugs); } public interface IShowRepository : IRepository diff --git a/Kyoo/Controllers/Repositories/CollectionRepository.cs b/Kyoo/Controllers/Repositories/CollectionRepository.cs index 139df7d4..776cc597 100644 --- a/Kyoo/Controllers/Repositories/CollectionRepository.cs +++ b/Kyoo/Controllers/Repositories/CollectionRepository.cs @@ -137,5 +137,23 @@ namespace Kyoo.Controllers _database.Entry(link).State = EntityState.Deleted; await _database.SaveChangesAsync(); } + + public async Task DeleteRange(IEnumerable objs) + { + foreach (Collection obj in objs) + await Delete(obj); + } + + public async Task DeleteRange(IEnumerable ids) + { + foreach (int id in ids) + await Delete(id); + } + + public async Task DeleteRange(IEnumerable slugs) + { + foreach (string slug in slugs) + await Delete(slug); + } } } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/EpisodeRepository.cs b/Kyoo/Controllers/Repositories/EpisodeRepository.cs index b6924c5c..e4d54134 100644 --- a/Kyoo/Controllers/Repositories/EpisodeRepository.cs +++ b/Kyoo/Controllers/Repositories/EpisodeRepository.cs @@ -5,7 +5,6 @@ using System.Threading.Tasks; using Kyoo.Models; using Kyoo.Models.Exceptions; using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; namespace Kyoo.Controllers { @@ -13,14 +12,13 @@ namespace Kyoo.Controllers { private readonly DatabaseContext _database; private readonly IProviderRepository _providers; - private readonly ITrackRepository _tracks; + // private readonly ITrackRepository _tracks; - public EpisodeRepository(DatabaseContext database, IProviderRepository providers, ITrackRepository tracks) + public EpisodeRepository(DatabaseContext database, IProviderRepository providers) { _database = database; _providers = providers; - _tracks = tracks; } public void Dispose() @@ -168,6 +166,23 @@ namespace Kyoo.Controllers } } + public async Task> GetEpisodes(int showID, int seasonNumber) + { + return await _database.Episodes.Where(x => x.ShowID == showID + && x.SeasonNumber == seasonNumber).ToListAsync(); + } + + public async Task> GetEpisodes(string showSlug, int seasonNumber) + { + return await _database.Episodes.Where(x => x.Show.Slug == showSlug + && x.SeasonNumber == seasonNumber).ToListAsync(); + } + + public async Task> GetEpisodes(int seasonID) + { + return await _database.Episodes.Where(x => x.SeasonID == seasonID).ToListAsync(); + } + public async Task Delete(int id) { Episode obj = await Get(id); @@ -195,31 +210,26 @@ namespace Kyoo.Controllers if (obj.ExternalIDs != null) foreach (MetadataID entry in obj.ExternalIDs) _database.Entry(entry).State = EntityState.Deleted; - // Since Tracks & Episodes are on the same database and handled by dotnet-ef, we can't use the repository to delete them. - /*if (obj.Tracks != null) - * foreach (Track entry in obj.Tracks) - * await _tracks.Delete(entry); - */ - await _database.SaveChangesAsync(); } + + public async Task DeleteRange(IEnumerable objs) + { + foreach (Episode obj in objs) + await Delete(obj); + } - public async Task> GetEpisodes(int showID, int seasonNumber) + public async Task DeleteRange(IEnumerable ids) { - return await _database.Episodes.Where(x => x.ShowID == showID - && x.SeasonNumber == seasonNumber).ToListAsync(); + foreach (int id in ids) + await Delete(id); } - - public async Task> GetEpisodes(string showSlug, int seasonNumber) + + public async Task DeleteRange(IEnumerable slugs) { - return await _database.Episodes.Where(x => x.Show.Slug == showSlug - && x.SeasonNumber == seasonNumber).ToListAsync(); - } - - public async Task> GetEpisodes(int seasonID) - { - return await _database.Episodes.Where(x => x.SeasonID == seasonID).ToListAsync(); + foreach (string slug in slugs) + await Delete(slug); } } } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/GenreRepository.cs b/Kyoo/Controllers/Repositories/GenreRepository.cs index 0da62f6d..9834e37e 100644 --- a/Kyoo/Controllers/Repositories/GenreRepository.cs +++ b/Kyoo/Controllers/Repositories/GenreRepository.cs @@ -134,5 +134,23 @@ namespace Kyoo.Controllers _database.Entry(link).State = EntityState.Deleted; await _database.SaveChangesAsync(); } + + public async Task DeleteRange(IEnumerable objs) + { + foreach (Genre obj in objs) + await Delete(obj); + } + + public async Task DeleteRange(IEnumerable ids) + { + foreach (int id in ids) + await Delete(id); + } + + public async Task DeleteRange(IEnumerable slugs) + { + foreach (string slug in slugs) + await Delete(slug); + } } } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/LibraryRepository.cs b/Kyoo/Controllers/Repositories/LibraryRepository.cs index 5f29e98e..99e15a0f 100644 --- a/Kyoo/Controllers/Repositories/LibraryRepository.cs +++ b/Kyoo/Controllers/Repositories/LibraryRepository.cs @@ -150,5 +150,23 @@ namespace Kyoo.Controllers _database.Entry(entry).State = EntityState.Deleted; await _database.SaveChangesAsync(); } + + public async Task DeleteRange(IEnumerable objs) + { + foreach (Library obj in objs) + await Delete(obj); + } + + public async Task DeleteRange(IEnumerable ids) + { + foreach (int id in ids) + await Delete(id); + } + + public async Task DeleteRange(IEnumerable slugs) + { + foreach (string slug in slugs) + await Delete(slug); + } } } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/PeopleRepository.cs b/Kyoo/Controllers/Repositories/PeopleRepository.cs index 60102aff..85664970 100644 --- a/Kyoo/Controllers/Repositories/PeopleRepository.cs +++ b/Kyoo/Controllers/Repositories/PeopleRepository.cs @@ -149,5 +149,23 @@ namespace Kyoo.Controllers _database.Entry(link).State = EntityState.Deleted; await _database.SaveChangesAsync(); } + + public async Task DeleteRange(IEnumerable objs) + { + foreach (People obj in objs) + await Delete(obj); + } + + public async Task DeleteRange(IEnumerable ids) + { + foreach (int id in ids) + await Delete(id); + } + + public async Task DeleteRange(IEnumerable slugs) + { + foreach (string slug in slugs) + await Delete(slug); + } } } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/ProviderRepository.cs b/Kyoo/Controllers/Repositories/ProviderRepository.cs index 0ed4614d..ec298411 100644 --- a/Kyoo/Controllers/Repositories/ProviderRepository.cs +++ b/Kyoo/Controllers/Repositories/ProviderRepository.cs @@ -131,5 +131,23 @@ namespace Kyoo.Controllers // TODO handle ExternalID deletion when they refer to this providerID. await _database.SaveChangesAsync(); } + + public async Task DeleteRange(IEnumerable objs) + { + foreach (ProviderID obj in objs) + await Delete(obj); + } + + public async Task DeleteRange(IEnumerable ids) + { + foreach (int id in ids) + await Delete(id); + } + + public async Task DeleteRange(IEnumerable slugs) + { + foreach (string slug in slugs) + await Delete(slug); + } } } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/SeasonRepository.cs b/Kyoo/Controllers/Repositories/SeasonRepository.cs index 7ed56125..df0bdbd2 100644 --- a/Kyoo/Controllers/Repositories/SeasonRepository.cs +++ b/Kyoo/Controllers/Repositories/SeasonRepository.cs @@ -144,6 +144,16 @@ namespace Kyoo.Controllers } } + public async Task> GetSeasons(int showID) + { + return await _database.Seasons.Where(x => x.ShowID == showID).ToListAsync(); + } + + public async Task> GetSeasons(string showSlug) + { + return await _database.Seasons.Where(x => x.Show.Slug == showSlug).ToListAsync(); + } + public async Task Delete(int id) { Season obj = await Get(id); @@ -172,19 +182,26 @@ namespace Kyoo.Controllers foreach (MetadataID entry in obj.ExternalIDs) _database.Entry(entry).State = EntityState.Deleted; if (obj.Episodes != null) - foreach (Episode episode in obj.Episodes) - await _episodes.Delete(episode); + await _episodes.DeleteRange(obj.Episodes); await _database.SaveChangesAsync(); } - public async Task> GetSeasons(int showID) + public async Task DeleteRange(IEnumerable objs) { - return await _database.Seasons.Where(x => x.ShowID == showID).ToListAsync(); + foreach (Season obj in objs) + await Delete(obj); } - - public async Task> GetSeasons(string showSlug) + + public async Task DeleteRange(IEnumerable ids) { - return await _database.Seasons.Where(x => x.Show.Slug == showSlug).ToListAsync(); + foreach (int id in ids) + await Delete(id); + } + + public async Task DeleteRange(IEnumerable slugs) + { + foreach (string slug in slugs) + await Delete(slug); } } } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index f355c5cc..60a587ae 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -162,6 +162,29 @@ namespace Kyoo.Controllers foreach (MetadataID link in obj.ExternalIDs) link.ProviderID = await _providers.CreateIfNotExists(link.Provider); } + + public async Task AddShowLink(int showID, int? libraryID, int? collectionID) + { + if (collectionID != null) + { + _database.CollectionLinks.AddIfNotExist(new CollectionLink { CollectionID = collectionID, ShowID = showID}, + x => x.CollectionID == collectionID && x.ShowID == showID); + } + if (libraryID != null) + { + _database.LibraryLinks.AddIfNotExist(new LibraryLink {LibraryID = libraryID.Value, ShowID = showID}, + x => x.LibraryID == libraryID.Value && x.CollectionID == null && x.ShowID == showID); + } + + if (libraryID != null && collectionID != null) + { + _database.LibraryLinks.AddIfNotExist( + new LibraryLink {LibraryID = libraryID.Value, CollectionID = collectionID.Value}, + x => x.LibraryID == libraryID && x.CollectionID == collectionID && x.ShowID == null); + } + + await _database.SaveChangesAsync(); + } public async Task Delete(int id) { @@ -198,35 +221,28 @@ namespace Kyoo.Controllers _database.Entry(entry).State = EntityState.Deleted; if (obj.Seasons != null) - foreach (Season season in obj.Seasons) - await _seasons.Delete(season); + await _seasons.DeleteRange(obj.Seasons); if (obj.Episodes != null) - foreach (Episode episode in obj.Episodes.Where(x => x.SeasonID == null)) - await _episodes.Delete(episode); + await _episodes.DeleteRange(obj.Episodes); await _database.SaveChangesAsync(); } - public async Task AddShowLink(int showID, int? libraryID, int? collectionID) + public async Task DeleteRange(IEnumerable objs) { - if (collectionID != null) - { - _database.CollectionLinks.AddIfNotExist(new CollectionLink { CollectionID = collectionID, ShowID = showID}, - x => x.CollectionID == collectionID && x.ShowID == showID); - } - if (libraryID != null) - { - _database.LibraryLinks.AddIfNotExist(new LibraryLink {LibraryID = libraryID.Value, ShowID = showID}, - x => x.LibraryID == libraryID.Value && x.CollectionID == null && x.ShowID == showID); - } - - if (libraryID != null && collectionID != null) - { - _database.LibraryLinks.AddIfNotExist( - new LibraryLink {LibraryID = libraryID.Value, CollectionID = collectionID.Value}, - x => x.LibraryID == libraryID && x.CollectionID == collectionID && x.ShowID == null); - } - - await _database.SaveChangesAsync(); + foreach (Show obj in objs) + await Delete(obj); + } + + public async Task DeleteRange(IEnumerable ids) + { + foreach (int id in ids) + await Delete(id); + } + + public async Task DeleteRange(IEnumerable slugs) + { + foreach (string slug in slugs) + await Delete(slug); } } } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/StudioRepository.cs b/Kyoo/Controllers/Repositories/StudioRepository.cs index e6bf7578..69e93e74 100644 --- a/Kyoo/Controllers/Repositories/StudioRepository.cs +++ b/Kyoo/Controllers/Repositories/StudioRepository.cs @@ -133,5 +133,23 @@ namespace Kyoo.Controllers show.StudioID = null; await _database.SaveChangesAsync(); } + + public async Task DeleteRange(IEnumerable objs) + { + foreach (Studio obj in objs) + await Delete(obj); + } + + public async Task DeleteRange(IEnumerable ids) + { + foreach (int id in ids) + await Delete(id); + } + + public async Task DeleteRange(IEnumerable slugs) + { + foreach (string slug in slugs) + await Delete(slug); + } } } \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/TrackRepository.cs b/Kyoo/Controllers/Repositories/TrackRepository.cs index 89284f29..dbc54b01 100644 --- a/Kyoo/Controllers/Repositories/TrackRepository.cs +++ b/Kyoo/Controllers/Repositories/TrackRepository.cs @@ -119,5 +119,23 @@ namespace Kyoo.Controllers _database.Entry(obj).State = EntityState.Deleted; await _database.SaveChangesAsync(); } + + public async Task DeleteRange(IEnumerable objs) + { + foreach (Track obj in objs) + await Delete(obj); + } + + public async Task DeleteRange(IEnumerable ids) + { + foreach (int id in ids) + await Delete(id); + } + + public async Task DeleteRange(IEnumerable slugs) + { + foreach (string slug in slugs) + await Delete(slug); + } } } \ No newline at end of file diff --git a/Kyoo/Startup.cs b/Kyoo/Startup.cs index 0c19d8d7..c59758f0 100644 --- a/Kyoo/Startup.cs +++ b/Kyoo/Startup.cs @@ -46,9 +46,9 @@ namespace Kyoo services.AddDbContext(options => { options.UseLazyLoadingProxies() - .UseNpgsql(_configuration.GetConnectionString("Database")); - //.EnableSensitiveDataLogging() - //.UseLoggerFactory(LoggerFactory.Create(builder => builder.AddConsole())); + .UseNpgsql(_configuration.GetConnectionString("Database")) + .EnableSensitiveDataLogging() + .UseLoggerFactory(LoggerFactory.Create(builder => builder.AddConsole())); }, ServiceLifetime.Transient); services.AddDbContext(options => diff --git a/Kyoo/Tasks/Crawler.cs b/Kyoo/Tasks/Crawler.cs index c619ad8f..91747974 100644 --- a/Kyoo/Tasks/Crawler.cs +++ b/Kyoo/Tasks/Crawler.cs @@ -59,9 +59,9 @@ namespace Kyoo.Controllers using IServiceScope serviceScope = _serviceProvider.CreateScope(); await using ILibraryManager libraryManager = serviceScope.ServiceProvider.GetService(); - // foreach (Show show in await libraryManager.GetShows()) - // if (!Directory.Exists(show.Path)) - // await libraryManager.DeleteShow(show); + foreach (Show show in await libraryManager.GetShows()) + if (!Directory.Exists(show.Path)) + await libraryManager.DeleteShow(show); ICollection episodes = await libraryManager.GetEpisodes(); ICollection libraries = argument == null From 52d1fa522f21eb1d9e4d84d63d9f920904e286d5 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Tue, 23 Jun 2020 02:13:45 +0200 Subject: [PATCH 12/12] Fixing hard deletes on repositories --- .../Repositories/SeasonRepository.cs | 5 +- .../Repositories/ShowRepository.cs | 11 +- Kyoo/Models/DatabaseContext.cs | 20 +- .../20200623000428_Initial.Designer.cs | 644 ++++++++++++++++++ .../Internal/20200623000428_Initial.cs | 594 ++++++++++++++++ .../Internal/DatabaseContextModelSnapshot.cs | 642 +++++++++++++++++ Kyoo/Startup.cs | 6 +- Kyoo/{regexTesterr.sh => regexTester.sh} | 0 8 files changed, 1915 insertions(+), 7 deletions(-) create mode 100644 Kyoo/Models/DatabaseMigrations/Internal/20200623000428_Initial.Designer.cs create mode 100644 Kyoo/Models/DatabaseMigrations/Internal/20200623000428_Initial.cs create mode 100644 Kyoo/Models/DatabaseMigrations/Internal/DatabaseContextModelSnapshot.cs rename Kyoo/{regexTesterr.sh => regexTester.sh} (100%) diff --git a/Kyoo/Controllers/Repositories/SeasonRepository.cs b/Kyoo/Controllers/Repositories/SeasonRepository.cs index df0bdbd2..c9433c72 100644 --- a/Kyoo/Controllers/Repositories/SeasonRepository.cs +++ b/Kyoo/Controllers/Repositories/SeasonRepository.cs @@ -178,12 +178,15 @@ namespace Kyoo.Controllers throw new ArgumentNullException(nameof(obj)); _database.Entry(obj).State = EntityState.Deleted; + if (obj.ExternalIDs != null) foreach (MetadataID entry in obj.ExternalIDs) _database.Entry(entry).State = EntityState.Deleted; + + await _database.SaveChangesAsync(); + if (obj.Episodes != null) await _episodes.DeleteRange(obj.Episodes); - await _database.SaveChangesAsync(); } public async Task DeleteRange(IEnumerable objs) diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index 60a587ae..20bc7f67 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -204,27 +204,34 @@ namespace Kyoo.Controllers 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 (PeopleLink entry in obj.People) _database.Entry(entry).State = EntityState.Deleted; + 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(); + if (obj.Seasons != null) await _seasons.DeleteRange(obj.Seasons); - if (obj.Episodes != null) + + if (obj.Episodes != null) await _episodes.DeleteRange(obj.Episodes); - await _database.SaveChangesAsync(); } public async Task DeleteRange(IEnumerable objs) diff --git a/Kyoo/Models/DatabaseContext.cs b/Kyoo/Models/DatabaseContext.cs index 1adc80d3..43c8ebfa 100644 --- a/Kyoo/Models/DatabaseContext.cs +++ b/Kyoo/Models/DatabaseContext.cs @@ -120,7 +120,7 @@ namespace Kyoo .Ignore(x => x.Genres) .Ignore(x => x.Libraries) .Ignore(x => x.Collections); - + modelBuilder.Entity() .Ignore(x => x.Slug) .Ignore(x => x.Name) @@ -129,6 +129,24 @@ namespace Kyoo modelBuilder.Entity() .Ignore(x => x.Shows); + + modelBuilder.Entity() + .HasOne(x => x.Show) + .WithMany(x => x.ExternalIDs) + .OnDelete(DeleteBehavior.Cascade); + modelBuilder.Entity() + .HasOne(x => x.Season) + .WithMany(x => x.ExternalIDs) + .OnDelete(DeleteBehavior.Cascade); + modelBuilder.Entity() + .HasOne(x => x.Episode) + .WithMany(x => x.ExternalIDs) + .OnDelete(DeleteBehavior.Cascade); + modelBuilder.Entity() + .HasOne(x => x.People) + .WithMany(x => x.ExternalIDs) + .OnDelete(DeleteBehavior.Cascade); + modelBuilder.Entity() .HasIndex(x => x.Slug) diff --git a/Kyoo/Models/DatabaseMigrations/Internal/20200623000428_Initial.Designer.cs b/Kyoo/Models/DatabaseMigrations/Internal/20200623000428_Initial.Designer.cs new file mode 100644 index 00000000..1467c44e --- /dev/null +++ b/Kyoo/Models/DatabaseMigrations/Internal/20200623000428_Initial.Designer.cs @@ -0,0 +1,644 @@ +// +using System; +using Kyoo; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace Kyoo.Models.DatabaseMigrations.Internal +{ + [DbContext(typeof(DatabaseContext))] + [Migration("20200623000428_Initial")] + partial class Initial + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn) + .HasAnnotation("ProductVersion", "3.1.3") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + modelBuilder.Entity("Kyoo.Models.Collection", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("ImgPrimary") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Overview") + .HasColumnType("text"); + + b.Property("Poster") + .HasColumnType("text"); + + b.Property("Slug") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("Slug") + .IsUnique(); + + b.ToTable("Collections"); + }); + + modelBuilder.Entity("Kyoo.Models.CollectionLink", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("CollectionID") + .HasColumnType("integer"); + + b.Property("ShowID") + .HasColumnType("integer"); + + b.HasKey("ID"); + + b.HasIndex("CollectionID"); + + b.HasIndex("ShowID"); + + b.ToTable("CollectionLinks"); + }); + + modelBuilder.Entity("Kyoo.Models.Episode", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("AbsoluteNumber") + .HasColumnType("integer"); + + b.Property("EpisodeNumber") + .HasColumnType("integer"); + + b.Property("ImgPrimary") + .HasColumnType("text"); + + b.Property("Overview") + .HasColumnType("text"); + + b.Property("Path") + .HasColumnType("text"); + + b.Property("ReleaseDate") + .HasColumnType("timestamp without time zone"); + + b.Property("Runtime") + .HasColumnType("integer"); + + b.Property("SeasonID") + .HasColumnType("integer"); + + b.Property("SeasonNumber") + .HasColumnType("integer"); + + b.Property("ShowID") + .HasColumnType("integer"); + + b.Property("Title") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("SeasonID"); + + b.HasIndex("ShowID", "SeasonNumber", "EpisodeNumber", "AbsoluteNumber") + .IsUnique(); + + b.ToTable("Episodes"); + }); + + modelBuilder.Entity("Kyoo.Models.Genre", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Slug") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("Slug") + .IsUnique(); + + b.ToTable("Genres"); + }); + + modelBuilder.Entity("Kyoo.Models.GenreLink", b => + { + b.Property("ShowID") + .HasColumnType("integer"); + + b.Property("GenreID") + .HasColumnType("integer"); + + b.HasKey("ShowID", "GenreID"); + + b.HasIndex("GenreID"); + + b.ToTable("GenreLinks"); + }); + + modelBuilder.Entity("Kyoo.Models.Library", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Paths") + .HasColumnType("text"); + + b.Property("Slug") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("Slug") + .IsUnique(); + + b.ToTable("Libraries"); + }); + + modelBuilder.Entity("Kyoo.Models.LibraryLink", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("CollectionID") + .HasColumnType("integer"); + + b.Property("LibraryID") + .HasColumnType("integer"); + + b.Property("ShowID") + .HasColumnType("integer"); + + b.HasKey("ID"); + + b.HasIndex("CollectionID"); + + b.HasIndex("LibraryID"); + + b.HasIndex("ShowID"); + + b.ToTable("LibraryLinks"); + }); + + modelBuilder.Entity("Kyoo.Models.MetadataID", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("DataID") + .HasColumnType("text"); + + b.Property("EpisodeID") + .HasColumnType("integer"); + + b.Property("Link") + .HasColumnType("text"); + + b.Property("PeopleID") + .HasColumnType("integer"); + + b.Property("ProviderID") + .HasColumnType("integer"); + + b.Property("SeasonID") + .HasColumnType("integer"); + + b.Property("ShowID") + .HasColumnType("integer"); + + b.HasKey("ID"); + + b.HasIndex("EpisodeID"); + + b.HasIndex("PeopleID"); + + b.HasIndex("ProviderID"); + + b.HasIndex("SeasonID"); + + b.HasIndex("ShowID"); + + b.ToTable("MetadataIds"); + }); + + modelBuilder.Entity("Kyoo.Models.People", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("ImgPrimary") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Slug") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("Slug") + .IsUnique(); + + b.ToTable("Peoples"); + }); + + modelBuilder.Entity("Kyoo.Models.PeopleLink", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("PeopleID") + .HasColumnType("integer"); + + b.Property("Role") + .HasColumnType("text"); + + b.Property("ShowID") + .HasColumnType("integer"); + + b.Property("Type") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("PeopleID"); + + b.HasIndex("ShowID"); + + b.ToTable("PeopleLinks"); + }); + + modelBuilder.Entity("Kyoo.Models.ProviderID", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Logo") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Providers"); + }); + + modelBuilder.Entity("Kyoo.Models.ProviderLink", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("LibraryID") + .HasColumnType("integer"); + + b.Property("ProviderID") + .HasColumnType("integer"); + + b.HasKey("ID"); + + b.HasIndex("LibraryID"); + + b.HasIndex("ProviderID"); + + b.ToTable("ProviderLinks"); + }); + + modelBuilder.Entity("Kyoo.Models.Season", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("ImgPrimary") + .HasColumnType("text"); + + b.Property("Overview") + .HasColumnType("text"); + + b.Property("SeasonNumber") + .HasColumnType("integer"); + + b.Property("ShowID") + .HasColumnType("integer"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("Year") + .HasColumnType("integer"); + + b.HasKey("ID"); + + b.HasIndex("ShowID", "SeasonNumber") + .IsUnique(); + + b.ToTable("Seasons"); + }); + + modelBuilder.Entity("Kyoo.Models.Show", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Aliases") + .HasColumnType("text"); + + b.Property("Backdrop") + .HasColumnType("text"); + + b.Property("EndYear") + .HasColumnType("integer"); + + b.Property("IsMovie") + .HasColumnType("boolean"); + + b.Property("Logo") + .HasColumnType("text"); + + b.Property("Overview") + .HasColumnType("text"); + + b.Property("Path") + .HasColumnType("text"); + + b.Property("Poster") + .HasColumnType("text"); + + b.Property("Slug") + .HasColumnType("text"); + + b.Property("StartYear") + .HasColumnType("integer"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StudioID") + .HasColumnType("integer"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("TrailerUrl") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("StudioID"); + + b.ToTable("Shows"); + }); + + modelBuilder.Entity("Kyoo.Models.Studio", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Slug") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("Slug") + .IsUnique(); + + b.ToTable("Studios"); + }); + + modelBuilder.Entity("Kyoo.Models.Track", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Codec") + .HasColumnType("text"); + + b.Property("EpisodeID") + .HasColumnType("integer"); + + b.Property("IsDefault") + .HasColumnType("boolean"); + + b.Property("IsExternal") + .HasColumnType("boolean"); + + b.Property("IsForced") + .HasColumnType("boolean"); + + b.Property("Language") + .HasColumnType("text"); + + b.Property("Path") + .HasColumnType("text"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("ID"); + + b.HasIndex("EpisodeID"); + + b.ToTable("Tracks"); + }); + + modelBuilder.Entity("Kyoo.Models.CollectionLink", b => + { + b.HasOne("Kyoo.Models.Collection", "Collection") + .WithMany("Links") + .HasForeignKey("CollectionID"); + + b.HasOne("Kyoo.Models.Show", "Show") + .WithMany("CollectionLinks") + .HasForeignKey("ShowID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Kyoo.Models.Episode", b => + { + b.HasOne("Kyoo.Models.Season", "Season") + .WithMany("Episodes") + .HasForeignKey("SeasonID"); + + b.HasOne("Kyoo.Models.Show", "Show") + .WithMany("Episodes") + .HasForeignKey("ShowID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Kyoo.Models.GenreLink", b => + { + b.HasOne("Kyoo.Models.Genre", "Genre") + .WithMany("Links") + .HasForeignKey("GenreID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", "Show") + .WithMany("GenreLinks") + .HasForeignKey("ShowID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Kyoo.Models.LibraryLink", b => + { + b.HasOne("Kyoo.Models.Collection", "Collection") + .WithMany("LibraryLinks") + .HasForeignKey("CollectionID"); + + b.HasOne("Kyoo.Models.Library", "Library") + .WithMany("Links") + .HasForeignKey("LibraryID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", "Show") + .WithMany("LibraryLinks") + .HasForeignKey("ShowID"); + }); + + modelBuilder.Entity("Kyoo.Models.MetadataID", b => + { + b.HasOne("Kyoo.Models.Episode", "Episode") + .WithMany("ExternalIDs") + .HasForeignKey("EpisodeID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Kyoo.Models.People", "People") + .WithMany("ExternalIDs") + .HasForeignKey("PeopleID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Kyoo.Models.ProviderID", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Season", "Season") + .WithMany("ExternalIDs") + .HasForeignKey("SeasonID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Kyoo.Models.Show", "Show") + .WithMany("ExternalIDs") + .HasForeignKey("ShowID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Kyoo.Models.PeopleLink", b => + { + b.HasOne("Kyoo.Models.People", "People") + .WithMany("Roles") + .HasForeignKey("PeopleID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", "Show") + .WithMany("People") + .HasForeignKey("ShowID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Kyoo.Models.ProviderLink", b => + { + b.HasOne("Kyoo.Models.Library", "Library") + .WithMany("ProviderLinks") + .HasForeignKey("LibraryID"); + + b.HasOne("Kyoo.Models.ProviderID", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Kyoo.Models.Season", b => + { + b.HasOne("Kyoo.Models.Show", "Show") + .WithMany("Seasons") + .HasForeignKey("ShowID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Kyoo.Models.Show", b => + { + b.HasOne("Kyoo.Models.Studio", "Studio") + .WithMany("Shows") + .HasForeignKey("StudioID"); + }); + + modelBuilder.Entity("Kyoo.Models.Track", b => + { + b.HasOne("Kyoo.Models.Episode", "Episode") + .WithMany("Tracks") + .HasForeignKey("EpisodeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Kyoo/Models/DatabaseMigrations/Internal/20200623000428_Initial.cs b/Kyoo/Models/DatabaseMigrations/Internal/20200623000428_Initial.cs new file mode 100644 index 00000000..9151e80b --- /dev/null +++ b/Kyoo/Models/DatabaseMigrations/Internal/20200623000428_Initial.cs @@ -0,0 +1,594 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace Kyoo.Models.DatabaseMigrations.Internal +{ + public partial class Initial : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Collections", + columns: table => new + { + ID = table.Column(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Slug = table.Column(nullable: true), + Name = table.Column(nullable: true), + Poster = table.Column(nullable: true), + Overview = table.Column(nullable: true), + ImgPrimary = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Collections", x => x.ID); + }); + + migrationBuilder.CreateTable( + name: "Genres", + columns: table => new + { + ID = table.Column(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Slug = table.Column(nullable: true), + Name = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Genres", x => x.ID); + }); + + migrationBuilder.CreateTable( + name: "Libraries", + columns: table => new + { + ID = table.Column(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Slug = table.Column(nullable: true), + Name = table.Column(nullable: true), + Paths = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Libraries", x => x.ID); + }); + + migrationBuilder.CreateTable( + name: "Peoples", + columns: table => new + { + ID = table.Column(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Slug = table.Column(nullable: true), + Name = table.Column(nullable: true), + ImgPrimary = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Peoples", x => x.ID); + }); + + migrationBuilder.CreateTable( + name: "Providers", + columns: table => new + { + ID = table.Column(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Name = table.Column(nullable: true), + Logo = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Providers", x => x.ID); + }); + + migrationBuilder.CreateTable( + name: "Studios", + columns: table => new + { + ID = table.Column(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Slug = table.Column(nullable: true), + Name = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Studios", x => x.ID); + }); + + migrationBuilder.CreateTable( + name: "ProviderLinks", + columns: table => new + { + ID = table.Column(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + ProviderID = table.Column(nullable: false), + LibraryID = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ProviderLinks", x => x.ID); + table.ForeignKey( + name: "FK_ProviderLinks_Libraries_LibraryID", + column: x => x.LibraryID, + principalTable: "Libraries", + principalColumn: "ID", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_ProviderLinks_Providers_ProviderID", + column: x => x.ProviderID, + principalTable: "Providers", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Shows", + columns: table => new + { + ID = table.Column(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Slug = table.Column(nullable: true), + Title = table.Column(nullable: true), + Aliases = table.Column(nullable: true), + Path = table.Column(nullable: true), + Overview = table.Column(nullable: true), + Status = table.Column(nullable: true), + TrailerUrl = table.Column(nullable: true), + StartYear = table.Column(nullable: true), + EndYear = table.Column(nullable: true), + Poster = table.Column(nullable: true), + Logo = table.Column(nullable: true), + Backdrop = table.Column(nullable: true), + IsMovie = table.Column(nullable: false), + StudioID = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Shows", x => x.ID); + table.ForeignKey( + name: "FK_Shows_Studios_StudioID", + column: x => x.StudioID, + principalTable: "Studios", + principalColumn: "ID", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "CollectionLinks", + columns: table => new + { + ID = table.Column(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + CollectionID = table.Column(nullable: true), + ShowID = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_CollectionLinks", x => x.ID); + table.ForeignKey( + name: "FK_CollectionLinks_Collections_CollectionID", + column: x => x.CollectionID, + principalTable: "Collections", + principalColumn: "ID", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_CollectionLinks_Shows_ShowID", + column: x => x.ShowID, + principalTable: "Shows", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "GenreLinks", + columns: table => new + { + ShowID = table.Column(nullable: false), + GenreID = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_GenreLinks", x => new { x.ShowID, x.GenreID }); + table.ForeignKey( + name: "FK_GenreLinks_Genres_GenreID", + column: x => x.GenreID, + principalTable: "Genres", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_GenreLinks_Shows_ShowID", + column: x => x.ShowID, + principalTable: "Shows", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "LibraryLinks", + columns: table => new + { + ID = table.Column(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + LibraryID = table.Column(nullable: false), + ShowID = table.Column(nullable: true), + CollectionID = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_LibraryLinks", x => x.ID); + table.ForeignKey( + name: "FK_LibraryLinks_Collections_CollectionID", + column: x => x.CollectionID, + principalTable: "Collections", + principalColumn: "ID", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_LibraryLinks_Libraries_LibraryID", + column: x => x.LibraryID, + principalTable: "Libraries", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_LibraryLinks_Shows_ShowID", + column: x => x.ShowID, + principalTable: "Shows", + principalColumn: "ID", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateTable( + name: "PeopleLinks", + columns: table => new + { + ID = table.Column(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + PeopleID = table.Column(nullable: false), + ShowID = table.Column(nullable: false), + Role = table.Column(nullable: true), + Type = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_PeopleLinks", x => x.ID); + table.ForeignKey( + name: "FK_PeopleLinks_Peoples_PeopleID", + column: x => x.PeopleID, + principalTable: "Peoples", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_PeopleLinks_Shows_ShowID", + column: x => x.ShowID, + principalTable: "Shows", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Seasons", + columns: table => new + { + ID = table.Column(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + ShowID = table.Column(nullable: false), + SeasonNumber = table.Column(nullable: false), + Title = table.Column(nullable: true), + Overview = table.Column(nullable: true), + Year = table.Column(nullable: true), + ImgPrimary = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Seasons", x => x.ID); + table.ForeignKey( + name: "FK_Seasons_Shows_ShowID", + column: x => x.ShowID, + principalTable: "Shows", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Episodes", + columns: table => new + { + ID = table.Column(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + ShowID = table.Column(nullable: false), + SeasonID = table.Column(nullable: true), + SeasonNumber = table.Column(nullable: false), + EpisodeNumber = table.Column(nullable: false), + AbsoluteNumber = table.Column(nullable: false), + Path = table.Column(nullable: true), + Title = table.Column(nullable: true), + Overview = table.Column(nullable: true), + ReleaseDate = table.Column(nullable: true), + Runtime = table.Column(nullable: false), + ImgPrimary = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Episodes", x => x.ID); + table.ForeignKey( + name: "FK_Episodes_Seasons_SeasonID", + column: x => x.SeasonID, + principalTable: "Seasons", + principalColumn: "ID", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_Episodes_Shows_ShowID", + column: x => x.ShowID, + principalTable: "Shows", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "MetadataIds", + columns: table => new + { + ID = table.Column(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + ProviderID = table.Column(nullable: false), + ShowID = table.Column(nullable: true), + EpisodeID = table.Column(nullable: true), + SeasonID = table.Column(nullable: true), + PeopleID = table.Column(nullable: true), + DataID = table.Column(nullable: true), + Link = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_MetadataIds", x => x.ID); + table.ForeignKey( + name: "FK_MetadataIds_Episodes_EpisodeID", + column: x => x.EpisodeID, + principalTable: "Episodes", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_MetadataIds_Peoples_PeopleID", + column: x => x.PeopleID, + principalTable: "Peoples", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_MetadataIds_Providers_ProviderID", + column: x => x.ProviderID, + principalTable: "Providers", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_MetadataIds_Seasons_SeasonID", + column: x => x.SeasonID, + principalTable: "Seasons", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_MetadataIds_Shows_ShowID", + column: x => x.ShowID, + principalTable: "Shows", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Tracks", + columns: table => new + { + ID = table.Column(nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Title = table.Column(nullable: true), + Language = table.Column(nullable: true), + Codec = table.Column(nullable: true), + Path = table.Column(nullable: true), + Type = table.Column(nullable: false), + EpisodeID = table.Column(nullable: false), + IsDefault = table.Column(nullable: false), + IsForced = table.Column(nullable: false), + IsExternal = table.Column(nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Tracks", x => x.ID); + table.ForeignKey( + name: "FK_Tracks_Episodes_EpisodeID", + column: x => x.EpisodeID, + principalTable: "Episodes", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_CollectionLinks_CollectionID", + table: "CollectionLinks", + column: "CollectionID"); + + migrationBuilder.CreateIndex( + name: "IX_CollectionLinks_ShowID", + table: "CollectionLinks", + column: "ShowID"); + + migrationBuilder.CreateIndex( + name: "IX_Collections_Slug", + table: "Collections", + column: "Slug", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Episodes_SeasonID", + table: "Episodes", + column: "SeasonID"); + + migrationBuilder.CreateIndex( + name: "IX_Episodes_ShowID_SeasonNumber_EpisodeNumber_AbsoluteNumber", + table: "Episodes", + columns: new[] { "ShowID", "SeasonNumber", "EpisodeNumber", "AbsoluteNumber" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_GenreLinks_GenreID", + table: "GenreLinks", + column: "GenreID"); + + migrationBuilder.CreateIndex( + name: "IX_Genres_Slug", + table: "Genres", + column: "Slug", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Libraries_Slug", + table: "Libraries", + column: "Slug", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_LibraryLinks_CollectionID", + table: "LibraryLinks", + column: "CollectionID"); + + migrationBuilder.CreateIndex( + name: "IX_LibraryLinks_LibraryID", + table: "LibraryLinks", + column: "LibraryID"); + + migrationBuilder.CreateIndex( + name: "IX_LibraryLinks_ShowID", + table: "LibraryLinks", + column: "ShowID"); + + migrationBuilder.CreateIndex( + name: "IX_MetadataIds_EpisodeID", + table: "MetadataIds", + column: "EpisodeID"); + + migrationBuilder.CreateIndex( + name: "IX_MetadataIds_PeopleID", + table: "MetadataIds", + column: "PeopleID"); + + migrationBuilder.CreateIndex( + name: "IX_MetadataIds_ProviderID", + table: "MetadataIds", + column: "ProviderID"); + + migrationBuilder.CreateIndex( + name: "IX_MetadataIds_SeasonID", + table: "MetadataIds", + column: "SeasonID"); + + migrationBuilder.CreateIndex( + name: "IX_MetadataIds_ShowID", + table: "MetadataIds", + column: "ShowID"); + + migrationBuilder.CreateIndex( + name: "IX_PeopleLinks_PeopleID", + table: "PeopleLinks", + column: "PeopleID"); + + migrationBuilder.CreateIndex( + name: "IX_PeopleLinks_ShowID", + table: "PeopleLinks", + column: "ShowID"); + + migrationBuilder.CreateIndex( + name: "IX_Peoples_Slug", + table: "Peoples", + column: "Slug", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_ProviderLinks_LibraryID", + table: "ProviderLinks", + column: "LibraryID"); + + migrationBuilder.CreateIndex( + name: "IX_ProviderLinks_ProviderID", + table: "ProviderLinks", + column: "ProviderID"); + + migrationBuilder.CreateIndex( + name: "IX_Providers_Name", + table: "Providers", + column: "Name", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Seasons_ShowID_SeasonNumber", + table: "Seasons", + columns: new[] { "ShowID", "SeasonNumber" }, + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Shows_StudioID", + table: "Shows", + column: "StudioID"); + + migrationBuilder.CreateIndex( + name: "IX_Studios_Slug", + table: "Studios", + column: "Slug", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Tracks_EpisodeID", + table: "Tracks", + column: "EpisodeID"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CollectionLinks"); + + migrationBuilder.DropTable( + name: "GenreLinks"); + + migrationBuilder.DropTable( + name: "LibraryLinks"); + + migrationBuilder.DropTable( + name: "MetadataIds"); + + migrationBuilder.DropTable( + name: "PeopleLinks"); + + migrationBuilder.DropTable( + name: "ProviderLinks"); + + migrationBuilder.DropTable( + name: "Tracks"); + + migrationBuilder.DropTable( + name: "Genres"); + + migrationBuilder.DropTable( + name: "Collections"); + + migrationBuilder.DropTable( + name: "Peoples"); + + migrationBuilder.DropTable( + name: "Libraries"); + + migrationBuilder.DropTable( + name: "Providers"); + + migrationBuilder.DropTable( + name: "Episodes"); + + migrationBuilder.DropTable( + name: "Seasons"); + + migrationBuilder.DropTable( + name: "Shows"); + + migrationBuilder.DropTable( + name: "Studios"); + } + } +} diff --git a/Kyoo/Models/DatabaseMigrations/Internal/DatabaseContextModelSnapshot.cs b/Kyoo/Models/DatabaseMigrations/Internal/DatabaseContextModelSnapshot.cs new file mode 100644 index 00000000..d71bb43d --- /dev/null +++ b/Kyoo/Models/DatabaseMigrations/Internal/DatabaseContextModelSnapshot.cs @@ -0,0 +1,642 @@ +// +using System; +using Kyoo; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace Kyoo.Models.DatabaseMigrations.Internal +{ + [DbContext(typeof(DatabaseContext))] + partial class DatabaseContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn) + .HasAnnotation("ProductVersion", "3.1.3") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + modelBuilder.Entity("Kyoo.Models.Collection", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("ImgPrimary") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Overview") + .HasColumnType("text"); + + b.Property("Poster") + .HasColumnType("text"); + + b.Property("Slug") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("Slug") + .IsUnique(); + + b.ToTable("Collections"); + }); + + modelBuilder.Entity("Kyoo.Models.CollectionLink", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("CollectionID") + .HasColumnType("integer"); + + b.Property("ShowID") + .HasColumnType("integer"); + + b.HasKey("ID"); + + b.HasIndex("CollectionID"); + + b.HasIndex("ShowID"); + + b.ToTable("CollectionLinks"); + }); + + modelBuilder.Entity("Kyoo.Models.Episode", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("AbsoluteNumber") + .HasColumnType("integer"); + + b.Property("EpisodeNumber") + .HasColumnType("integer"); + + b.Property("ImgPrimary") + .HasColumnType("text"); + + b.Property("Overview") + .HasColumnType("text"); + + b.Property("Path") + .HasColumnType("text"); + + b.Property("ReleaseDate") + .HasColumnType("timestamp without time zone"); + + b.Property("Runtime") + .HasColumnType("integer"); + + b.Property("SeasonID") + .HasColumnType("integer"); + + b.Property("SeasonNumber") + .HasColumnType("integer"); + + b.Property("ShowID") + .HasColumnType("integer"); + + b.Property("Title") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("SeasonID"); + + b.HasIndex("ShowID", "SeasonNumber", "EpisodeNumber", "AbsoluteNumber") + .IsUnique(); + + b.ToTable("Episodes"); + }); + + modelBuilder.Entity("Kyoo.Models.Genre", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Slug") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("Slug") + .IsUnique(); + + b.ToTable("Genres"); + }); + + modelBuilder.Entity("Kyoo.Models.GenreLink", b => + { + b.Property("ShowID") + .HasColumnType("integer"); + + b.Property("GenreID") + .HasColumnType("integer"); + + b.HasKey("ShowID", "GenreID"); + + b.HasIndex("GenreID"); + + b.ToTable("GenreLinks"); + }); + + modelBuilder.Entity("Kyoo.Models.Library", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Paths") + .HasColumnType("text"); + + b.Property("Slug") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("Slug") + .IsUnique(); + + b.ToTable("Libraries"); + }); + + modelBuilder.Entity("Kyoo.Models.LibraryLink", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("CollectionID") + .HasColumnType("integer"); + + b.Property("LibraryID") + .HasColumnType("integer"); + + b.Property("ShowID") + .HasColumnType("integer"); + + b.HasKey("ID"); + + b.HasIndex("CollectionID"); + + b.HasIndex("LibraryID"); + + b.HasIndex("ShowID"); + + b.ToTable("LibraryLinks"); + }); + + modelBuilder.Entity("Kyoo.Models.MetadataID", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("DataID") + .HasColumnType("text"); + + b.Property("EpisodeID") + .HasColumnType("integer"); + + b.Property("Link") + .HasColumnType("text"); + + b.Property("PeopleID") + .HasColumnType("integer"); + + b.Property("ProviderID") + .HasColumnType("integer"); + + b.Property("SeasonID") + .HasColumnType("integer"); + + b.Property("ShowID") + .HasColumnType("integer"); + + b.HasKey("ID"); + + b.HasIndex("EpisodeID"); + + b.HasIndex("PeopleID"); + + b.HasIndex("ProviderID"); + + b.HasIndex("SeasonID"); + + b.HasIndex("ShowID"); + + b.ToTable("MetadataIds"); + }); + + modelBuilder.Entity("Kyoo.Models.People", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("ImgPrimary") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Slug") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("Slug") + .IsUnique(); + + b.ToTable("Peoples"); + }); + + modelBuilder.Entity("Kyoo.Models.PeopleLink", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("PeopleID") + .HasColumnType("integer"); + + b.Property("Role") + .HasColumnType("text"); + + b.Property("ShowID") + .HasColumnType("integer"); + + b.Property("Type") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("PeopleID"); + + b.HasIndex("ShowID"); + + b.ToTable("PeopleLinks"); + }); + + modelBuilder.Entity("Kyoo.Models.ProviderID", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Logo") + .HasColumnType("text"); + + b.Property("Name") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Providers"); + }); + + modelBuilder.Entity("Kyoo.Models.ProviderLink", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("LibraryID") + .HasColumnType("integer"); + + b.Property("ProviderID") + .HasColumnType("integer"); + + b.HasKey("ID"); + + b.HasIndex("LibraryID"); + + b.HasIndex("ProviderID"); + + b.ToTable("ProviderLinks"); + }); + + modelBuilder.Entity("Kyoo.Models.Season", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("ImgPrimary") + .HasColumnType("text"); + + b.Property("Overview") + .HasColumnType("text"); + + b.Property("SeasonNumber") + .HasColumnType("integer"); + + b.Property("ShowID") + .HasColumnType("integer"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("Year") + .HasColumnType("integer"); + + b.HasKey("ID"); + + b.HasIndex("ShowID", "SeasonNumber") + .IsUnique(); + + b.ToTable("Seasons"); + }); + + modelBuilder.Entity("Kyoo.Models.Show", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Aliases") + .HasColumnType("text"); + + b.Property("Backdrop") + .HasColumnType("text"); + + b.Property("EndYear") + .HasColumnType("integer"); + + b.Property("IsMovie") + .HasColumnType("boolean"); + + b.Property("Logo") + .HasColumnType("text"); + + b.Property("Overview") + .HasColumnType("text"); + + b.Property("Path") + .HasColumnType("text"); + + b.Property("Poster") + .HasColumnType("text"); + + b.Property("Slug") + .HasColumnType("text"); + + b.Property("StartYear") + .HasColumnType("integer"); + + b.Property("Status") + .HasColumnType("integer"); + + b.Property("StudioID") + .HasColumnType("integer"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("TrailerUrl") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("StudioID"); + + b.ToTable("Shows"); + }); + + modelBuilder.Entity("Kyoo.Models.Studio", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text"); + + b.Property("Slug") + .HasColumnType("text"); + + b.HasKey("ID"); + + b.HasIndex("Slug") + .IsUnique(); + + b.ToTable("Studios"); + }); + + modelBuilder.Entity("Kyoo.Models.Track", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Codec") + .HasColumnType("text"); + + b.Property("EpisodeID") + .HasColumnType("integer"); + + b.Property("IsDefault") + .HasColumnType("boolean"); + + b.Property("IsExternal") + .HasColumnType("boolean"); + + b.Property("IsForced") + .HasColumnType("boolean"); + + b.Property("Language") + .HasColumnType("text"); + + b.Property("Path") + .HasColumnType("text"); + + b.Property("Title") + .HasColumnType("text"); + + b.Property("Type") + .HasColumnType("integer"); + + b.HasKey("ID"); + + b.HasIndex("EpisodeID"); + + b.ToTable("Tracks"); + }); + + modelBuilder.Entity("Kyoo.Models.CollectionLink", b => + { + b.HasOne("Kyoo.Models.Collection", "Collection") + .WithMany("Links") + .HasForeignKey("CollectionID"); + + b.HasOne("Kyoo.Models.Show", "Show") + .WithMany("CollectionLinks") + .HasForeignKey("ShowID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Kyoo.Models.Episode", b => + { + b.HasOne("Kyoo.Models.Season", "Season") + .WithMany("Episodes") + .HasForeignKey("SeasonID"); + + b.HasOne("Kyoo.Models.Show", "Show") + .WithMany("Episodes") + .HasForeignKey("ShowID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Kyoo.Models.GenreLink", b => + { + b.HasOne("Kyoo.Models.Genre", "Genre") + .WithMany("Links") + .HasForeignKey("GenreID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", "Show") + .WithMany("GenreLinks") + .HasForeignKey("ShowID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Kyoo.Models.LibraryLink", b => + { + b.HasOne("Kyoo.Models.Collection", "Collection") + .WithMany("LibraryLinks") + .HasForeignKey("CollectionID"); + + b.HasOne("Kyoo.Models.Library", "Library") + .WithMany("Links") + .HasForeignKey("LibraryID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", "Show") + .WithMany("LibraryLinks") + .HasForeignKey("ShowID"); + }); + + modelBuilder.Entity("Kyoo.Models.MetadataID", b => + { + b.HasOne("Kyoo.Models.Episode", "Episode") + .WithMany("ExternalIDs") + .HasForeignKey("EpisodeID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Kyoo.Models.People", "People") + .WithMany("ExternalIDs") + .HasForeignKey("PeopleID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Kyoo.Models.ProviderID", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Season", "Season") + .WithMany("ExternalIDs") + .HasForeignKey("SeasonID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Kyoo.Models.Show", "Show") + .WithMany("ExternalIDs") + .HasForeignKey("ShowID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Kyoo.Models.PeopleLink", b => + { + b.HasOne("Kyoo.Models.People", "People") + .WithMany("Roles") + .HasForeignKey("PeopleID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", "Show") + .WithMany("People") + .HasForeignKey("ShowID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Kyoo.Models.ProviderLink", b => + { + b.HasOne("Kyoo.Models.Library", "Library") + .WithMany("ProviderLinks") + .HasForeignKey("LibraryID"); + + b.HasOne("Kyoo.Models.ProviderID", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Kyoo.Models.Season", b => + { + b.HasOne("Kyoo.Models.Show", "Show") + .WithMany("Seasons") + .HasForeignKey("ShowID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Kyoo.Models.Show", b => + { + b.HasOne("Kyoo.Models.Studio", "Studio") + .WithMany("Shows") + .HasForeignKey("StudioID"); + }); + + modelBuilder.Entity("Kyoo.Models.Track", b => + { + b.HasOne("Kyoo.Models.Episode", "Episode") + .WithMany("Tracks") + .HasForeignKey("EpisodeID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Kyoo/Startup.cs b/Kyoo/Startup.cs index c59758f0..3e45db4b 100644 --- a/Kyoo/Startup.cs +++ b/Kyoo/Startup.cs @@ -46,9 +46,9 @@ namespace Kyoo services.AddDbContext(options => { options.UseLazyLoadingProxies() - .UseNpgsql(_configuration.GetConnectionString("Database")) - .EnableSensitiveDataLogging() - .UseLoggerFactory(LoggerFactory.Create(builder => builder.AddConsole())); + .UseNpgsql(_configuration.GetConnectionString("Database")); + // .EnableSensitiveDataLogging() + // .UseLoggerFactory(LoggerFactory.Create(builder => builder.AddConsole())); }, ServiceLifetime.Transient); services.AddDbContext(options => diff --git a/Kyoo/regexTesterr.sh b/Kyoo/regexTester.sh similarity index 100% rename from Kyoo/regexTesterr.sh rename to Kyoo/regexTester.sh