From 756bfa762c1b0bb051195e7b2ec82ba765731271 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Fri, 30 Jul 2021 23:52:53 +0200 Subject: [PATCH] Removing links --- Kyoo.Common/Kyoo.Common.csproj | 2 +- Kyoo.Common/Models/Resources/Provider.cs | 7 +- Kyoo.Common/Models/Resources/User.cs | 26 +- Kyoo.CommonAPI/DatabaseContext.cs | 89 +-- ....cs => 20210730183548_Initial.Designer.cs} | 533 ++++++++---------- ...0_Initial.cs => 20210730183548_Initial.cs} | 132 ++--- ...cs => 20210730203102_Triggers.Designer.cs} | 533 ++++++++---------- ...Triggers.cs => 20210730203102_Triggers.cs} | 4 +- .../PostgresContextModelSnapshot.cs | 531 ++++++++--------- Kyoo.Postgresql/PostgresContext.cs | 10 + Kyoo.Postgresql/PostgresModule.cs | 2 +- ....cs => 20210730203155_Initial.Designer.cs} | 449 +++++++-------- ...2_Initial.cs => 20210730203155_Initial.cs} | 168 +++--- ...cs => 20210730203746_Triggers.Designer.cs} | 449 +++++++-------- ...Triggers.cs => 20210730203746_Triggers.cs} | 6 +- .../Migrations/SqLiteContextModelSnapshot.cs | 447 +++++++-------- Kyoo.SqLite/SqLiteContext.cs | 9 + Kyoo.SqLite/SqLiteModule.cs | 2 +- Kyoo.Tests/Database/RepositoryActivator.cs | 43 +- .../Database/SpecificTests/SanityTests.cs | 14 +- .../Database/SpecificTests/ShowTests.cs | 12 +- Kyoo.Tests/Database/TestSample.cs | 26 +- Kyoo.Tests/KAssert.cs | 11 +- Kyoo.Tests/Kyoo.Tests.csproj | 1 + Kyoo.TheMovieDb/ProviderTmdb.cs | 1 - Kyoo.TheTvdb/ProviderTvdb.cs | 1 - .../Repositories/CollectionRepository.cs | 1 + .../Repositories/EpisodeRepository.cs | 1 + .../Repositories/LibraryRepository.cs | 16 +- .../Repositories/PeopleRepository.cs | 1 + .../Repositories/SeasonRepository.cs | 1 + .../Repositories/ShowRepository.cs | 18 +- .../Repositories/StudioRepository.cs | 1 + Kyoo/Controllers/ThumbnailsManager.cs | 5 +- Kyoo/Kyoo.csproj | 2 +- 35 files changed, 1618 insertions(+), 1936 deletions(-) rename Kyoo.Postgresql/Migrations/{20210728141410_Initial.Designer.cs => 20210730183548_Initial.Designer.cs} (85%) rename Kyoo.Postgresql/Migrations/{20210728141410_Initial.cs => 20210730183548_Initial.cs} (90%) rename Kyoo.Postgresql/Migrations/{20210728142213_Triggers.Designer.cs => 20210730203102_Triggers.Designer.cs} (85%) rename Kyoo.Postgresql/Migrations/{20210728142213_Triggers.cs => 20210730203102_Triggers.cs} (98%) rename Kyoo.SqLite/Migrations/{20210728134952_Initial.Designer.cs => 20210730203155_Initial.Designer.cs} (81%) rename Kyoo.SqLite/Migrations/{20210728134952_Initial.cs => 20210730203155_Initial.cs} (86%) rename Kyoo.SqLite/Migrations/{20210728135127_Triggers.Designer.cs => 20210730203746_Triggers.Designer.cs} (81%) rename Kyoo.SqLite/Migrations/{20210728135127_Triggers.cs => 20210730203746_Triggers.cs} (97%) diff --git a/Kyoo.Common/Kyoo.Common.csproj b/Kyoo.Common/Kyoo.Common.csproj index fcf33415..c4c2f3d6 100644 --- a/Kyoo.Common/Kyoo.Common.csproj +++ b/Kyoo.Common/Kyoo.Common.csproj @@ -17,7 +17,7 @@ snupkg default - ENABLE_INTERNAL_LINKS + diff --git a/Kyoo.Common/Models/Resources/Provider.cs b/Kyoo.Common/Models/Resources/Provider.cs index 920b7345..35f94fc9 100644 --- a/Kyoo.Common/Models/Resources/Provider.cs +++ b/Kyoo.Common/Models/Resources/Provider.cs @@ -32,12 +32,7 @@ namespace Kyoo.Models /// [SerializeAs("{HOST}/api/providers/{Slug}/logo")] public string Logo => Images?.GetValueOrDefault(Thumbnails.Logo); - - /// - /// The extension of the logo. This is used for http responses. - /// - [SerializeIgnore] public string LogoExtension { get; set; } - + /// /// The list of libraries that uses this provider. /// diff --git a/Kyoo.Common/Models/Resources/User.cs b/Kyoo.Common/Models/Resources/User.cs index 05f56534..8cae9671 100644 --- a/Kyoo.Common/Models/Resources/User.cs +++ b/Kyoo.Common/Models/Resources/User.cs @@ -6,7 +6,7 @@ namespace Kyoo.Models /// /// A single user of the app. /// - public class User : IResource + public class User : IResource, IThumbnails { /// public int ID { get; set; } @@ -38,7 +38,10 @@ namespace Kyoo.Models /// Arbitrary extra data that can be used by specific authentication implementations. /// public Dictionary ExtraData { get; set; } - + + /// + public Dictionary Images { get; set; } + /// /// The list of shows the user has finished. /// @@ -48,7 +51,7 @@ namespace Kyoo.Models /// The list of episodes the user is watching (stopped in progress or the next episode of the show) /// public ICollection CurrentlyWatching { get; set; } - + #if ENABLE_INTERNAL_LINKS /// /// Links between Users and Shows. @@ -60,8 +63,23 @@ namespace Kyoo.Models /// /// Metadata of episode currently watching by an user /// - public class WatchedEpisode : Link + public class WatchedEpisode { + /// + /// The ID of the user that started watching this episode. + /// + public int UserID { get; set; } + + /// + /// The ID of the episode started. + /// + public int EpisodeID { get; set; } + + /// + /// The started. + /// + public Episode Episode { get; set; } + /// /// Where the player has stopped watching the episode (between 0 and 100). /// diff --git a/Kyoo.CommonAPI/DatabaseContext.cs b/Kyoo.CommonAPI/DatabaseContext.cs index 6d1fec11..d2eb8e2f 100644 --- a/Kyoo.CommonAPI/DatabaseContext.cs +++ b/Kyoo.CommonAPI/DatabaseContext.cs @@ -84,14 +84,6 @@ namespace Kyoo /// public DbSet LibraryItems { get; set; } - /// - /// Get the name of the metadata table of the given type. - /// - /// The type related to the metadata - /// The name of the table containing the metadata. - protected abstract string MetadataName() - where T : IMetadata; - /// /// Get all metadataIDs (ExternalIDs) of a given resource. See . /// @@ -131,6 +123,24 @@ namespace Kyoo : base(options) { } + /// + /// Get the name of the metadata table of the given type. + /// + /// The type related to the metadata + /// The name of the table containing the metadata. + protected abstract string MetadataName() + where T : IMetadata; + + /// + /// Get the name of the link table of the two given types. + /// + /// The owner type of the relation + /// The child type of the relation + /// The name of the table containing the links. + protected abstract string LinkName() + where T : IResource + where T2 : IResource; + /// /// Set basic configurations (like preventing query tracking) /// @@ -196,74 +206,27 @@ namespace Kyoo modelBuilder.Entity() .HasMany(x => x.Libraries) .WithMany(x => x.Providers) - .UsingEntity>( - y => y - .HasOne(x => x.First) - .WithMany(x => x.ProviderLinks), - y => y - .HasOne(x => x.Second) - .WithMany(x => x.LibraryLinks), - y => y.HasKey(Link.PrimaryKey)); - + .UsingEntity(x => x.ToTable(LinkName())); modelBuilder.Entity() .HasMany(x => x.Libraries) .WithMany(x => x.Collections) - .UsingEntity>( - y => y - .HasOne(x => x.First) - .WithMany(x => x.CollectionLinks), - y => y - .HasOne(x => x.Second) - .WithMany(x => x.LibraryLinks), - y => y.HasKey(Link.PrimaryKey)); - + .UsingEntity(x => x.ToTable(LinkName())); modelBuilder.Entity() .HasMany(x => x.Libraries) .WithMany(x => x.Shows) - .UsingEntity>( - y => y - .HasOne(x => x.First) - .WithMany(x => x.ShowLinks), - y => y - .HasOne(x => x.Second) - .WithMany(x => x.LibraryLinks), - y => y.HasKey(Link.PrimaryKey)); - + .UsingEntity(x => x.ToTable(LinkName())); modelBuilder.Entity() .HasMany(x => x.Collections) .WithMany(x => x.Shows) - .UsingEntity>( - y => y - .HasOne(x => x.First) - .WithMany(x => x.ShowLinks), - y => y - .HasOne(x => x.Second) - .WithMany(x => x.CollectionLinks), - y => y.HasKey(Link.PrimaryKey)); - + .UsingEntity(x => x.ToTable(LinkName())); modelBuilder.Entity() .HasMany(x => x.Shows) .WithMany(x => x.Genres) - .UsingEntity>( - y => y - .HasOne(x => x.First) - .WithMany(x => x.GenreLinks), - y => y - .HasOne(x => x.Second) - .WithMany(x => x.ShowLinks), - y => y.HasKey(Link.PrimaryKey)); - + .UsingEntity(x => x.ToTable(LinkName())); modelBuilder.Entity() .HasMany(x => x.Watched) - .WithMany("users") - .UsingEntity>( - y => y - .HasOne(x => x.Second) - .WithMany(), - y => y - .HasOne(x => x.First) - .WithMany(x => x.ShowLinks), - y => y.HasKey(Link.PrimaryKey)); + .WithMany("Users") + .UsingEntity(x => x.ToTable(LinkName())); _HasMetadata(modelBuilder); _HasMetadata(modelBuilder); @@ -273,7 +236,7 @@ namespace Kyoo _HasMetadata(modelBuilder); modelBuilder.Entity() - .HasKey(x => new { First = x.FirstID, Second = x.SecondID }); + .HasKey(x => new { User = x.UserID, Episode = x.EpisodeID }); modelBuilder.Entity().Property(x => x.Slug).IsRequired(); modelBuilder.Entity().Property(x => x.Slug).IsRequired(); diff --git a/Kyoo.Postgresql/Migrations/20210728141410_Initial.Designer.cs b/Kyoo.Postgresql/Migrations/20210730183548_Initial.Designer.cs similarity index 85% rename from Kyoo.Postgresql/Migrations/20210728141410_Initial.Designer.cs rename to Kyoo.Postgresql/Migrations/20210730183548_Initial.Designer.cs index 8722ada5..10c42bb3 100644 --- a/Kyoo.Postgresql/Migrations/20210728141410_Initial.Designer.cs +++ b/Kyoo.Postgresql/Migrations/20210730183548_Initial.Designer.cs @@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace Kyoo.Postgresql.Migrations { [DbContext(typeof(PostgresContext))] - [Migration("20210728141410_Initial")] + [Migration("20210730183548_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -26,6 +26,63 @@ namespace Kyoo.Postgresql.Migrations .HasAnnotation("ProductVersion", "5.0.8") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + modelBuilder.Entity("CollectionLibrary", b => + { + b.Property("CollectionsID") + .HasColumnType("integer") + .HasColumnName("collections_id"); + + b.Property("LibrariesID") + .HasColumnType("integer") + .HasColumnName("libraries_id"); + + b.HasKey("CollectionsID", "LibrariesID") + .HasName("pk_link_library_collection"); + + b.HasIndex("LibrariesID") + .HasDatabaseName("ix_link_library_collection_libraries_id"); + + b.ToTable("link_library_collection"); + }); + + modelBuilder.Entity("CollectionShow", b => + { + b.Property("CollectionsID") + .HasColumnType("integer") + .HasColumnName("collections_id"); + + b.Property("ShowsID") + .HasColumnType("integer") + .HasColumnName("shows_id"); + + b.HasKey("CollectionsID", "ShowsID") + .HasName("pk_link_collection_show"); + + b.HasIndex("ShowsID") + .HasDatabaseName("ix_link_collection_show_shows_id"); + + b.ToTable("link_collection_show"); + }); + + modelBuilder.Entity("GenreShow", b => + { + b.Property("GenresID") + .HasColumnType("integer") + .HasColumnName("genres_id"); + + b.Property("ShowsID") + .HasColumnType("integer") + .HasColumnName("shows_id"); + + b.HasKey("GenresID", "ShowsID") + .HasName("pk_link_show_genre"); + + b.HasIndex("ShowsID") + .HasDatabaseName("ix_link_show_genre_shows_id"); + + b.ToTable("link_show_genre"); + }); + modelBuilder.Entity("Kyoo.Models.Collection", b => { b.Property("ID") @@ -234,120 +291,6 @@ namespace Kyoo.Postgresql.Migrations b.ToView("library_items"); }); - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_link_collection_show"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_link_collection_show_second_id"); - - b.ToTable("link_collection_show"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_link_library_collection"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_link_library_collection_second_id"); - - b.ToTable("link_library_collection"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_link_library_provider"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_link_library_provider_second_id"); - - b.ToTable("link_library_provider"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_link_library_show"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_link_library_show_second_id"); - - b.ToTable("link_library_show"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_link_show_genre"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_link_show_genre_second_id"); - - b.ToTable("link_show_genre"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_link_user_show"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_link_user_show_second_id"); - - b.ToTable("link_user_show"); - }); - modelBuilder.Entity("Kyoo.Models.People", b => { b.Property("ID") @@ -427,10 +370,6 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("jsonb") .HasColumnName("images"); - b.Property("LogoExtension") - .HasColumnType("text") - .HasColumnName("logo_extension"); - b.Property("Name") .HasColumnType("text") .HasColumnName("name"); @@ -681,6 +620,10 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("jsonb") .HasColumnName("extra_data"); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("Password") .HasColumnType("text") .HasColumnName("password"); @@ -710,27 +653,84 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b => { - b.Property("FirstID") + b.Property("UserID") .HasColumnType("integer") - .HasColumnName("first_id"); + .HasColumnName("user_id"); - b.Property("SecondID") + b.Property("EpisodeID") .HasColumnType("integer") - .HasColumnName("second_id"); + .HasColumnName("episode_id"); b.Property("WatchedPercentage") .HasColumnType("integer") .HasColumnName("watched_percentage"); - b.HasKey("FirstID", "SecondID") + b.HasKey("UserID", "EpisodeID") .HasName("pk_watched_episodes"); - b.HasIndex("SecondID") - .HasDatabaseName("ix_watched_episodes_second_id"); + b.HasIndex("EpisodeID") + .HasDatabaseName("ix_watched_episodes_episode_id"); b.ToTable("watched_episodes"); }); + modelBuilder.Entity("LibraryProvider", b => + { + b.Property("LibrariesID") + .HasColumnType("integer") + .HasColumnName("libraries_id"); + + b.Property("ProvidersID") + .HasColumnType("integer") + .HasColumnName("providers_id"); + + b.HasKey("LibrariesID", "ProvidersID") + .HasName("pk_link_library_provider"); + + b.HasIndex("ProvidersID") + .HasDatabaseName("ix_link_library_provider_providers_id"); + + b.ToTable("link_library_provider"); + }); + + modelBuilder.Entity("LibraryShow", b => + { + b.Property("LibrariesID") + .HasColumnType("integer") + .HasColumnName("libraries_id"); + + b.Property("ShowsID") + .HasColumnType("integer") + .HasColumnName("shows_id"); + + b.HasKey("LibrariesID", "ShowsID") + .HasName("pk_link_library_show"); + + b.HasIndex("ShowsID") + .HasDatabaseName("ix_link_library_show_shows_id"); + + b.ToTable("link_library_show"); + }); + + modelBuilder.Entity("ShowUser", b => + { + b.Property("UsersID") + .HasColumnType("integer") + .HasColumnName("users_id"); + + b.Property("WatchedID") + .HasColumnType("integer") + .HasColumnName("watched_id"); + + b.HasKey("UsersID", "WatchedID") + .HasName("pk_link_user_show"); + + b.HasIndex("WatchedID") + .HasDatabaseName("ix_link_user_show_watched_id"); + + b.ToTable("link_user_show"); + }); + modelBuilder.Entity("collection_metadata_id", b => { b.Property("ResourceID") @@ -893,6 +893,57 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("studio_metadata_id"); }); + modelBuilder.Entity("CollectionLibrary", b => + { + b.HasOne("Kyoo.Models.Collection", null) + .WithMany() + .HasForeignKey("CollectionsID") + .HasConstraintName("fk_link_library_collection_collections_collections_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Library", null) + .WithMany() + .HasForeignKey("LibrariesID") + .HasConstraintName("fk_link_library_collection_libraries_libraries_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("CollectionShow", b => + { + b.HasOne("Kyoo.Models.Collection", null) + .WithMany() + .HasForeignKey("CollectionsID") + .HasConstraintName("fk_link_collection_show_collections_collections_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("ShowsID") + .HasConstraintName("fk_link_collection_show_shows_shows_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("GenreShow", b => + { + b.HasOne("Kyoo.Models.Genre", null) + .WithMany() + .HasForeignKey("GenresID") + .HasConstraintName("fk_link_show_genre_genres_genres_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("ShowsID") + .HasConstraintName("fk_link_show_genre_shows_shows_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Kyoo.Models.Episode", b => { b.HasOne("Kyoo.Models.Season", "Season") @@ -913,132 +964,6 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Show"); }); - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Collection", "First") - .WithMany("ShowLinks") - .HasForeignKey("FirstID") - .HasConstraintName("fk_link_collection_show_collections_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Second") - .WithMany("CollectionLinks") - .HasForeignKey("SecondID") - .HasConstraintName("fk_link_collection_show_shows_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Library", "First") - .WithMany("CollectionLinks") - .HasForeignKey("FirstID") - .HasConstraintName("fk_link_library_collection_libraries_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Collection", "Second") - .WithMany("LibraryLinks") - .HasForeignKey("SecondID") - .HasConstraintName("fk_link_library_collection_collections_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Library", "First") - .WithMany("ProviderLinks") - .HasForeignKey("FirstID") - .HasConstraintName("fk_link_library_provider_libraries_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany("LibraryLinks") - .HasForeignKey("SecondID") - .HasConstraintName("fk_link_library_provider_providers_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Library", "First") - .WithMany("ShowLinks") - .HasForeignKey("FirstID") - .HasConstraintName("fk_link_library_show_libraries_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Second") - .WithMany("LibraryLinks") - .HasForeignKey("SecondID") - .HasConstraintName("fk_link_library_show_shows_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Show", "First") - .WithMany("GenreLinks") - .HasForeignKey("FirstID") - .HasConstraintName("fk_link_show_genre_shows_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Genre", "Second") - .WithMany("ShowLinks") - .HasForeignKey("SecondID") - .HasConstraintName("fk_link_show_genre_genres_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.User", "First") - .WithMany("ShowLinks") - .HasForeignKey("FirstID") - .HasConstraintName("fk_link_user_show_users_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Second") - .WithMany() - .HasForeignKey("SecondID") - .HasConstraintName("fk_link_user_show_shows_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - modelBuilder.Entity("Kyoo.Models.PeopleRole", b => { b.HasOne("Kyoo.Models.People", "People") @@ -1097,23 +1022,72 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b => { - b.HasOne("Kyoo.Models.User", "First") - .WithMany("CurrentlyWatching") - .HasForeignKey("FirstID") - .HasConstraintName("fk_watched_episodes_users_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Episode", "Second") + b.HasOne("Kyoo.Models.Episode", "Episode") .WithMany() - .HasForeignKey("SecondID") - .HasConstraintName("fk_watched_episodes_episodes_second_id") + .HasForeignKey("EpisodeID") + .HasConstraintName("fk_watched_episodes_episodes_episode_id") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.Navigation("First"); + b.HasOne("Kyoo.Models.User", null) + .WithMany("CurrentlyWatching") + .HasForeignKey("UserID") + .HasConstraintName("fk_watched_episodes_users_user_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Second"); + b.Navigation("Episode"); + }); + + modelBuilder.Entity("LibraryProvider", b => + { + b.HasOne("Kyoo.Models.Library", null) + .WithMany() + .HasForeignKey("LibrariesID") + .HasConstraintName("fk_link_library_provider_libraries_libraries_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Provider", null) + .WithMany() + .HasForeignKey("ProvidersID") + .HasConstraintName("fk_link_library_provider_providers_providers_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("LibraryShow", b => + { + b.HasOne("Kyoo.Models.Library", null) + .WithMany() + .HasForeignKey("LibrariesID") + .HasConstraintName("fk_link_library_show_libraries_libraries_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("ShowsID") + .HasConstraintName("fk_link_library_show_shows_shows_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ShowUser", b => + { + b.HasOne("Kyoo.Models.User", null) + .WithMany() + .HasForeignKey("UsersID") + .HasConstraintName("fk_link_user_show_users_users_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("WatchedID") + .HasConstraintName("fk_link_user_show_shows_watched_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); }); modelBuilder.Entity("collection_metadata_id", b => @@ -1233,10 +1207,6 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("Kyoo.Models.Collection", b => { b.Navigation("ExternalIDs"); - - b.Navigation("LibraryLinks"); - - b.Navigation("ShowLinks"); }); modelBuilder.Entity("Kyoo.Models.Episode", b => @@ -1246,20 +1216,6 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Tracks"); }); - modelBuilder.Entity("Kyoo.Models.Genre", b => - { - b.Navigation("ShowLinks"); - }); - - modelBuilder.Entity("Kyoo.Models.Library", b => - { - b.Navigation("CollectionLinks"); - - b.Navigation("ProviderLinks"); - - b.Navigation("ShowLinks"); - }); - modelBuilder.Entity("Kyoo.Models.People", b => { b.Navigation("ExternalIDs"); @@ -1267,11 +1223,6 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Roles"); }); - modelBuilder.Entity("Kyoo.Models.Provider", b => - { - b.Navigation("LibraryLinks"); - }); - modelBuilder.Entity("Kyoo.Models.Season", b => { b.Navigation("Episodes"); @@ -1281,16 +1232,10 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("Kyoo.Models.Show", b => { - b.Navigation("CollectionLinks"); - b.Navigation("Episodes"); b.Navigation("ExternalIDs"); - b.Navigation("GenreLinks"); - - b.Navigation("LibraryLinks"); - b.Navigation("People"); b.Navigation("Seasons"); @@ -1306,8 +1251,6 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("Kyoo.Models.User", b => { b.Navigation("CurrentlyWatching"); - - b.Navigation("ShowLinks"); }); #pragma warning restore 612, 618 } diff --git a/Kyoo.Postgresql/Migrations/20210728141410_Initial.cs b/Kyoo.Postgresql/Migrations/20210730183548_Initial.cs similarity index 90% rename from Kyoo.Postgresql/Migrations/20210728141410_Initial.cs rename to Kyoo.Postgresql/Migrations/20210730183548_Initial.cs index 46c09222..dc37cba9 100644 --- a/Kyoo.Postgresql/Migrations/20210728141410_Initial.cs +++ b/Kyoo.Postgresql/Migrations/20210730183548_Initial.cs @@ -83,8 +83,7 @@ namespace Kyoo.Postgresql.Migrations .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), slug = table.Column(type: "text", nullable: false), name = table.Column(type: "text", nullable: true), - images = table.Column>(type: "jsonb", nullable: true), - logo_extension = table.Column(type: "text", nullable: true) + images = table.Column>(type: "jsonb", nullable: true) }, constraints: table => { @@ -116,7 +115,8 @@ namespace Kyoo.Postgresql.Migrations email = table.Column(type: "text", nullable: true), password = table.Column(type: "text", nullable: true), permissions = table.Column(type: "text[]", nullable: true), - extra_data = table.Column>(type: "jsonb", nullable: true) + extra_data = table.Column>(type: "jsonb", nullable: true), + images = table.Column>(type: "jsonb", nullable: true) }, constraints: table => { @@ -127,21 +127,21 @@ namespace Kyoo.Postgresql.Migrations name: "link_library_collection", columns: table => new { - first_id = table.Column(type: "integer", nullable: false), - second_id = table.Column(type: "integer", nullable: false) + collections_id = table.Column(type: "integer", nullable: false), + libraries_id = table.Column(type: "integer", nullable: false) }, constraints: table => { - table.PrimaryKey("pk_link_library_collection", x => new { x.first_id, x.second_id }); + table.PrimaryKey("pk_link_library_collection", x => new { x.collections_id, x.libraries_id }); table.ForeignKey( - name: "fk_link_library_collection_collections_second_id", - column: x => x.second_id, + name: "fk_link_library_collection_collections_collections_id", + column: x => x.collections_id, principalTable: "collections", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "fk_link_library_collection_libraries_first_id", - column: x => x.first_id, + name: "fk_link_library_collection_libraries_libraries_id", + column: x => x.libraries_id, principalTable: "libraries", principalColumn: "id", onDelete: ReferentialAction.Cascade); @@ -177,21 +177,21 @@ namespace Kyoo.Postgresql.Migrations name: "link_library_provider", columns: table => new { - first_id = table.Column(type: "integer", nullable: false), - second_id = table.Column(type: "integer", nullable: false) + libraries_id = table.Column(type: "integer", nullable: false), + providers_id = table.Column(type: "integer", nullable: false) }, constraints: table => { - table.PrimaryKey("pk_link_library_provider", x => new { x.first_id, x.second_id }); + table.PrimaryKey("pk_link_library_provider", x => new { x.libraries_id, x.providers_id }); table.ForeignKey( - name: "fk_link_library_provider_libraries_first_id", - column: x => x.first_id, + name: "fk_link_library_provider_libraries_libraries_id", + column: x => x.libraries_id, principalTable: "libraries", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "fk_link_library_provider_providers_second_id", - column: x => x.second_id, + name: "fk_link_library_provider_providers_providers_id", + column: x => x.providers_id, principalTable: "providers", principalColumn: "id", onDelete: ReferentialAction.Cascade); @@ -282,21 +282,21 @@ namespace Kyoo.Postgresql.Migrations name: "link_collection_show", columns: table => new { - first_id = table.Column(type: "integer", nullable: false), - second_id = table.Column(type: "integer", nullable: false) + collections_id = table.Column(type: "integer", nullable: false), + shows_id = table.Column(type: "integer", nullable: false) }, constraints: table => { - table.PrimaryKey("pk_link_collection_show", x => new { x.first_id, x.second_id }); + table.PrimaryKey("pk_link_collection_show", x => new { x.collections_id, x.shows_id }); table.ForeignKey( - name: "fk_link_collection_show_collections_first_id", - column: x => x.first_id, + name: "fk_link_collection_show_collections_collections_id", + column: x => x.collections_id, principalTable: "collections", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "fk_link_collection_show_shows_second_id", - column: x => x.second_id, + name: "fk_link_collection_show_shows_shows_id", + column: x => x.shows_id, principalTable: "shows", principalColumn: "id", onDelete: ReferentialAction.Cascade); @@ -306,21 +306,21 @@ namespace Kyoo.Postgresql.Migrations name: "link_library_show", columns: table => new { - first_id = table.Column(type: "integer", nullable: false), - second_id = table.Column(type: "integer", nullable: false) + libraries_id = table.Column(type: "integer", nullable: false), + shows_id = table.Column(type: "integer", nullable: false) }, constraints: table => { - table.PrimaryKey("pk_link_library_show", x => new { x.first_id, x.second_id }); + table.PrimaryKey("pk_link_library_show", x => new { x.libraries_id, x.shows_id }); table.ForeignKey( - name: "fk_link_library_show_libraries_first_id", - column: x => x.first_id, + name: "fk_link_library_show_libraries_libraries_id", + column: x => x.libraries_id, principalTable: "libraries", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "fk_link_library_show_shows_second_id", - column: x => x.second_id, + name: "fk_link_library_show_shows_shows_id", + column: x => x.shows_id, principalTable: "shows", principalColumn: "id", onDelete: ReferentialAction.Cascade); @@ -330,21 +330,21 @@ namespace Kyoo.Postgresql.Migrations name: "link_show_genre", columns: table => new { - first_id = table.Column(type: "integer", nullable: false), - second_id = table.Column(type: "integer", nullable: false) + genres_id = table.Column(type: "integer", nullable: false), + shows_id = table.Column(type: "integer", nullable: false) }, constraints: table => { - table.PrimaryKey("pk_link_show_genre", x => new { x.first_id, x.second_id }); + table.PrimaryKey("pk_link_show_genre", x => new { x.genres_id, x.shows_id }); table.ForeignKey( - name: "fk_link_show_genre_genres_second_id", - column: x => x.second_id, + name: "fk_link_show_genre_genres_genres_id", + column: x => x.genres_id, principalTable: "genres", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "fk_link_show_genre_shows_first_id", - column: x => x.first_id, + name: "fk_link_show_genre_shows_shows_id", + column: x => x.shows_id, principalTable: "shows", principalColumn: "id", onDelete: ReferentialAction.Cascade); @@ -354,21 +354,21 @@ namespace Kyoo.Postgresql.Migrations name: "link_user_show", columns: table => new { - first_id = table.Column(type: "integer", nullable: false), - second_id = table.Column(type: "integer", nullable: false) + users_id = table.Column(type: "integer", nullable: false), + watched_id = table.Column(type: "integer", nullable: false) }, constraints: table => { - table.PrimaryKey("pk_link_user_show", x => new { x.first_id, x.second_id }); + table.PrimaryKey("pk_link_user_show", x => new { x.users_id, x.watched_id }); table.ForeignKey( - name: "fk_link_user_show_shows_second_id", - column: x => x.second_id, + name: "fk_link_user_show_shows_watched_id", + column: x => x.watched_id, principalTable: "shows", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "fk_link_user_show_users_first_id", - column: x => x.first_id, + name: "fk_link_user_show_users_users_id", + column: x => x.users_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.Cascade); @@ -574,22 +574,22 @@ namespace Kyoo.Postgresql.Migrations name: "watched_episodes", columns: table => new { - first_id = table.Column(type: "integer", nullable: false), - second_id = table.Column(type: "integer", nullable: false), + user_id = table.Column(type: "integer", nullable: false), + episode_id = table.Column(type: "integer", nullable: false), watched_percentage = table.Column(type: "integer", nullable: false) }, constraints: table => { - table.PrimaryKey("pk_watched_episodes", x => new { x.first_id, x.second_id }); + table.PrimaryKey("pk_watched_episodes", x => new { x.user_id, x.episode_id }); table.ForeignKey( - name: "fk_watched_episodes_episodes_second_id", - column: x => x.second_id, + name: "fk_watched_episodes_episodes_episode_id", + column: x => x.episode_id, principalTable: "episodes", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "fk_watched_episodes_users_first_id", - column: x => x.first_id, + name: "fk_watched_episodes_users_user_id", + column: x => x.user_id, principalTable: "users", principalColumn: "id", onDelete: ReferentialAction.Cascade); @@ -641,34 +641,34 @@ namespace Kyoo.Postgresql.Migrations unique: true); migrationBuilder.CreateIndex( - name: "ix_link_collection_show_second_id", + name: "ix_link_collection_show_shows_id", table: "link_collection_show", - column: "second_id"); + column: "shows_id"); migrationBuilder.CreateIndex( - name: "ix_link_library_collection_second_id", + name: "ix_link_library_collection_libraries_id", table: "link_library_collection", - column: "second_id"); + column: "libraries_id"); migrationBuilder.CreateIndex( - name: "ix_link_library_provider_second_id", + name: "ix_link_library_provider_providers_id", table: "link_library_provider", - column: "second_id"); + column: "providers_id"); migrationBuilder.CreateIndex( - name: "ix_link_library_show_second_id", + name: "ix_link_library_show_shows_id", table: "link_library_show", - column: "second_id"); + column: "shows_id"); migrationBuilder.CreateIndex( - name: "ix_link_show_genre_second_id", + name: "ix_link_show_genre_shows_id", table: "link_show_genre", - column: "second_id"); + column: "shows_id"); migrationBuilder.CreateIndex( - name: "ix_link_user_show_second_id", + name: "ix_link_user_show_watched_id", table: "link_user_show", - column: "second_id"); + column: "watched_id"); migrationBuilder.CreateIndex( name: "ix_people_slug", @@ -760,9 +760,9 @@ namespace Kyoo.Postgresql.Migrations unique: true); migrationBuilder.CreateIndex( - name: "ix_watched_episodes_second_id", + name: "ix_watched_episodes_episode_id", table: "watched_episodes", - column: "second_id"); + column: "episode_id"); } protected override void Down(MigrationBuilder migrationBuilder) diff --git a/Kyoo.Postgresql/Migrations/20210728142213_Triggers.Designer.cs b/Kyoo.Postgresql/Migrations/20210730203102_Triggers.Designer.cs similarity index 85% rename from Kyoo.Postgresql/Migrations/20210728142213_Triggers.Designer.cs rename to Kyoo.Postgresql/Migrations/20210730203102_Triggers.Designer.cs index 708cd23b..ff1ae33b 100644 --- a/Kyoo.Postgresql/Migrations/20210728142213_Triggers.Designer.cs +++ b/Kyoo.Postgresql/Migrations/20210730203102_Triggers.Designer.cs @@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace Kyoo.Postgresql.Migrations { [DbContext(typeof(PostgresContext))] - [Migration("20210728142213_Triggers")] + [Migration("20210730203102_Triggers")] partial class Triggers { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -26,6 +26,63 @@ namespace Kyoo.Postgresql.Migrations .HasAnnotation("ProductVersion", "5.0.8") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + modelBuilder.Entity("CollectionLibrary", b => + { + b.Property("CollectionsID") + .HasColumnType("integer") + .HasColumnName("collections_id"); + + b.Property("LibrariesID") + .HasColumnType("integer") + .HasColumnName("libraries_id"); + + b.HasKey("CollectionsID", "LibrariesID") + .HasName("pk_link_library_collection"); + + b.HasIndex("LibrariesID") + .HasDatabaseName("ix_link_library_collection_libraries_id"); + + b.ToTable("link_library_collection"); + }); + + modelBuilder.Entity("CollectionShow", b => + { + b.Property("CollectionsID") + .HasColumnType("integer") + .HasColumnName("collections_id"); + + b.Property("ShowsID") + .HasColumnType("integer") + .HasColumnName("shows_id"); + + b.HasKey("CollectionsID", "ShowsID") + .HasName("pk_link_collection_show"); + + b.HasIndex("ShowsID") + .HasDatabaseName("ix_link_collection_show_shows_id"); + + b.ToTable("link_collection_show"); + }); + + modelBuilder.Entity("GenreShow", b => + { + b.Property("GenresID") + .HasColumnType("integer") + .HasColumnName("genres_id"); + + b.Property("ShowsID") + .HasColumnType("integer") + .HasColumnName("shows_id"); + + b.HasKey("GenresID", "ShowsID") + .HasName("pk_link_show_genre"); + + b.HasIndex("ShowsID") + .HasDatabaseName("ix_link_show_genre_shows_id"); + + b.ToTable("link_show_genre"); + }); + modelBuilder.Entity("Kyoo.Models.Collection", b => { b.Property("ID") @@ -234,120 +291,6 @@ namespace Kyoo.Postgresql.Migrations b.ToView("library_items"); }); - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_link_collection_show"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_link_collection_show_second_id"); - - b.ToTable("link_collection_show"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_link_library_collection"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_link_library_collection_second_id"); - - b.ToTable("link_library_collection"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_link_library_provider"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_link_library_provider_second_id"); - - b.ToTable("link_library_provider"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_link_library_show"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_link_library_show_second_id"); - - b.ToTable("link_library_show"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_link_show_genre"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_link_show_genre_second_id"); - - b.ToTable("link_show_genre"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_link_user_show"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_link_user_show_second_id"); - - b.ToTable("link_user_show"); - }); - modelBuilder.Entity("Kyoo.Models.People", b => { b.Property("ID") @@ -427,10 +370,6 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("jsonb") .HasColumnName("images"); - b.Property("LogoExtension") - .HasColumnType("text") - .HasColumnName("logo_extension"); - b.Property("Name") .HasColumnType("text") .HasColumnName("name"); @@ -681,6 +620,10 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("jsonb") .HasColumnName("extra_data"); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("Password") .HasColumnType("text") .HasColumnName("password"); @@ -710,27 +653,84 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b => { - b.Property("FirstID") + b.Property("UserID") .HasColumnType("integer") - .HasColumnName("first_id"); + .HasColumnName("user_id"); - b.Property("SecondID") + b.Property("EpisodeID") .HasColumnType("integer") - .HasColumnName("second_id"); + .HasColumnName("episode_id"); b.Property("WatchedPercentage") .HasColumnType("integer") .HasColumnName("watched_percentage"); - b.HasKey("FirstID", "SecondID") + b.HasKey("UserID", "EpisodeID") .HasName("pk_watched_episodes"); - b.HasIndex("SecondID") - .HasDatabaseName("ix_watched_episodes_second_id"); + b.HasIndex("EpisodeID") + .HasDatabaseName("ix_watched_episodes_episode_id"); b.ToTable("watched_episodes"); }); + modelBuilder.Entity("LibraryProvider", b => + { + b.Property("LibrariesID") + .HasColumnType("integer") + .HasColumnName("libraries_id"); + + b.Property("ProvidersID") + .HasColumnType("integer") + .HasColumnName("providers_id"); + + b.HasKey("LibrariesID", "ProvidersID") + .HasName("pk_link_library_provider"); + + b.HasIndex("ProvidersID") + .HasDatabaseName("ix_link_library_provider_providers_id"); + + b.ToTable("link_library_provider"); + }); + + modelBuilder.Entity("LibraryShow", b => + { + b.Property("LibrariesID") + .HasColumnType("integer") + .HasColumnName("libraries_id"); + + b.Property("ShowsID") + .HasColumnType("integer") + .HasColumnName("shows_id"); + + b.HasKey("LibrariesID", "ShowsID") + .HasName("pk_link_library_show"); + + b.HasIndex("ShowsID") + .HasDatabaseName("ix_link_library_show_shows_id"); + + b.ToTable("link_library_show"); + }); + + modelBuilder.Entity("ShowUser", b => + { + b.Property("UsersID") + .HasColumnType("integer") + .HasColumnName("users_id"); + + b.Property("WatchedID") + .HasColumnType("integer") + .HasColumnName("watched_id"); + + b.HasKey("UsersID", "WatchedID") + .HasName("pk_link_user_show"); + + b.HasIndex("WatchedID") + .HasDatabaseName("ix_link_user_show_watched_id"); + + b.ToTable("link_user_show"); + }); + modelBuilder.Entity("collection_metadata_id", b => { b.Property("ResourceID") @@ -893,6 +893,57 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("studio_metadata_id"); }); + modelBuilder.Entity("CollectionLibrary", b => + { + b.HasOne("Kyoo.Models.Collection", null) + .WithMany() + .HasForeignKey("CollectionsID") + .HasConstraintName("fk_link_library_collection_collections_collections_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Library", null) + .WithMany() + .HasForeignKey("LibrariesID") + .HasConstraintName("fk_link_library_collection_libraries_libraries_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("CollectionShow", b => + { + b.HasOne("Kyoo.Models.Collection", null) + .WithMany() + .HasForeignKey("CollectionsID") + .HasConstraintName("fk_link_collection_show_collections_collections_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("ShowsID") + .HasConstraintName("fk_link_collection_show_shows_shows_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("GenreShow", b => + { + b.HasOne("Kyoo.Models.Genre", null) + .WithMany() + .HasForeignKey("GenresID") + .HasConstraintName("fk_link_show_genre_genres_genres_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("ShowsID") + .HasConstraintName("fk_link_show_genre_shows_shows_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Kyoo.Models.Episode", b => { b.HasOne("Kyoo.Models.Season", "Season") @@ -913,132 +964,6 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Show"); }); - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Collection", "First") - .WithMany("ShowLinks") - .HasForeignKey("FirstID") - .HasConstraintName("fk_link_collection_show_collections_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Second") - .WithMany("CollectionLinks") - .HasForeignKey("SecondID") - .HasConstraintName("fk_link_collection_show_shows_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Library", "First") - .WithMany("CollectionLinks") - .HasForeignKey("FirstID") - .HasConstraintName("fk_link_library_collection_libraries_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Collection", "Second") - .WithMany("LibraryLinks") - .HasForeignKey("SecondID") - .HasConstraintName("fk_link_library_collection_collections_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Library", "First") - .WithMany("ProviderLinks") - .HasForeignKey("FirstID") - .HasConstraintName("fk_link_library_provider_libraries_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany("LibraryLinks") - .HasForeignKey("SecondID") - .HasConstraintName("fk_link_library_provider_providers_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Library", "First") - .WithMany("ShowLinks") - .HasForeignKey("FirstID") - .HasConstraintName("fk_link_library_show_libraries_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Second") - .WithMany("LibraryLinks") - .HasForeignKey("SecondID") - .HasConstraintName("fk_link_library_show_shows_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Show", "First") - .WithMany("GenreLinks") - .HasForeignKey("FirstID") - .HasConstraintName("fk_link_show_genre_shows_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Genre", "Second") - .WithMany("ShowLinks") - .HasForeignKey("SecondID") - .HasConstraintName("fk_link_show_genre_genres_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.User", "First") - .WithMany("ShowLinks") - .HasForeignKey("FirstID") - .HasConstraintName("fk_link_user_show_users_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Second") - .WithMany() - .HasForeignKey("SecondID") - .HasConstraintName("fk_link_user_show_shows_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - modelBuilder.Entity("Kyoo.Models.PeopleRole", b => { b.HasOne("Kyoo.Models.People", "People") @@ -1097,23 +1022,72 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b => { - b.HasOne("Kyoo.Models.User", "First") - .WithMany("CurrentlyWatching") - .HasForeignKey("FirstID") - .HasConstraintName("fk_watched_episodes_users_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Episode", "Second") + b.HasOne("Kyoo.Models.Episode", "Episode") .WithMany() - .HasForeignKey("SecondID") - .HasConstraintName("fk_watched_episodes_episodes_second_id") + .HasForeignKey("EpisodeID") + .HasConstraintName("fk_watched_episodes_episodes_episode_id") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.Navigation("First"); + b.HasOne("Kyoo.Models.User", null) + .WithMany("CurrentlyWatching") + .HasForeignKey("UserID") + .HasConstraintName("fk_watched_episodes_users_user_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Second"); + b.Navigation("Episode"); + }); + + modelBuilder.Entity("LibraryProvider", b => + { + b.HasOne("Kyoo.Models.Library", null) + .WithMany() + .HasForeignKey("LibrariesID") + .HasConstraintName("fk_link_library_provider_libraries_libraries_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Provider", null) + .WithMany() + .HasForeignKey("ProvidersID") + .HasConstraintName("fk_link_library_provider_providers_providers_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("LibraryShow", b => + { + b.HasOne("Kyoo.Models.Library", null) + .WithMany() + .HasForeignKey("LibrariesID") + .HasConstraintName("fk_link_library_show_libraries_libraries_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("ShowsID") + .HasConstraintName("fk_link_library_show_shows_shows_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ShowUser", b => + { + b.HasOne("Kyoo.Models.User", null) + .WithMany() + .HasForeignKey("UsersID") + .HasConstraintName("fk_link_user_show_users_users_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("WatchedID") + .HasConstraintName("fk_link_user_show_shows_watched_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); }); modelBuilder.Entity("collection_metadata_id", b => @@ -1233,10 +1207,6 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("Kyoo.Models.Collection", b => { b.Navigation("ExternalIDs"); - - b.Navigation("LibraryLinks"); - - b.Navigation("ShowLinks"); }); modelBuilder.Entity("Kyoo.Models.Episode", b => @@ -1246,20 +1216,6 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Tracks"); }); - modelBuilder.Entity("Kyoo.Models.Genre", b => - { - b.Navigation("ShowLinks"); - }); - - modelBuilder.Entity("Kyoo.Models.Library", b => - { - b.Navigation("CollectionLinks"); - - b.Navigation("ProviderLinks"); - - b.Navigation("ShowLinks"); - }); - modelBuilder.Entity("Kyoo.Models.People", b => { b.Navigation("ExternalIDs"); @@ -1267,11 +1223,6 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Roles"); }); - modelBuilder.Entity("Kyoo.Models.Provider", b => - { - b.Navigation("LibraryLinks"); - }); - modelBuilder.Entity("Kyoo.Models.Season", b => { b.Navigation("Episodes"); @@ -1281,16 +1232,10 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("Kyoo.Models.Show", b => { - b.Navigation("CollectionLinks"); - b.Navigation("Episodes"); b.Navigation("ExternalIDs"); - b.Navigation("GenreLinks"); - - b.Navigation("LibraryLinks"); - b.Navigation("People"); b.Navigation("Seasons"); @@ -1306,8 +1251,6 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("Kyoo.Models.User", b => { b.Navigation("CurrentlyWatching"); - - b.Navigation("ShowLinks"); }); #pragma warning restore 612, 618 } diff --git a/Kyoo.Postgresql/Migrations/20210728142213_Triggers.cs b/Kyoo.Postgresql/Migrations/20210730203102_Triggers.cs similarity index 98% rename from Kyoo.Postgresql/Migrations/20210728142213_Triggers.cs rename to Kyoo.Postgresql/Migrations/20210730203102_Triggers.cs index d1933171..f84b767b 100644 --- a/Kyoo.Postgresql/Migrations/20210728142213_Triggers.cs +++ b/Kyoo.Postgresql/Migrations/20210730203102_Triggers.cs @@ -149,8 +149,8 @@ namespace Kyoo.Postgresql.Migrations WHERE NOT (EXISTS ( SELECT 1 FROM link_collection_show AS l - INNER JOIN collections AS c ON l.first_id = c.id - WHERE s.id = l.second_id)) + INNER JOIN collections AS c ON l.collections_id = c.id + WHERE s.id = l.shows_id)) UNION ALL SELECT -c0.id, c0.slug, c0.name AS title, c0.overview, 'unknown'::status AS status, NULL AS start_air, NULL AS end_air, c0.images, 'collection'::item_type AS type diff --git a/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs b/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs index f7db32a7..379b8d09 100644 --- a/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs +++ b/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs @@ -24,6 +24,63 @@ namespace Kyoo.Postgresql.Migrations .HasAnnotation("ProductVersion", "5.0.8") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + modelBuilder.Entity("CollectionLibrary", b => + { + b.Property("CollectionsID") + .HasColumnType("integer") + .HasColumnName("collections_id"); + + b.Property("LibrariesID") + .HasColumnType("integer") + .HasColumnName("libraries_id"); + + b.HasKey("CollectionsID", "LibrariesID") + .HasName("pk_link_library_collection"); + + b.HasIndex("LibrariesID") + .HasDatabaseName("ix_link_library_collection_libraries_id"); + + b.ToTable("link_library_collection"); + }); + + modelBuilder.Entity("CollectionShow", b => + { + b.Property("CollectionsID") + .HasColumnType("integer") + .HasColumnName("collections_id"); + + b.Property("ShowsID") + .HasColumnType("integer") + .HasColumnName("shows_id"); + + b.HasKey("CollectionsID", "ShowsID") + .HasName("pk_link_collection_show"); + + b.HasIndex("ShowsID") + .HasDatabaseName("ix_link_collection_show_shows_id"); + + b.ToTable("link_collection_show"); + }); + + modelBuilder.Entity("GenreShow", b => + { + b.Property("GenresID") + .HasColumnType("integer") + .HasColumnName("genres_id"); + + b.Property("ShowsID") + .HasColumnType("integer") + .HasColumnName("shows_id"); + + b.HasKey("GenresID", "ShowsID") + .HasName("pk_link_show_genre"); + + b.HasIndex("ShowsID") + .HasDatabaseName("ix_link_show_genre_shows_id"); + + b.ToTable("link_show_genre"); + }); + modelBuilder.Entity("Kyoo.Models.Collection", b => { b.Property("ID") @@ -232,120 +289,6 @@ namespace Kyoo.Postgresql.Migrations b.ToView("library_items"); }); - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_link_collection_show"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_link_collection_show_second_id"); - - b.ToTable("link_collection_show"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_link_library_collection"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_link_library_collection_second_id"); - - b.ToTable("link_library_collection"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_link_library_provider"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_link_library_provider_second_id"); - - b.ToTable("link_library_provider"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_link_library_show"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_link_library_show_second_id"); - - b.ToTable("link_library_show"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_link_show_genre"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_link_show_genre_second_id"); - - b.ToTable("link_show_genre"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_link_user_show"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_link_user_show_second_id"); - - b.ToTable("link_user_show"); - }); - modelBuilder.Entity("Kyoo.Models.People", b => { b.Property("ID") @@ -425,10 +368,6 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("jsonb") .HasColumnName("images"); - b.Property("LogoExtension") - .HasColumnType("text") - .HasColumnName("logo_extension"); - b.Property("Name") .HasColumnType("text") .HasColumnName("name"); @@ -679,6 +618,10 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("jsonb") .HasColumnName("extra_data"); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("Password") .HasColumnType("text") .HasColumnName("password"); @@ -708,27 +651,84 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b => { - b.Property("FirstID") + b.Property("UserID") .HasColumnType("integer") - .HasColumnName("first_id"); + .HasColumnName("user_id"); - b.Property("SecondID") + b.Property("EpisodeID") .HasColumnType("integer") - .HasColumnName("second_id"); + .HasColumnName("episode_id"); b.Property("WatchedPercentage") .HasColumnType("integer") .HasColumnName("watched_percentage"); - b.HasKey("FirstID", "SecondID") + b.HasKey("UserID", "EpisodeID") .HasName("pk_watched_episodes"); - b.HasIndex("SecondID") - .HasDatabaseName("ix_watched_episodes_second_id"); + b.HasIndex("EpisodeID") + .HasDatabaseName("ix_watched_episodes_episode_id"); b.ToTable("watched_episodes"); }); + modelBuilder.Entity("LibraryProvider", b => + { + b.Property("LibrariesID") + .HasColumnType("integer") + .HasColumnName("libraries_id"); + + b.Property("ProvidersID") + .HasColumnType("integer") + .HasColumnName("providers_id"); + + b.HasKey("LibrariesID", "ProvidersID") + .HasName("pk_link_library_provider"); + + b.HasIndex("ProvidersID") + .HasDatabaseName("ix_link_library_provider_providers_id"); + + b.ToTable("link_library_provider"); + }); + + modelBuilder.Entity("LibraryShow", b => + { + b.Property("LibrariesID") + .HasColumnType("integer") + .HasColumnName("libraries_id"); + + b.Property("ShowsID") + .HasColumnType("integer") + .HasColumnName("shows_id"); + + b.HasKey("LibrariesID", "ShowsID") + .HasName("pk_link_library_show"); + + b.HasIndex("ShowsID") + .HasDatabaseName("ix_link_library_show_shows_id"); + + b.ToTable("link_library_show"); + }); + + modelBuilder.Entity("ShowUser", b => + { + b.Property("UsersID") + .HasColumnType("integer") + .HasColumnName("users_id"); + + b.Property("WatchedID") + .HasColumnType("integer") + .HasColumnName("watched_id"); + + b.HasKey("UsersID", "WatchedID") + .HasName("pk_link_user_show"); + + b.HasIndex("WatchedID") + .HasDatabaseName("ix_link_user_show_watched_id"); + + b.ToTable("link_user_show"); + }); + modelBuilder.Entity("collection_metadata_id", b => { b.Property("ResourceID") @@ -891,6 +891,57 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("studio_metadata_id"); }); + modelBuilder.Entity("CollectionLibrary", b => + { + b.HasOne("Kyoo.Models.Collection", null) + .WithMany() + .HasForeignKey("CollectionsID") + .HasConstraintName("fk_link_library_collection_collections_collections_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Library", null) + .WithMany() + .HasForeignKey("LibrariesID") + .HasConstraintName("fk_link_library_collection_libraries_libraries_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("CollectionShow", b => + { + b.HasOne("Kyoo.Models.Collection", null) + .WithMany() + .HasForeignKey("CollectionsID") + .HasConstraintName("fk_link_collection_show_collections_collections_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("ShowsID") + .HasConstraintName("fk_link_collection_show_shows_shows_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("GenreShow", b => + { + b.HasOne("Kyoo.Models.Genre", null) + .WithMany() + .HasForeignKey("GenresID") + .HasConstraintName("fk_link_show_genre_genres_genres_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("ShowsID") + .HasConstraintName("fk_link_show_genre_shows_shows_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Kyoo.Models.Episode", b => { b.HasOne("Kyoo.Models.Season", "Season") @@ -911,132 +962,6 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Show"); }); - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Collection", "First") - .WithMany("ShowLinks") - .HasForeignKey("FirstID") - .HasConstraintName("fk_link_collection_show_collections_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Second") - .WithMany("CollectionLinks") - .HasForeignKey("SecondID") - .HasConstraintName("fk_link_collection_show_shows_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Library", "First") - .WithMany("CollectionLinks") - .HasForeignKey("FirstID") - .HasConstraintName("fk_link_library_collection_libraries_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Collection", "Second") - .WithMany("LibraryLinks") - .HasForeignKey("SecondID") - .HasConstraintName("fk_link_library_collection_collections_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Library", "First") - .WithMany("ProviderLinks") - .HasForeignKey("FirstID") - .HasConstraintName("fk_link_library_provider_libraries_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany("LibraryLinks") - .HasForeignKey("SecondID") - .HasConstraintName("fk_link_library_provider_providers_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Library", "First") - .WithMany("ShowLinks") - .HasForeignKey("FirstID") - .HasConstraintName("fk_link_library_show_libraries_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Second") - .WithMany("LibraryLinks") - .HasForeignKey("SecondID") - .HasConstraintName("fk_link_library_show_shows_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Show", "First") - .WithMany("GenreLinks") - .HasForeignKey("FirstID") - .HasConstraintName("fk_link_show_genre_shows_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Genre", "Second") - .WithMany("ShowLinks") - .HasForeignKey("SecondID") - .HasConstraintName("fk_link_show_genre_genres_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.User", "First") - .WithMany("ShowLinks") - .HasForeignKey("FirstID") - .HasConstraintName("fk_link_user_show_users_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Second") - .WithMany() - .HasForeignKey("SecondID") - .HasConstraintName("fk_link_user_show_shows_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - modelBuilder.Entity("Kyoo.Models.PeopleRole", b => { b.HasOne("Kyoo.Models.People", "People") @@ -1095,23 +1020,72 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b => { - b.HasOne("Kyoo.Models.User", "First") - .WithMany("CurrentlyWatching") - .HasForeignKey("FirstID") - .HasConstraintName("fk_watched_episodes_users_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Episode", "Second") + b.HasOne("Kyoo.Models.Episode", "Episode") .WithMany() - .HasForeignKey("SecondID") - .HasConstraintName("fk_watched_episodes_episodes_second_id") + .HasForeignKey("EpisodeID") + .HasConstraintName("fk_watched_episodes_episodes_episode_id") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.Navigation("First"); + b.HasOne("Kyoo.Models.User", null) + .WithMany("CurrentlyWatching") + .HasForeignKey("UserID") + .HasConstraintName("fk_watched_episodes_users_user_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Second"); + b.Navigation("Episode"); + }); + + modelBuilder.Entity("LibraryProvider", b => + { + b.HasOne("Kyoo.Models.Library", null) + .WithMany() + .HasForeignKey("LibrariesID") + .HasConstraintName("fk_link_library_provider_libraries_libraries_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Provider", null) + .WithMany() + .HasForeignKey("ProvidersID") + .HasConstraintName("fk_link_library_provider_providers_providers_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("LibraryShow", b => + { + b.HasOne("Kyoo.Models.Library", null) + .WithMany() + .HasForeignKey("LibrariesID") + .HasConstraintName("fk_link_library_show_libraries_libraries_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("ShowsID") + .HasConstraintName("fk_link_library_show_shows_shows_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("ShowUser", b => + { + b.HasOne("Kyoo.Models.User", null) + .WithMany() + .HasForeignKey("UsersID") + .HasConstraintName("fk_link_user_show_users_users_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("WatchedID") + .HasConstraintName("fk_link_user_show_shows_watched_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); }); modelBuilder.Entity("collection_metadata_id", b => @@ -1231,10 +1205,6 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("Kyoo.Models.Collection", b => { b.Navigation("ExternalIDs"); - - b.Navigation("LibraryLinks"); - - b.Navigation("ShowLinks"); }); modelBuilder.Entity("Kyoo.Models.Episode", b => @@ -1244,20 +1214,6 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Tracks"); }); - modelBuilder.Entity("Kyoo.Models.Genre", b => - { - b.Navigation("ShowLinks"); - }); - - modelBuilder.Entity("Kyoo.Models.Library", b => - { - b.Navigation("CollectionLinks"); - - b.Navigation("ProviderLinks"); - - b.Navigation("ShowLinks"); - }); - modelBuilder.Entity("Kyoo.Models.People", b => { b.Navigation("ExternalIDs"); @@ -1265,11 +1221,6 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Roles"); }); - modelBuilder.Entity("Kyoo.Models.Provider", b => - { - b.Navigation("LibraryLinks"); - }); - modelBuilder.Entity("Kyoo.Models.Season", b => { b.Navigation("Episodes"); @@ -1279,16 +1230,10 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("Kyoo.Models.Show", b => { - b.Navigation("CollectionLinks"); - b.Navigation("Episodes"); b.Navigation("ExternalIDs"); - b.Navigation("GenreLinks"); - - b.Navigation("LibraryLinks"); - b.Navigation("People"); b.Navigation("Seasons"); @@ -1304,8 +1249,6 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("Kyoo.Models.User", b => { b.Navigation("CurrentlyWatching"); - - b.Navigation("ShowLinks"); }); #pragma warning restore 612, 618 } diff --git a/Kyoo.Postgresql/PostgresContext.cs b/Kyoo.Postgresql/PostgresContext.cs index 09f460bc..eaea9927 100644 --- a/Kyoo.Postgresql/PostgresContext.cs +++ b/Kyoo.Postgresql/PostgresContext.cs @@ -122,6 +122,9 @@ namespace Kyoo.Postgresql modelBuilder.Entity() .Property(x => x.Images) .HasColumnType("jsonb"); + modelBuilder.Entity() + .Property(x => x.Images) + .HasColumnType("jsonb"); base.OnModelCreating(modelBuilder); } @@ -132,6 +135,13 @@ namespace Kyoo.Postgresql SnakeCaseNameRewriter rewriter = new(CultureInfo.InvariantCulture); return rewriter.RewriteName(typeof(T).Name + nameof(MetadataID)); } + + /// + protected override string LinkName() + { + SnakeCaseNameRewriter rewriter = new(CultureInfo.InvariantCulture); + return rewriter.RewriteName("Link" + typeof(T).Name + typeof(T2).Name); + } /// protected override bool IsDuplicateException(Exception ex) diff --git a/Kyoo.Postgresql/PostgresModule.cs b/Kyoo.Postgresql/PostgresModule.cs index 124df770..6b84bd93 100644 --- a/Kyoo.Postgresql/PostgresModule.cs +++ b/Kyoo.Postgresql/PostgresModule.cs @@ -66,7 +66,7 @@ namespace Kyoo.Postgresql x.UseNpgsql(_configuration.GetDatabaseConnection("postgres")); if (_environment.IsDevelopment()) x.EnableDetailedErrors().EnableSensitiveDataLogging(); - }); + }, ServiceLifetime.Transient); } /// diff --git a/Kyoo.SqLite/Migrations/20210728134952_Initial.Designer.cs b/Kyoo.SqLite/Migrations/20210730203155_Initial.Designer.cs similarity index 81% rename from Kyoo.SqLite/Migrations/20210728134952_Initial.Designer.cs rename to Kyoo.SqLite/Migrations/20210730203155_Initial.Designer.cs index 3f4290b7..48b89a25 100644 --- a/Kyoo.SqLite/Migrations/20210728134952_Initial.Designer.cs +++ b/Kyoo.SqLite/Migrations/20210730203155_Initial.Designer.cs @@ -9,7 +9,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace Kyoo.SqLite.Migrations { [DbContext(typeof(SqLiteContext))] - [Migration("20210728134952_Initial")] + [Migration("20210730203155_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -18,6 +18,21 @@ namespace Kyoo.SqLite.Migrations modelBuilder .HasAnnotation("ProductVersion", "5.0.8"); + modelBuilder.Entity("CollectionLibrary", b => + { + b.Property("CollectionsID") + .HasColumnType("INTEGER"); + + b.Property("LibrariesID") + .HasColumnType("INTEGER"); + + b.HasKey("CollectionsID", "LibrariesID"); + + b.HasIndex("LibrariesID"); + + b.ToTable("LinkLibraryCollection"); + }); + modelBuilder.Entity("CollectionMetadataID", b => { b.Property("ResourceID") @@ -39,6 +54,21 @@ namespace Kyoo.SqLite.Migrations b.ToTable("CollectionMetadataID"); }); + modelBuilder.Entity("CollectionShow", b => + { + b.Property("CollectionsID") + .HasColumnType("INTEGER"); + + b.Property("ShowsID") + .HasColumnType("INTEGER"); + + b.HasKey("CollectionsID", "ShowsID"); + + b.HasIndex("ShowsID"); + + b.ToTable("LinkCollectionShow"); + }); + modelBuilder.Entity("EpisodeMetadataID", b => { b.Property("ResourceID") @@ -60,6 +90,21 @@ namespace Kyoo.SqLite.Migrations b.ToTable("EpisodeMetadataID"); }); + modelBuilder.Entity("GenreShow", b => + { + b.Property("GenresID") + .HasColumnType("INTEGER"); + + b.Property("ShowsID") + .HasColumnType("INTEGER"); + + b.HasKey("GenresID", "ShowsID"); + + b.HasIndex("ShowsID"); + + b.ToTable("LinkShowGenre"); + }); + modelBuilder.Entity("Kyoo.Models.Collection", b => { b.Property("ID") @@ -220,96 +265,6 @@ namespace Kyoo.SqLite.Migrations b.ToView("LibraryItems"); }); - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("Link"); - }); - modelBuilder.Entity("Kyoo.Models.People", b => { b.Property("ID") @@ -370,9 +325,6 @@ namespace Kyoo.SqLite.Migrations b.Property("Images") .HasColumnType("TEXT"); - b.Property("LogoExtension") - .HasColumnType("TEXT"); - b.Property("Name") .HasColumnType("TEXT"); @@ -564,6 +516,9 @@ namespace Kyoo.SqLite.Migrations b.Property("ExtraData") .HasColumnType("TEXT"); + b.Property("Images") + .HasColumnType("TEXT"); + b.Property("Password") .HasColumnType("TEXT"); @@ -587,22 +542,52 @@ namespace Kyoo.SqLite.Migrations modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b => { - b.Property("FirstID") + b.Property("UserID") .HasColumnType("INTEGER"); - b.Property("SecondID") + b.Property("EpisodeID") .HasColumnType("INTEGER"); b.Property("WatchedPercentage") .HasColumnType("INTEGER"); - b.HasKey("FirstID", "SecondID"); + b.HasKey("UserID", "EpisodeID"); - b.HasIndex("SecondID"); + b.HasIndex("EpisodeID"); b.ToTable("WatchedEpisodes"); }); + modelBuilder.Entity("LibraryProvider", b => + { + b.Property("LibrariesID") + .HasColumnType("INTEGER"); + + b.Property("ProvidersID") + .HasColumnType("INTEGER"); + + b.HasKey("LibrariesID", "ProvidersID"); + + b.HasIndex("ProvidersID"); + + b.ToTable("LinkLibraryProvider"); + }); + + modelBuilder.Entity("LibraryShow", b => + { + b.Property("LibrariesID") + .HasColumnType("INTEGER"); + + b.Property("ShowsID") + .HasColumnType("INTEGER"); + + b.HasKey("LibrariesID", "ShowsID"); + + b.HasIndex("ShowsID"); + + b.ToTable("LinkLibraryShow"); + }); + modelBuilder.Entity("PeopleMetadataID", b => { b.Property("ResourceID") @@ -666,6 +651,21 @@ namespace Kyoo.SqLite.Migrations b.ToTable("ShowMetadataID"); }); + modelBuilder.Entity("ShowUser", b => + { + b.Property("UsersID") + .HasColumnType("INTEGER"); + + b.Property("WatchedID") + .HasColumnType("INTEGER"); + + b.HasKey("UsersID", "WatchedID"); + + b.HasIndex("WatchedID"); + + b.ToTable("LinkUserShow"); + }); + modelBuilder.Entity("StudioMetadataID", b => { b.Property("ResourceID") @@ -687,6 +687,21 @@ namespace Kyoo.SqLite.Migrations b.ToTable("StudioMetadataID"); }); + modelBuilder.Entity("CollectionLibrary", b => + { + b.HasOne("Kyoo.Models.Collection", null) + .WithMany() + .HasForeignKey("CollectionsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Library", null) + .WithMany() + .HasForeignKey("LibrariesID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("CollectionMetadataID", b => { b.HasOne("Kyoo.Models.Provider", "Provider") @@ -704,6 +719,21 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Provider"); }); + modelBuilder.Entity("CollectionShow", b => + { + b.HasOne("Kyoo.Models.Collection", null) + .WithMany() + .HasForeignKey("CollectionsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("ShowsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("EpisodeMetadataID", b => { b.HasOne("Kyoo.Models.Provider", "Provider") @@ -721,6 +751,21 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Provider"); }); + modelBuilder.Entity("GenreShow", b => + { + b.HasOne("Kyoo.Models.Genre", null) + .WithMany() + .HasForeignKey("GenresID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("ShowsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Kyoo.Models.Episode", b => { b.HasOne("Kyoo.Models.Season", "Season") @@ -739,120 +784,6 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Show"); }); - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Collection", "First") - .WithMany("ShowLinks") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Second") - .WithMany("CollectionLinks") - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Library", "First") - .WithMany("CollectionLinks") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Collection", "Second") - .WithMany("LibraryLinks") - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Library", "First") - .WithMany("ProviderLinks") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany("LibraryLinks") - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Library", "First") - .WithMany("ShowLinks") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Second") - .WithMany("LibraryLinks") - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Show", "First") - .WithMany("GenreLinks") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Genre", "Second") - .WithMany("ShowLinks") - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.User", "First") - .WithMany("ShowLinks") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Second") - .WithMany() - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - modelBuilder.Entity("Kyoo.Models.PeopleRole", b => { b.HasOne("Kyoo.Models.People", "People") @@ -906,21 +837,49 @@ namespace Kyoo.SqLite.Migrations modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b => { - b.HasOne("Kyoo.Models.User", "First") - .WithMany("CurrentlyWatching") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Episode", "Second") + b.HasOne("Kyoo.Models.Episode", "Episode") .WithMany() - .HasForeignKey("SecondID") + .HasForeignKey("EpisodeID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.Navigation("First"); + b.HasOne("Kyoo.Models.User", null) + .WithMany("CurrentlyWatching") + .HasForeignKey("UserID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Second"); + b.Navigation("Episode"); + }); + + modelBuilder.Entity("LibraryProvider", b => + { + b.HasOne("Kyoo.Models.Library", null) + .WithMany() + .HasForeignKey("LibrariesID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Provider", null) + .WithMany() + .HasForeignKey("ProvidersID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("LibraryShow", b => + { + b.HasOne("Kyoo.Models.Library", null) + .WithMany() + .HasForeignKey("LibrariesID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("ShowsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); }); modelBuilder.Entity("PeopleMetadataID", b => @@ -974,6 +933,21 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Provider"); }); + modelBuilder.Entity("ShowUser", b => + { + b.HasOne("Kyoo.Models.User", null) + .WithMany() + .HasForeignKey("UsersID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("WatchedID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("StudioMetadataID", b => { b.HasOne("Kyoo.Models.Provider", "Provider") @@ -994,10 +968,6 @@ namespace Kyoo.SqLite.Migrations modelBuilder.Entity("Kyoo.Models.Collection", b => { b.Navigation("ExternalIDs"); - - b.Navigation("LibraryLinks"); - - b.Navigation("ShowLinks"); }); modelBuilder.Entity("Kyoo.Models.Episode", b => @@ -1007,20 +977,6 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Tracks"); }); - modelBuilder.Entity("Kyoo.Models.Genre", b => - { - b.Navigation("ShowLinks"); - }); - - modelBuilder.Entity("Kyoo.Models.Library", b => - { - b.Navigation("CollectionLinks"); - - b.Navigation("ProviderLinks"); - - b.Navigation("ShowLinks"); - }); - modelBuilder.Entity("Kyoo.Models.People", b => { b.Navigation("ExternalIDs"); @@ -1028,11 +984,6 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Roles"); }); - modelBuilder.Entity("Kyoo.Models.Provider", b => - { - b.Navigation("LibraryLinks"); - }); - modelBuilder.Entity("Kyoo.Models.Season", b => { b.Navigation("Episodes"); @@ -1042,16 +993,10 @@ namespace Kyoo.SqLite.Migrations modelBuilder.Entity("Kyoo.Models.Show", b => { - b.Navigation("CollectionLinks"); - b.Navigation("Episodes"); b.Navigation("ExternalIDs"); - b.Navigation("GenreLinks"); - - b.Navigation("LibraryLinks"); - b.Navigation("People"); b.Navigation("Seasons"); @@ -1067,8 +1012,6 @@ namespace Kyoo.SqLite.Migrations modelBuilder.Entity("Kyoo.Models.User", b => { b.Navigation("CurrentlyWatching"); - - b.Navigation("ShowLinks"); }); #pragma warning restore 612, 618 } diff --git a/Kyoo.SqLite/Migrations/20210728134952_Initial.cs b/Kyoo.SqLite/Migrations/20210730203155_Initial.cs similarity index 86% rename from Kyoo.SqLite/Migrations/20210728134952_Initial.cs rename to Kyoo.SqLite/Migrations/20210730203155_Initial.cs index b0567f79..82ae1dca 100644 --- a/Kyoo.SqLite/Migrations/20210728134952_Initial.cs +++ b/Kyoo.SqLite/Migrations/20210730203155_Initial.cs @@ -75,8 +75,7 @@ namespace Kyoo.SqLite.Migrations .Annotation("Sqlite:Autoincrement", true), Slug = table.Column(type: "TEXT", nullable: false), Name = table.Column(type: "TEXT", nullable: true), - Images = table.Column(type: "TEXT", nullable: true), - LogoExtension = table.Column(type: "TEXT", nullable: true) + Images = table.Column(type: "TEXT", nullable: true) }, constraints: table => { @@ -108,7 +107,8 @@ namespace Kyoo.SqLite.Migrations Email = table.Column(type: "TEXT", nullable: true), Password = table.Column(type: "TEXT", nullable: true), Permissions = table.Column(type: "TEXT", nullable: true), - ExtraData = table.Column(type: "TEXT", nullable: true) + ExtraData = table.Column(type: "TEXT", nullable: true), + Images = table.Column(type: "TEXT", nullable: true) }, constraints: table => { @@ -116,24 +116,24 @@ namespace Kyoo.SqLite.Migrations }); migrationBuilder.CreateTable( - name: "Link", + name: "LinkLibraryCollection", columns: table => new { - FirstID = table.Column(type: "INTEGER", nullable: false), - SecondID = table.Column(type: "INTEGER", nullable: false) + CollectionsID = table.Column(type: "INTEGER", nullable: false), + LibrariesID = table.Column(type: "INTEGER", nullable: false) }, constraints: table => { - table.PrimaryKey("PK_Link", x => new { x.FirstID, x.SecondID }); + table.PrimaryKey("PK_LinkLibraryCollection", x => new { x.CollectionsID, x.LibrariesID }); table.ForeignKey( - name: "FK_Link_Collections_SecondID", - column: x => x.SecondID, + name: "FK_LinkLibraryCollection_Collections_CollectionsID", + column: x => x.CollectionsID, principalTable: "Collections", principalColumn: "ID", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "FK_Link_Libraries_FirstID", - column: x => x.FirstID, + name: "FK_LinkLibraryCollection_Libraries_LibrariesID", + column: x => x.LibrariesID, principalTable: "Libraries", principalColumn: "ID", onDelete: ReferentialAction.Cascade); @@ -166,24 +166,24 @@ namespace Kyoo.SqLite.Migrations }); migrationBuilder.CreateTable( - name: "Link", + name: "LinkLibraryProvider", columns: table => new { - FirstID = table.Column(type: "INTEGER", nullable: false), - SecondID = table.Column(type: "INTEGER", nullable: false) + LibrariesID = table.Column(type: "INTEGER", nullable: false), + ProvidersID = table.Column(type: "INTEGER", nullable: false) }, constraints: table => { - table.PrimaryKey("PK_Link", x => new { x.FirstID, x.SecondID }); + table.PrimaryKey("PK_LinkLibraryProvider", x => new { x.LibrariesID, x.ProvidersID }); table.ForeignKey( - name: "FK_Link_Libraries_FirstID", - column: x => x.FirstID, + name: "FK_LinkLibraryProvider_Libraries_LibrariesID", + column: x => x.LibrariesID, principalTable: "Libraries", principalColumn: "ID", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "FK_Link_Providers_SecondID", - column: x => x.SecondID, + name: "FK_LinkLibraryProvider_Providers_ProvidersID", + column: x => x.ProvidersID, principalTable: "Providers", principalColumn: "ID", onDelete: ReferentialAction.Cascade); @@ -271,96 +271,96 @@ namespace Kyoo.SqLite.Migrations }); migrationBuilder.CreateTable( - name: "Link", + name: "LinkCollectionShow", columns: table => new { - FirstID = table.Column(type: "INTEGER", nullable: false), - SecondID = table.Column(type: "INTEGER", nullable: false) + CollectionsID = table.Column(type: "INTEGER", nullable: false), + ShowsID = table.Column(type: "INTEGER", nullable: false) }, constraints: table => { - table.PrimaryKey("PK_Link", x => new { x.FirstID, x.SecondID }); + table.PrimaryKey("PK_LinkCollectionShow", x => new { x.CollectionsID, x.ShowsID }); table.ForeignKey( - name: "FK_Link_Collections_FirstID", - column: x => x.FirstID, + name: "FK_LinkCollectionShow_Collections_CollectionsID", + column: x => x.CollectionsID, principalTable: "Collections", principalColumn: "ID", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "FK_Link_Shows_SecondID", - column: x => x.SecondID, + name: "FK_LinkCollectionShow_Shows_ShowsID", + column: x => x.ShowsID, principalTable: "Shows", principalColumn: "ID", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( - name: "Link", + name: "LinkLibraryShow", columns: table => new { - FirstID = table.Column(type: "INTEGER", nullable: false), - SecondID = table.Column(type: "INTEGER", nullable: false) + LibrariesID = table.Column(type: "INTEGER", nullable: false), + ShowsID = table.Column(type: "INTEGER", nullable: false) }, constraints: table => { - table.PrimaryKey("PK_Link", x => new { x.FirstID, x.SecondID }); + table.PrimaryKey("PK_LinkLibraryShow", x => new { x.LibrariesID, x.ShowsID }); table.ForeignKey( - name: "FK_Link_Libraries_FirstID", - column: x => x.FirstID, + name: "FK_LinkLibraryShow_Libraries_LibrariesID", + column: x => x.LibrariesID, principalTable: "Libraries", principalColumn: "ID", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "FK_Link_Shows_SecondID", - column: x => x.SecondID, + name: "FK_LinkLibraryShow_Shows_ShowsID", + column: x => x.ShowsID, principalTable: "Shows", principalColumn: "ID", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( - name: "Link", + name: "LinkShowGenre", columns: table => new { - FirstID = table.Column(type: "INTEGER", nullable: false), - SecondID = table.Column(type: "INTEGER", nullable: false) + GenresID = table.Column(type: "INTEGER", nullable: false), + ShowsID = table.Column(type: "INTEGER", nullable: false) }, constraints: table => { - table.PrimaryKey("PK_Link", x => new { x.FirstID, x.SecondID }); + table.PrimaryKey("PK_LinkShowGenre", x => new { x.GenresID, x.ShowsID }); table.ForeignKey( - name: "FK_Link_Genres_SecondID", - column: x => x.SecondID, + name: "FK_LinkShowGenre_Genres_GenresID", + column: x => x.GenresID, principalTable: "Genres", principalColumn: "ID", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "FK_Link_Shows_FirstID", - column: x => x.FirstID, + name: "FK_LinkShowGenre_Shows_ShowsID", + column: x => x.ShowsID, principalTable: "Shows", principalColumn: "ID", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( - name: "Link", + name: "LinkUserShow", columns: table => new { - FirstID = table.Column(type: "INTEGER", nullable: false), - SecondID = table.Column(type: "INTEGER", nullable: false) + UsersID = table.Column(type: "INTEGER", nullable: false), + WatchedID = table.Column(type: "INTEGER", nullable: false) }, constraints: table => { - table.PrimaryKey("PK_Link", x => new { x.FirstID, x.SecondID }); + table.PrimaryKey("PK_LinkUserShow", x => new { x.UsersID, x.WatchedID }); table.ForeignKey( - name: "FK_Link_Shows_SecondID", - column: x => x.SecondID, + name: "FK_LinkUserShow_Shows_WatchedID", + column: x => x.WatchedID, principalTable: "Shows", principalColumn: "ID", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "FK_Link_Users_FirstID", - column: x => x.FirstID, + name: "FK_LinkUserShow_Users_UsersID", + column: x => x.UsersID, principalTable: "Users", principalColumn: "ID", onDelete: ReferentialAction.Cascade); @@ -566,22 +566,22 @@ namespace Kyoo.SqLite.Migrations name: "WatchedEpisodes", columns: table => new { - FirstID = table.Column(type: "INTEGER", nullable: false), - SecondID = table.Column(type: "INTEGER", nullable: false), + UserID = table.Column(type: "INTEGER", nullable: false), + EpisodeID = table.Column(type: "INTEGER", nullable: false), WatchedPercentage = table.Column(type: "INTEGER", nullable: false) }, constraints: table => { - table.PrimaryKey("PK_WatchedEpisodes", x => new { x.FirstID, x.SecondID }); + table.PrimaryKey("PK_WatchedEpisodes", x => new { x.UserID, x.EpisodeID }); table.ForeignKey( - name: "FK_WatchedEpisodes_Episodes_SecondID", - column: x => x.SecondID, + name: "FK_WatchedEpisodes_Episodes_EpisodeID", + column: x => x.EpisodeID, principalTable: "Episodes", principalColumn: "ID", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "FK_WatchedEpisodes_Users_FirstID", - column: x => x.FirstID, + name: "FK_WatchedEpisodes_Users_UserID", + column: x => x.UserID, principalTable: "Users", principalColumn: "ID", onDelete: ReferentialAction.Cascade); @@ -633,34 +633,34 @@ namespace Kyoo.SqLite.Migrations unique: true); migrationBuilder.CreateIndex( - name: "IX_Link_SecondID", - table: "Link", - column: "SecondID"); + name: "IX_LinkCollectionShow_ShowsID", + table: "LinkCollectionShow", + column: "ShowsID"); migrationBuilder.CreateIndex( - name: "IX_Link_SecondID", - table: "Link", - column: "SecondID"); + name: "IX_LinkLibraryCollection_LibrariesID", + table: "LinkLibraryCollection", + column: "LibrariesID"); migrationBuilder.CreateIndex( - name: "IX_Link_SecondID", - table: "Link", - column: "SecondID"); + name: "IX_LinkLibraryProvider_ProvidersID", + table: "LinkLibraryProvider", + column: "ProvidersID"); migrationBuilder.CreateIndex( - name: "IX_Link_SecondID", - table: "Link", - column: "SecondID"); + name: "IX_LinkLibraryShow_ShowsID", + table: "LinkLibraryShow", + column: "ShowsID"); migrationBuilder.CreateIndex( - name: "IX_Link_SecondID", - table: "Link", - column: "SecondID"); + name: "IX_LinkShowGenre_ShowsID", + table: "LinkShowGenre", + column: "ShowsID"); migrationBuilder.CreateIndex( - name: "IX_Link_SecondID", - table: "Link", - column: "SecondID"); + name: "IX_LinkUserShow_WatchedID", + table: "LinkUserShow", + column: "WatchedID"); migrationBuilder.CreateIndex( name: "IX_People_Slug", @@ -752,9 +752,9 @@ namespace Kyoo.SqLite.Migrations unique: true); migrationBuilder.CreateIndex( - name: "IX_WatchedEpisodes_SecondID", + name: "IX_WatchedEpisodes_EpisodeID", table: "WatchedEpisodes", - column: "SecondID"); + column: "EpisodeID"); } protected override void Down(MigrationBuilder migrationBuilder) @@ -766,22 +766,22 @@ namespace Kyoo.SqLite.Migrations name: "EpisodeMetadataID"); migrationBuilder.DropTable( - name: "Link"); + name: "LinkCollectionShow"); migrationBuilder.DropTable( - name: "Link"); + name: "LinkLibraryCollection"); migrationBuilder.DropTable( - name: "Link"); + name: "LinkLibraryProvider"); migrationBuilder.DropTable( - name: "Link"); + name: "LinkLibraryShow"); migrationBuilder.DropTable( - name: "Link"); + name: "LinkShowGenre"); migrationBuilder.DropTable( - name: "Link"); + name: "LinkUserShow"); migrationBuilder.DropTable( name: "PeopleMetadataID"); diff --git a/Kyoo.SqLite/Migrations/20210728135127_Triggers.Designer.cs b/Kyoo.SqLite/Migrations/20210730203746_Triggers.Designer.cs similarity index 81% rename from Kyoo.SqLite/Migrations/20210728135127_Triggers.Designer.cs rename to Kyoo.SqLite/Migrations/20210730203746_Triggers.Designer.cs index 43174e4b..fc59fcf6 100644 --- a/Kyoo.SqLite/Migrations/20210728135127_Triggers.Designer.cs +++ b/Kyoo.SqLite/Migrations/20210730203746_Triggers.Designer.cs @@ -9,7 +9,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace Kyoo.SqLite.Migrations { [DbContext(typeof(SqLiteContext))] - [Migration("20210728135127_Triggers")] + [Migration("20210730203746_Triggers")] partial class Triggers { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -18,6 +18,21 @@ namespace Kyoo.SqLite.Migrations modelBuilder .HasAnnotation("ProductVersion", "5.0.8"); + modelBuilder.Entity("CollectionLibrary", b => + { + b.Property("CollectionsID") + .HasColumnType("INTEGER"); + + b.Property("LibrariesID") + .HasColumnType("INTEGER"); + + b.HasKey("CollectionsID", "LibrariesID"); + + b.HasIndex("LibrariesID"); + + b.ToTable("LinkLibraryCollection"); + }); + modelBuilder.Entity("CollectionMetadataID", b => { b.Property("ResourceID") @@ -39,6 +54,21 @@ namespace Kyoo.SqLite.Migrations b.ToTable("CollectionMetadataID"); }); + modelBuilder.Entity("CollectionShow", b => + { + b.Property("CollectionsID") + .HasColumnType("INTEGER"); + + b.Property("ShowsID") + .HasColumnType("INTEGER"); + + b.HasKey("CollectionsID", "ShowsID"); + + b.HasIndex("ShowsID"); + + b.ToTable("LinkCollectionShow"); + }); + modelBuilder.Entity("EpisodeMetadataID", b => { b.Property("ResourceID") @@ -60,6 +90,21 @@ namespace Kyoo.SqLite.Migrations b.ToTable("EpisodeMetadataID"); }); + modelBuilder.Entity("GenreShow", b => + { + b.Property("GenresID") + .HasColumnType("INTEGER"); + + b.Property("ShowsID") + .HasColumnType("INTEGER"); + + b.HasKey("GenresID", "ShowsID"); + + b.HasIndex("ShowsID"); + + b.ToTable("LinkShowGenre"); + }); + modelBuilder.Entity("Kyoo.Models.Collection", b => { b.Property("ID") @@ -220,96 +265,6 @@ namespace Kyoo.SqLite.Migrations b.ToView("LibraryItems"); }); - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("Link"); - }); - modelBuilder.Entity("Kyoo.Models.People", b => { b.Property("ID") @@ -370,9 +325,6 @@ namespace Kyoo.SqLite.Migrations b.Property("Images") .HasColumnType("TEXT"); - b.Property("LogoExtension") - .HasColumnType("TEXT"); - b.Property("Name") .HasColumnType("TEXT"); @@ -564,6 +516,9 @@ namespace Kyoo.SqLite.Migrations b.Property("ExtraData") .HasColumnType("TEXT"); + b.Property("Images") + .HasColumnType("TEXT"); + b.Property("Password") .HasColumnType("TEXT"); @@ -587,22 +542,52 @@ namespace Kyoo.SqLite.Migrations modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b => { - b.Property("FirstID") + b.Property("UserID") .HasColumnType("INTEGER"); - b.Property("SecondID") + b.Property("EpisodeID") .HasColumnType("INTEGER"); b.Property("WatchedPercentage") .HasColumnType("INTEGER"); - b.HasKey("FirstID", "SecondID"); + b.HasKey("UserID", "EpisodeID"); - b.HasIndex("SecondID"); + b.HasIndex("EpisodeID"); b.ToTable("WatchedEpisodes"); }); + modelBuilder.Entity("LibraryProvider", b => + { + b.Property("LibrariesID") + .HasColumnType("INTEGER"); + + b.Property("ProvidersID") + .HasColumnType("INTEGER"); + + b.HasKey("LibrariesID", "ProvidersID"); + + b.HasIndex("ProvidersID"); + + b.ToTable("LinkLibraryProvider"); + }); + + modelBuilder.Entity("LibraryShow", b => + { + b.Property("LibrariesID") + .HasColumnType("INTEGER"); + + b.Property("ShowsID") + .HasColumnType("INTEGER"); + + b.HasKey("LibrariesID", "ShowsID"); + + b.HasIndex("ShowsID"); + + b.ToTable("LinkLibraryShow"); + }); + modelBuilder.Entity("PeopleMetadataID", b => { b.Property("ResourceID") @@ -666,6 +651,21 @@ namespace Kyoo.SqLite.Migrations b.ToTable("ShowMetadataID"); }); + modelBuilder.Entity("ShowUser", b => + { + b.Property("UsersID") + .HasColumnType("INTEGER"); + + b.Property("WatchedID") + .HasColumnType("INTEGER"); + + b.HasKey("UsersID", "WatchedID"); + + b.HasIndex("WatchedID"); + + b.ToTable("LinkUserShow"); + }); + modelBuilder.Entity("StudioMetadataID", b => { b.Property("ResourceID") @@ -687,6 +687,21 @@ namespace Kyoo.SqLite.Migrations b.ToTable("StudioMetadataID"); }); + modelBuilder.Entity("CollectionLibrary", b => + { + b.HasOne("Kyoo.Models.Collection", null) + .WithMany() + .HasForeignKey("CollectionsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Library", null) + .WithMany() + .HasForeignKey("LibrariesID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("CollectionMetadataID", b => { b.HasOne("Kyoo.Models.Provider", "Provider") @@ -704,6 +719,21 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Provider"); }); + modelBuilder.Entity("CollectionShow", b => + { + b.HasOne("Kyoo.Models.Collection", null) + .WithMany() + .HasForeignKey("CollectionsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("ShowsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("EpisodeMetadataID", b => { b.HasOne("Kyoo.Models.Provider", "Provider") @@ -721,6 +751,21 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Provider"); }); + modelBuilder.Entity("GenreShow", b => + { + b.HasOne("Kyoo.Models.Genre", null) + .WithMany() + .HasForeignKey("GenresID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("ShowsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Kyoo.Models.Episode", b => { b.HasOne("Kyoo.Models.Season", "Season") @@ -739,120 +784,6 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Show"); }); - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Collection", "First") - .WithMany("ShowLinks") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Second") - .WithMany("CollectionLinks") - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Library", "First") - .WithMany("CollectionLinks") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Collection", "Second") - .WithMany("LibraryLinks") - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Library", "First") - .WithMany("ProviderLinks") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany("LibraryLinks") - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Library", "First") - .WithMany("ShowLinks") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Second") - .WithMany("LibraryLinks") - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Show", "First") - .WithMany("GenreLinks") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Genre", "Second") - .WithMany("ShowLinks") - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.User", "First") - .WithMany("ShowLinks") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Second") - .WithMany() - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - modelBuilder.Entity("Kyoo.Models.PeopleRole", b => { b.HasOne("Kyoo.Models.People", "People") @@ -906,21 +837,49 @@ namespace Kyoo.SqLite.Migrations modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b => { - b.HasOne("Kyoo.Models.User", "First") - .WithMany("CurrentlyWatching") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Episode", "Second") + b.HasOne("Kyoo.Models.Episode", "Episode") .WithMany() - .HasForeignKey("SecondID") + .HasForeignKey("EpisodeID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.Navigation("First"); + b.HasOne("Kyoo.Models.User", null) + .WithMany("CurrentlyWatching") + .HasForeignKey("UserID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Second"); + b.Navigation("Episode"); + }); + + modelBuilder.Entity("LibraryProvider", b => + { + b.HasOne("Kyoo.Models.Library", null) + .WithMany() + .HasForeignKey("LibrariesID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Provider", null) + .WithMany() + .HasForeignKey("ProvidersID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("LibraryShow", b => + { + b.HasOne("Kyoo.Models.Library", null) + .WithMany() + .HasForeignKey("LibrariesID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("ShowsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); }); modelBuilder.Entity("PeopleMetadataID", b => @@ -974,6 +933,21 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Provider"); }); + modelBuilder.Entity("ShowUser", b => + { + b.HasOne("Kyoo.Models.User", null) + .WithMany() + .HasForeignKey("UsersID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("WatchedID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("StudioMetadataID", b => { b.HasOne("Kyoo.Models.Provider", "Provider") @@ -994,10 +968,6 @@ namespace Kyoo.SqLite.Migrations modelBuilder.Entity("Kyoo.Models.Collection", b => { b.Navigation("ExternalIDs"); - - b.Navigation("LibraryLinks"); - - b.Navigation("ShowLinks"); }); modelBuilder.Entity("Kyoo.Models.Episode", b => @@ -1007,20 +977,6 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Tracks"); }); - modelBuilder.Entity("Kyoo.Models.Genre", b => - { - b.Navigation("ShowLinks"); - }); - - modelBuilder.Entity("Kyoo.Models.Library", b => - { - b.Navigation("CollectionLinks"); - - b.Navigation("ProviderLinks"); - - b.Navigation("ShowLinks"); - }); - modelBuilder.Entity("Kyoo.Models.People", b => { b.Navigation("ExternalIDs"); @@ -1028,11 +984,6 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Roles"); }); - modelBuilder.Entity("Kyoo.Models.Provider", b => - { - b.Navigation("LibraryLinks"); - }); - modelBuilder.Entity("Kyoo.Models.Season", b => { b.Navigation("Episodes"); @@ -1042,16 +993,10 @@ namespace Kyoo.SqLite.Migrations modelBuilder.Entity("Kyoo.Models.Show", b => { - b.Navigation("CollectionLinks"); - b.Navigation("Episodes"); b.Navigation("ExternalIDs"); - b.Navigation("GenreLinks"); - - b.Navigation("LibraryLinks"); - b.Navigation("People"); b.Navigation("Seasons"); @@ -1067,8 +1012,6 @@ namespace Kyoo.SqLite.Migrations modelBuilder.Entity("Kyoo.Models.User", b => { b.Navigation("CurrentlyWatching"); - - b.Navigation("ShowLinks"); }); #pragma warning restore 612, 618 } diff --git a/Kyoo.SqLite/Migrations/20210728135127_Triggers.cs b/Kyoo.SqLite/Migrations/20210730203746_Triggers.cs similarity index 97% rename from Kyoo.SqLite/Migrations/20210728135127_Triggers.cs rename to Kyoo.SqLite/Migrations/20210730203746_Triggers.cs index fe46cd26..b3e3c5ae 100644 --- a/Kyoo.SqLite/Migrations/20210728135127_Triggers.cs +++ b/Kyoo.SqLite/Migrations/20210730203746_Triggers.cs @@ -161,9 +161,9 @@ namespace Kyoo.SqLite.Migrations FROM Shows AS s WHERE NOT (EXISTS ( SELECT 1 - FROM 'Link' AS l - INNER JOIN Collections AS c ON l.FirstID = c.ID - WHERE s.ID = l.SecondID)) + FROM LinkCollectionShow AS l + INNER JOIN Collections AS c ON l.CollectionsID = c.ID + WHERE s.ID = l.ShowsID)) UNION ALL SELECT -c0.ID, c0.Slug, c0.Name AS Title, c0.Overview, 0 AS Status, NULL AS StartAir, NULL AS EndAir, c0.Images, 2 AS Type diff --git a/Kyoo.SqLite/Migrations/SqLiteContextModelSnapshot.cs b/Kyoo.SqLite/Migrations/SqLiteContextModelSnapshot.cs index fc7c6cac..28dc670c 100644 --- a/Kyoo.SqLite/Migrations/SqLiteContextModelSnapshot.cs +++ b/Kyoo.SqLite/Migrations/SqLiteContextModelSnapshot.cs @@ -16,6 +16,21 @@ namespace Kyoo.SqLite.Migrations modelBuilder .HasAnnotation("ProductVersion", "5.0.8"); + modelBuilder.Entity("CollectionLibrary", b => + { + b.Property("CollectionsID") + .HasColumnType("INTEGER"); + + b.Property("LibrariesID") + .HasColumnType("INTEGER"); + + b.HasKey("CollectionsID", "LibrariesID"); + + b.HasIndex("LibrariesID"); + + b.ToTable("LinkLibraryCollection"); + }); + modelBuilder.Entity("CollectionMetadataID", b => { b.Property("ResourceID") @@ -37,6 +52,21 @@ namespace Kyoo.SqLite.Migrations b.ToTable("CollectionMetadataID"); }); + modelBuilder.Entity("CollectionShow", b => + { + b.Property("CollectionsID") + .HasColumnType("INTEGER"); + + b.Property("ShowsID") + .HasColumnType("INTEGER"); + + b.HasKey("CollectionsID", "ShowsID"); + + b.HasIndex("ShowsID"); + + b.ToTable("LinkCollectionShow"); + }); + modelBuilder.Entity("EpisodeMetadataID", b => { b.Property("ResourceID") @@ -58,6 +88,21 @@ namespace Kyoo.SqLite.Migrations b.ToTable("EpisodeMetadataID"); }); + modelBuilder.Entity("GenreShow", b => + { + b.Property("GenresID") + .HasColumnType("INTEGER"); + + b.Property("ShowsID") + .HasColumnType("INTEGER"); + + b.HasKey("GenresID", "ShowsID"); + + b.HasIndex("ShowsID"); + + b.ToTable("LinkShowGenre"); + }); + modelBuilder.Entity("Kyoo.Models.Collection", b => { b.Property("ID") @@ -218,96 +263,6 @@ namespace Kyoo.SqLite.Migrations b.ToView("LibraryItems"); }); - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("Link"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("Link"); - }); - modelBuilder.Entity("Kyoo.Models.People", b => { b.Property("ID") @@ -368,9 +323,6 @@ namespace Kyoo.SqLite.Migrations b.Property("Images") .HasColumnType("TEXT"); - b.Property("LogoExtension") - .HasColumnType("TEXT"); - b.Property("Name") .HasColumnType("TEXT"); @@ -562,6 +514,9 @@ namespace Kyoo.SqLite.Migrations b.Property("ExtraData") .HasColumnType("TEXT"); + b.Property("Images") + .HasColumnType("TEXT"); + b.Property("Password") .HasColumnType("TEXT"); @@ -585,22 +540,52 @@ namespace Kyoo.SqLite.Migrations modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b => { - b.Property("FirstID") + b.Property("UserID") .HasColumnType("INTEGER"); - b.Property("SecondID") + b.Property("EpisodeID") .HasColumnType("INTEGER"); b.Property("WatchedPercentage") .HasColumnType("INTEGER"); - b.HasKey("FirstID", "SecondID"); + b.HasKey("UserID", "EpisodeID"); - b.HasIndex("SecondID"); + b.HasIndex("EpisodeID"); b.ToTable("WatchedEpisodes"); }); + modelBuilder.Entity("LibraryProvider", b => + { + b.Property("LibrariesID") + .HasColumnType("INTEGER"); + + b.Property("ProvidersID") + .HasColumnType("INTEGER"); + + b.HasKey("LibrariesID", "ProvidersID"); + + b.HasIndex("ProvidersID"); + + b.ToTable("LinkLibraryProvider"); + }); + + modelBuilder.Entity("LibraryShow", b => + { + b.Property("LibrariesID") + .HasColumnType("INTEGER"); + + b.Property("ShowsID") + .HasColumnType("INTEGER"); + + b.HasKey("LibrariesID", "ShowsID"); + + b.HasIndex("ShowsID"); + + b.ToTable("LinkLibraryShow"); + }); + modelBuilder.Entity("PeopleMetadataID", b => { b.Property("ResourceID") @@ -664,6 +649,21 @@ namespace Kyoo.SqLite.Migrations b.ToTable("ShowMetadataID"); }); + modelBuilder.Entity("ShowUser", b => + { + b.Property("UsersID") + .HasColumnType("INTEGER"); + + b.Property("WatchedID") + .HasColumnType("INTEGER"); + + b.HasKey("UsersID", "WatchedID"); + + b.HasIndex("WatchedID"); + + b.ToTable("LinkUserShow"); + }); + modelBuilder.Entity("StudioMetadataID", b => { b.Property("ResourceID") @@ -685,6 +685,21 @@ namespace Kyoo.SqLite.Migrations b.ToTable("StudioMetadataID"); }); + modelBuilder.Entity("CollectionLibrary", b => + { + b.HasOne("Kyoo.Models.Collection", null) + .WithMany() + .HasForeignKey("CollectionsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Library", null) + .WithMany() + .HasForeignKey("LibrariesID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("CollectionMetadataID", b => { b.HasOne("Kyoo.Models.Provider", "Provider") @@ -702,6 +717,21 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Provider"); }); + modelBuilder.Entity("CollectionShow", b => + { + b.HasOne("Kyoo.Models.Collection", null) + .WithMany() + .HasForeignKey("CollectionsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("ShowsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("EpisodeMetadataID", b => { b.HasOne("Kyoo.Models.Provider", "Provider") @@ -719,6 +749,21 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Provider"); }); + modelBuilder.Entity("GenreShow", b => + { + b.HasOne("Kyoo.Models.Genre", null) + .WithMany() + .HasForeignKey("GenresID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("ShowsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("Kyoo.Models.Episode", b => { b.HasOne("Kyoo.Models.Season", "Season") @@ -737,120 +782,6 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Show"); }); - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Collection", "First") - .WithMany("ShowLinks") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Second") - .WithMany("CollectionLinks") - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Library", "First") - .WithMany("CollectionLinks") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Collection", "Second") - .WithMany("LibraryLinks") - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Library", "First") - .WithMany("ProviderLinks") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany("LibraryLinks") - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Library", "First") - .WithMany("ShowLinks") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Second") - .WithMany("LibraryLinks") - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.Show", "First") - .WithMany("GenreLinks") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Genre", "Second") - .WithMany("ShowLinks") - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.Link", b => - { - b.HasOne("Kyoo.Models.User", "First") - .WithMany("ShowLinks") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Show", "Second") - .WithMany() - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - modelBuilder.Entity("Kyoo.Models.PeopleRole", b => { b.HasOne("Kyoo.Models.People", "People") @@ -904,21 +835,49 @@ namespace Kyoo.SqLite.Migrations modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b => { - b.HasOne("Kyoo.Models.User", "First") - .WithMany("CurrentlyWatching") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Episode", "Second") + b.HasOne("Kyoo.Models.Episode", "Episode") .WithMany() - .HasForeignKey("SecondID") + .HasForeignKey("EpisodeID") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.Navigation("First"); + b.HasOne("Kyoo.Models.User", null) + .WithMany("CurrentlyWatching") + .HasForeignKey("UserID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); - b.Navigation("Second"); + b.Navigation("Episode"); + }); + + modelBuilder.Entity("LibraryProvider", b => + { + b.HasOne("Kyoo.Models.Library", null) + .WithMany() + .HasForeignKey("LibrariesID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Provider", null) + .WithMany() + .HasForeignKey("ProvidersID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("LibraryShow", b => + { + b.HasOne("Kyoo.Models.Library", null) + .WithMany() + .HasForeignKey("LibrariesID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("ShowsID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); }); modelBuilder.Entity("PeopleMetadataID", b => @@ -972,6 +931,21 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Provider"); }); + modelBuilder.Entity("ShowUser", b => + { + b.HasOne("Kyoo.Models.User", null) + .WithMany() + .HasForeignKey("UsersID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany() + .HasForeignKey("WatchedID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + modelBuilder.Entity("StudioMetadataID", b => { b.HasOne("Kyoo.Models.Provider", "Provider") @@ -992,10 +966,6 @@ namespace Kyoo.SqLite.Migrations modelBuilder.Entity("Kyoo.Models.Collection", b => { b.Navigation("ExternalIDs"); - - b.Navigation("LibraryLinks"); - - b.Navigation("ShowLinks"); }); modelBuilder.Entity("Kyoo.Models.Episode", b => @@ -1005,20 +975,6 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Tracks"); }); - modelBuilder.Entity("Kyoo.Models.Genre", b => - { - b.Navigation("ShowLinks"); - }); - - modelBuilder.Entity("Kyoo.Models.Library", b => - { - b.Navigation("CollectionLinks"); - - b.Navigation("ProviderLinks"); - - b.Navigation("ShowLinks"); - }); - modelBuilder.Entity("Kyoo.Models.People", b => { b.Navigation("ExternalIDs"); @@ -1026,11 +982,6 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Roles"); }); - modelBuilder.Entity("Kyoo.Models.Provider", b => - { - b.Navigation("LibraryLinks"); - }); - modelBuilder.Entity("Kyoo.Models.Season", b => { b.Navigation("Episodes"); @@ -1040,16 +991,10 @@ namespace Kyoo.SqLite.Migrations modelBuilder.Entity("Kyoo.Models.Show", b => { - b.Navigation("CollectionLinks"); - b.Navigation("Episodes"); b.Navigation("ExternalIDs"); - b.Navigation("GenreLinks"); - - b.Navigation("LibraryLinks"); - b.Navigation("People"); b.Navigation("Seasons"); @@ -1065,8 +1010,6 @@ namespace Kyoo.SqLite.Migrations modelBuilder.Entity("Kyoo.Models.User", b => { b.Navigation("CurrentlyWatching"); - - b.Navigation("ShowLinks"); }); #pragma warning restore 612, 618 } diff --git a/Kyoo.SqLite/SqLiteContext.cs b/Kyoo.SqLite/SqLiteContext.cs index e81a91ad..e05d0308 100644 --- a/Kyoo.SqLite/SqLiteContext.cs +++ b/Kyoo.SqLite/SqLiteContext.cs @@ -133,6 +133,9 @@ namespace Kyoo.SqLite modelBuilder.Entity() .Property(x => x.Images) .HasConversion(jsonConvertor); + modelBuilder.Entity() + .Property(x => x.Images) + .HasConversion(jsonConvertor); modelBuilder.Entity() @@ -146,6 +149,12 @@ namespace Kyoo.SqLite { return typeof(T).Name + nameof(MetadataID); } + + /// + protected override string LinkName() + { + return "Link" + typeof(T).Name + typeof(T2).Name; + } /// protected override bool IsDuplicateException(Exception ex) diff --git a/Kyoo.SqLite/SqLiteModule.cs b/Kyoo.SqLite/SqLiteModule.cs index 34802b20..96c29836 100644 --- a/Kyoo.SqLite/SqLiteModule.cs +++ b/Kyoo.SqLite/SqLiteModule.cs @@ -66,7 +66,7 @@ namespace Kyoo.SqLite x.UseSqlite(_configuration.GetDatabaseConnection("sqlite")); if (_environment.IsDevelopment()) x.EnableDetailedErrors().EnableSensitiveDataLogging(); - }); + }, ServiceLifetime.Transient); } /// diff --git a/Kyoo.Tests/Database/RepositoryActivator.cs b/Kyoo.Tests/Database/RepositoryActivator.cs index 25530f78..8e543546 100644 --- a/Kyoo.Tests/Database/RepositoryActivator.cs +++ b/Kyoo.Tests/Database/RepositoryActivator.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading.Tasks; using Kyoo.Controllers; using Xunit.Abstractions; @@ -11,29 +12,28 @@ namespace Kyoo.Tests public ILibraryManager LibraryManager { get; } - private readonly DatabaseContext _database; + private readonly List _databases = new(); public RepositoryActivator(ITestOutputHelper output, PostgresFixture postgres = null) { Context = postgres == null ? new SqLiteTestContext(output) : new PostgresTestContext(postgres, output); - _database = Context.New(); - - ProviderRepository provider = new(_database); - LibraryRepository library = new(_database, provider); - CollectionRepository collection = new(_database, provider); - GenreRepository genre = new(_database); - StudioRepository studio = new(_database, provider); - PeopleRepository people = new(_database, provider, + + ProviderRepository provider = new(_NewContext()); + LibraryRepository library = new(_NewContext(), provider); + CollectionRepository collection = new(_NewContext(), provider); + GenreRepository genre = new(_NewContext()); + StudioRepository studio = new(_NewContext(), provider); + PeopleRepository people = new(_NewContext(), provider, new Lazy(() => LibraryManager.ShowRepository)); - ShowRepository show = new(_database, studio, people, genre, provider); - SeasonRepository season = new(_database, provider); - LibraryItemRepository libraryItem = new(_database, + ShowRepository show = new(_NewContext(), studio, people, genre, provider); + SeasonRepository season = new(_NewContext(), provider); + LibraryItemRepository libraryItem = new(_NewContext(), new Lazy(() => LibraryManager.LibraryRepository)); - TrackRepository track = new(_database); - EpisodeRepository episode = new(_database, provider, track); - UserRepository user = new(_database); + TrackRepository track = new(_NewContext()); + EpisodeRepository episode = new(_NewContext(), provider, track); + UserRepository user = new(_NewContext()); LibraryManager = new LibraryManager(new IBaseRepository[] { provider, @@ -51,16 +51,25 @@ namespace Kyoo.Tests }); } + private DatabaseContext _NewContext() + { + DatabaseContext context = Context.New(); + _databases.Add(context); + return context; + } + public void Dispose() { - _database.Dispose(); + foreach (DatabaseContext context in _databases) + context.Dispose(); Context.Dispose(); GC.SuppressFinalize(this); } public async ValueTask DisposeAsync() { - await _database.DisposeAsync(); + foreach (DatabaseContext context in _databases) + await context.DisposeAsync(); await Context.DisposeAsync(); } } diff --git a/Kyoo.Tests/Database/SpecificTests/SanityTests.cs b/Kyoo.Tests/Database/SpecificTests/SanityTests.cs index 933bbf82..a071ee2b 100644 --- a/Kyoo.Tests/Database/SpecificTests/SanityTests.cs +++ b/Kyoo.Tests/Database/SpecificTests/SanityTests.cs @@ -16,13 +16,6 @@ namespace Kyoo.Tests.Database _repositories = new RepositoryActivator(output); } - [Fact] - [SuppressMessage("ReSharper", "EqualExpressionComparison")] - public void SampleTest() - { - Assert.False(ReferenceEquals(TestSample.Get(), TestSample.Get())); - } - public void Dispose() { _repositories.Dispose(); @@ -33,5 +26,12 @@ namespace Kyoo.Tests.Database { return _repositories.DisposeAsync(); } + + [Fact] + [SuppressMessage("ReSharper", "EqualExpressionComparison")] + public void SampleTest() + { + Assert.False(ReferenceEquals(TestSample.Get(), TestSample.Get())); + } } } \ No newline at end of file diff --git a/Kyoo.Tests/Database/SpecificTests/ShowTests.cs b/Kyoo.Tests/Database/SpecificTests/ShowTests.cs index c7b89be6..2f87afca 100644 --- a/Kyoo.Tests/Database/SpecificTests/ShowTests.cs +++ b/Kyoo.Tests/Database/SpecificTests/ShowTests.cs @@ -85,11 +85,11 @@ namespace Kyoo.Tests.Database await using DatabaseContext database = Repositories.Context.New(); Show show = await database.Shows - .Include(x => x.Genres) + .Include(x => x.Studio) .FirstAsync(); Assert.Equal(value.Slug, show.Slug); - Assert.Equal("studio", edited.Studio.Slug); + Assert.Equal("studio", show.Studio.Slug); } [Fact] @@ -106,7 +106,7 @@ namespace Kyoo.Tests.Database Show show = await database.Shows.FirstAsync(); Assert.Equal(value.Slug, show.Slug); - Assert.Equal(value.Aliases, edited.Aliases); + Assert.Equal(value.Aliases, show.Aliases); } [Fact] @@ -135,12 +135,13 @@ namespace Kyoo.Tests.Database await using DatabaseContext database = Repositories.Context.New(); Show show = await database.Shows .Include(x => x.People) + .ThenInclude(x => x.People) .FirstAsync(); Assert.Equal(value.Slug, show.Slug); Assert.Equal( value.People.Select(x => new{x.Role, x.Slug, x.People.Name}), - edited.People.Select(x => new{x.Role, x.Slug, x.People.Name})); + show.People.Select(x => new{x.Role, x.Slug, x.People.Name})); } [Fact] @@ -235,9 +236,11 @@ namespace Kyoo.Tests.Database expected.Studio = new Studio("studio"); Show created = await _repository.Create(expected); KAssert.DeepEqual(expected, created); + await using DatabaseContext context = Repositories.Context.New(); Show retrieved = await context.Shows .Include(x => x.ExternalIDs) + .ThenInclude(x => x.Provider) .Include(x => x.Genres) .Include(x => x.People) .Include(x => x.Studio) @@ -264,6 +267,7 @@ namespace Kyoo.Tests.Database await using DatabaseContext context = Repositories.Context.New(); Show retrieved = await context.Shows .Include(x => x.ExternalIDs) + .ThenInclude(x => x.Provider) .FirstAsync(x => x.ID == created.ID); KAssert.DeepEqual(expected, retrieved); Assert.Equal(1, retrieved.ExternalIDs.Count); diff --git a/Kyoo.Tests/Database/TestSample.cs b/Kyoo.Tests/Database/TestSample.cs index 0faf16da..a3e113bf 100644 --- a/Kyoo.Tests/Database/TestSample.cs +++ b/Kyoo.Tests/Database/TestSample.cs @@ -17,6 +17,27 @@ namespace Kyoo.Tests Name = "New Library", Paths = new [] {"/a/random/path"} } + }, + { + typeof(Show), + () => new Show + { + ID = 2, + Slug = "new-show", + Title = "New Show", + Overview = "overview", + Status = Status.Planned, + StartAir = new DateTime(2011, 1, 1), + EndAir = new DateTime(2011, 1, 1), + Images = new Dictionary + { + [Thumbnails.Poster] = "Poster", + [Thumbnails.Logo] = "Logo", + [Thumbnails.Thumbnail] = "Thumbnail" + }, + IsMovie = false, + Studio = null + } } }; @@ -64,6 +85,7 @@ namespace Kyoo.Tests "In time, however, these childhood friends drifted apart, and when they became high " + "school students, they had long ceased to think of each other as friends.", Status = Status.Finished, + StudioID = 1, StartAir = new DateTime(2011, 1, 1), EndAir = new DateTime(2011, 1, 1), Images = new Dictionary @@ -182,8 +204,7 @@ namespace Kyoo.Tests [Thumbnails.Poster] = "Poster", [Thumbnails.Logo] = "path/tvdb.svg", [Thumbnails.Thumbnail] = "Thumbnail" - }, - LogoExtension = "svg" + } } }, { @@ -218,6 +239,7 @@ namespace Kyoo.Tests Show show = Get(); show.ID = 0; + show.StudioID = 0; context.Shows.Add(show); Season season = Get(); diff --git a/Kyoo.Tests/KAssert.cs b/Kyoo.Tests/KAssert.cs index 3acee11a..e4c2e28f 100644 --- a/Kyoo.Tests/KAssert.cs +++ b/Kyoo.Tests/KAssert.cs @@ -1,8 +1,5 @@ -using System.Collections; -using System.Linq; -using System.Reflection; +using FluentAssertions; using JetBrains.Annotations; -using Xunit; using Xunit.Sdk; namespace Kyoo.Tests @@ -21,11 +18,7 @@ namespace Kyoo.Tests [AssertionMethod] public static void DeepEqual(T expected, T value) { - PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public); - foreach (PropertyInfo property in properties) - Assert.Equal(property.GetValue(expected), property.GetValue(value)); - if (!properties.Any()) - Assert.Equal(expected, value); + value.Should().BeEquivalentTo(expected); } /// diff --git a/Kyoo.Tests/Kyoo.Tests.csproj b/Kyoo.Tests/Kyoo.Tests.csproj index eeaf81f9..b6b25e03 100644 --- a/Kyoo.Tests/Kyoo.Tests.csproj +++ b/Kyoo.Tests/Kyoo.Tests.csproj @@ -15,6 +15,7 @@ all + diff --git a/Kyoo.TheMovieDb/ProviderTmdb.cs b/Kyoo.TheMovieDb/ProviderTmdb.cs index 96bbfb5a..95c0cc3d 100644 --- a/Kyoo.TheMovieDb/ProviderTmdb.cs +++ b/Kyoo.TheMovieDb/ProviderTmdb.cs @@ -33,7 +33,6 @@ namespace Kyoo.TheMovieDb { Slug = "the-moviedb", Name = "TheMovieDB", - LogoExtension = "svg", Images = new Dictionary { [Thumbnails.Logo] = "https://www.themoviedb.org/assets/2/v4/logos/v2/" + diff --git a/Kyoo.TheTvdb/ProviderTvdb.cs b/Kyoo.TheTvdb/ProviderTvdb.cs index 13aefa80..66e330f9 100644 --- a/Kyoo.TheTvdb/ProviderTvdb.cs +++ b/Kyoo.TheTvdb/ProviderTvdb.cs @@ -32,7 +32,6 @@ namespace Kyoo.TheTvdb { Slug = "the-tvdb", Name = "TheTVDB", - LogoExtension = "png", Images = new Dictionary { [Thumbnails.Logo] = "https://www.thetvdb.com/images/logo.png" diff --git a/Kyoo/Controllers/Repositories/CollectionRepository.cs b/Kyoo/Controllers/Repositories/CollectionRepository.cs index a757d1c9..42483b08 100644 --- a/Kyoo/Controllers/Repositories/CollectionRepository.cs +++ b/Kyoo/Controllers/Repositories/CollectionRepository.cs @@ -53,6 +53,7 @@ namespace Kyoo.Controllers { await base.Create(obj); _database.Entry(obj).State = EntityState.Added; + obj.ExternalIDs.ForEach(x => _database.MetadataIds().Attach(x)); await _database.SaveChangesAsync($"Trying to insert a duplicated collection (slug {obj.Slug} already exists)."); return obj; } diff --git a/Kyoo/Controllers/Repositories/EpisodeRepository.cs b/Kyoo/Controllers/Repositories/EpisodeRepository.cs index 51f58cd9..ac243a68 100644 --- a/Kyoo/Controllers/Repositories/EpisodeRepository.cs +++ b/Kyoo/Controllers/Repositories/EpisodeRepository.cs @@ -111,6 +111,7 @@ namespace Kyoo.Controllers { await base.Create(obj); _database.Entry(obj).State = EntityState.Added; + obj.ExternalIDs.ForEach(x => _database.MetadataIds().Attach(x)); await _database.SaveChangesAsync($"Trying to insert a duplicated episode (slug {obj.Slug} already exists)."); return await ValidateTracks(obj); } diff --git a/Kyoo/Controllers/Repositories/LibraryRepository.cs b/Kyoo/Controllers/Repositories/LibraryRepository.cs index b7b782bc..a8e552af 100644 --- a/Kyoo/Controllers/Repositories/LibraryRepository.cs +++ b/Kyoo/Controllers/Repositories/LibraryRepository.cs @@ -54,7 +54,8 @@ namespace Kyoo.Controllers { await base.Create(obj); _database.Entry(obj).State = EntityState.Added; - obj.ProviderLinks.ForEach(x => _database.Entry(x).State = EntityState.Added); + if (obj.Providers != null) + _database.AttachRange(obj.Providers); await _database.SaveChangesAsync($"Trying to insert a duplicated library (slug {obj.Slug} already exists)."); return obj; } @@ -63,15 +64,12 @@ namespace Kyoo.Controllers protected override async Task Validate(Library resource) { await base.Validate(resource); - resource.ProviderLinks = resource.Providers? - .Select(x => Link.Create(resource, x)) - .ToList(); - await resource.ProviderLinks.ForEachAsync(async id => + if (resource.Providers != null) { - id.Second = await _providers.CreateIfNotExists(id.Second); - id.SecondID = id.Second.ID; - _database.Entry(id.Second).State = EntityState.Detached; - }); + resource.Providers = await resource.Providers + .SelectAsync(x => _providers.CreateIfNotExists(x)) + .ToListAsync(); + } } /// diff --git a/Kyoo/Controllers/Repositories/PeopleRepository.cs b/Kyoo/Controllers/Repositories/PeopleRepository.cs index 6ca99c37..a55c8e0e 100644 --- a/Kyoo/Controllers/Repositories/PeopleRepository.cs +++ b/Kyoo/Controllers/Repositories/PeopleRepository.cs @@ -62,6 +62,7 @@ namespace Kyoo.Controllers { await base.Create(obj); _database.Entry(obj).State = EntityState.Added; + obj.ExternalIDs.ForEach(x => _database.MetadataIds().Attach(x)); await _database.SaveChangesAsync($"Trying to insert a duplicated people (slug {obj.Slug} already exists)."); return obj; } diff --git a/Kyoo/Controllers/Repositories/SeasonRepository.cs b/Kyoo/Controllers/Repositories/SeasonRepository.cs index c481e866..12900300 100644 --- a/Kyoo/Controllers/Repositories/SeasonRepository.cs +++ b/Kyoo/Controllers/Repositories/SeasonRepository.cs @@ -87,6 +87,7 @@ namespace Kyoo.Controllers { await base.Create(obj); _database.Entry(obj).State = EntityState.Added; + obj.ExternalIDs.ForEach(x => _database.MetadataIds().Attach(x)); await _database.SaveChangesAsync($"Trying to insert a duplicated season (slug {obj.Slug} already exists)."); return obj; } diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index 84923cd3..c0f29cec 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -76,8 +76,10 @@ namespace Kyoo.Controllers { await base.Create(obj); _database.Entry(obj).State = EntityState.Added; - obj.GenreLinks.ForEach(x => _database.Entry(x).State = EntityState.Added); + if (obj.Genres != null) + _database.AttachRange(obj.Genres); obj.People.ForEach(x => _database.Entry(x).State = EntityState.Added); + obj.ExternalIDs.ForEach(x => _database.MetadataIds().Attach(x)); await _database.SaveChangesAsync($"Trying to insert a duplicated show (slug {obj.Slug} already exists)."); return obj; } @@ -89,15 +91,13 @@ namespace Kyoo.Controllers if (resource.Studio != null) resource.Studio = await _studios.CreateIfNotExists(resource.Studio); - resource.GenreLinks = resource.Genres? - .Select(x => Link.Create(resource, x)) - .ToList(); - await resource.GenreLinks.ForEachAsync(async id => + if (resource.Genres != null) { - id.Second = await _genres.CreateIfNotExists(id.Second); - id.SecondID = id.Second.ID; - _database.Entry(id.Second).State = EntityState.Detached; - }); + resource.Genres = await resource.Genres + .SelectAsync(x => _genres.CreateIfNotExists(x)) + .ToListAsync(); + } + await resource.ExternalIDs.ForEachAsync(async id => { id.Provider = await _providers.CreateIfNotExists(id.Provider); diff --git a/Kyoo/Controllers/Repositories/StudioRepository.cs b/Kyoo/Controllers/Repositories/StudioRepository.cs index ef0dfecc..744529bd 100644 --- a/Kyoo/Controllers/Repositories/StudioRepository.cs +++ b/Kyoo/Controllers/Repositories/StudioRepository.cs @@ -54,6 +54,7 @@ namespace Kyoo.Controllers { await base.Create(obj); _database.Entry(obj).State = EntityState.Added; + obj.ExternalIDs.ForEach(x => _database.MetadataIds().Attach(x)); await _database.SaveChangesAsync($"Trying to insert a duplicated studio (slug {obj.Slug} already exists)."); return obj; } diff --git a/Kyoo/Controllers/ThumbnailsManager.cs b/Kyoo/Controllers/ThumbnailsManager.cs index bd24d975..e052cfe5 100644 --- a/Kyoo/Controllers/ThumbnailsManager.cs +++ b/Kyoo/Controllers/ThumbnailsManager.cs @@ -110,6 +110,7 @@ namespace Kyoo.Controllers { if (item == null) throw new ArgumentNullException(nameof(item)); + // TODO handle extensions string imageName = imageID switch { Thumbnails.Poster => "poster.jpg", @@ -142,9 +143,7 @@ namespace Kyoo.Controllers return _files.Combine(_options.CurrentValue.PeoplePath, $"{actor.Slug}-{imageName}"); case Provider provider: - return _files.Combine( - _options.CurrentValue.ProviderPath, - $"{provider.Slug}-{imageName[..^4]}{provider.LogoExtension}"); + return _files.Combine(_options.CurrentValue.ProviderPath, $"{provider.Slug}-{imageName}"); default: throw new NotSupportedException($"The type {typeof(T).Name} is not supported."); diff --git a/Kyoo/Kyoo.csproj b/Kyoo/Kyoo.csproj index 70fae8ca..e7f4f1b4 100644 --- a/Kyoo/Kyoo.csproj +++ b/Kyoo/Kyoo.csproj @@ -40,7 +40,7 @@ - +