From 5f49986d9d6f781a8a8a2b1e3864f0387d0baaf3 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Wed, 28 Jul 2021 16:24:03 +0200 Subject: [PATCH] Updating migrations --- Kyoo.Common/Models/LibraryItem.cs | 19 +- Kyoo.Common/Models/MetadataID.cs | 18 +- Kyoo.Common/Models/Resources/Provider.cs | 5 +- Kyoo.CommonAPI/DatabaseContext.cs | 46 +- ....cs => 20210728141410_Initial.Designer.cs} | 544 ++++++++++-------- ...6_Initial.cs => 20210728141410_Initial.cs} | 248 +++++--- ...cs => 20210728142213_Triggers.Designer.cs} | 544 ++++++++++-------- ...Triggers.cs => 20210728142213_Triggers.cs} | 4 +- .../PostgresContextModelSnapshot.cs | 542 +++++++++-------- Kyoo.Postgresql/PostgresContext.cs | 31 + ....cs => 20210728134952_Initial.Designer.cs} | 436 ++++++++------ ...2_Initial.cs => 20210728134952_Initial.cs} | 248 +++++--- ...cs => 20210728135127_Triggers.Designer.cs} | 436 ++++++++------ ...Triggers.cs => 20210728135127_Triggers.cs} | 4 +- .../Migrations/SqLiteContextModelSnapshot.cs | 434 ++++++++------ Kyoo.SqLite/SqLiteContext.cs | 34 +- Kyoo.Tests/Database/TestSample.cs | 16 +- Kyoo.TheMovieDb/Convertors.cs | 17 +- Kyoo.TheMovieDb/ProviderTmdb.cs | 2 +- Kyoo.TheTvdb/Convertors.cs | 9 +- Kyoo.TheTvdb/ProviderTvdb.cs | 2 +- .../Repositories/CollectionRepository.cs | 2 - .../Repositories/EpisodeRepository.cs | 2 - .../Repositories/PeopleRepository.cs | 2 - .../Repositories/ProviderRepository.cs | 8 +- .../Repositories/SeasonRepository.cs | 2 - .../Repositories/ShowRepository.cs | 2 - .../Repositories/StudioRepository.cs | 1 - 28 files changed, 2124 insertions(+), 1534 deletions(-) rename Kyoo.Postgresql/Migrations/{20210723224326_Initial.Designer.cs => 20210728141410_Initial.Designer.cs} (82%) rename Kyoo.Postgresql/Migrations/{20210723224326_Initial.cs => 20210728141410_Initial.cs} (82%) rename Kyoo.Postgresql/Migrations/{20210723224335_Triggers.Designer.cs => 20210728142213_Triggers.Designer.cs} (82%) rename Kyoo.Postgresql/Migrations/{20210723224335_Triggers.cs => 20210728142213_Triggers.cs} (98%) rename Kyoo.SqLite/Migrations/{20210723224542_Initial.Designer.cs => 20210728134952_Initial.Designer.cs} (84%) rename Kyoo.SqLite/Migrations/{20210723224542_Initial.cs => 20210728134952_Initial.cs} (82%) rename Kyoo.SqLite/Migrations/{20210723224550_Triggers.Designer.cs => 20210728135127_Triggers.Designer.cs} (84%) rename Kyoo.SqLite/Migrations/{20210723224550_Triggers.cs => 20210728135127_Triggers.cs} (98%) diff --git a/Kyoo.Common/Models/LibraryItem.cs b/Kyoo.Common/Models/LibraryItem.cs index 6bc61c2e..dda95343 100644 --- a/Kyoo.Common/Models/LibraryItem.cs +++ b/Kyoo.Common/Models/LibraryItem.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq.Expressions; using Kyoo.Models.Attributes; @@ -18,7 +19,7 @@ namespace Kyoo.Models /// A type union between and . /// This is used to list content put inside a library. /// - public class LibraryItem : IResource + public class LibraryItem : IResource, IThumbnails { /// public int ID { get; set; } @@ -52,13 +53,17 @@ namespace Kyoo.Models /// It can also be null if this is unknown. /// public DateTime? EndAir { get; set; } - + + /// + public Dictionary Images { get; set; } + /// /// The path of this item's poster. /// By default, the http path for this poster is returned from the public API. /// This can be disabled using the internal query flag. /// - [SerializeAs("{HOST}/api/{Type:l}/{Slug}/poster")] public string Poster { get; set; } + [SerializeAs("{HOST}/api/{Type:l}/{Slug}/poster")] + public string Poster => Images[Thumbnails.Poster]; /// /// The type of this item (ether a collection, a show or a movie). @@ -84,7 +89,7 @@ namespace Kyoo.Models Status = show.Status; StartAir = show.StartAir; EndAir = show.EndAir; - Poster = show.Poster; + Images = show.Images; Type = show.IsMovie ? ItemType.Movie : ItemType.Show; } @@ -101,7 +106,7 @@ namespace Kyoo.Models Status = Models.Status.Unknown; StartAir = null; EndAir = null; - Poster = collection.Poster; + Images = collection.Images; Type = ItemType.Collection; } @@ -117,7 +122,7 @@ namespace Kyoo.Models Status = x.Status, StartAir = x.StartAir, EndAir = x.EndAir, - Poster= x.Poster, + Images = x.Images, Type = x.IsMovie ? ItemType.Movie : ItemType.Show }; @@ -133,7 +138,7 @@ namespace Kyoo.Models Status = Models.Status.Unknown, StartAir = null, EndAir = null, - Poster = x.Poster, + Images = x.Images, Type = ItemType.Collection }; } diff --git a/Kyoo.Common/Models/MetadataID.cs b/Kyoo.Common/Models/MetadataID.cs index e3bb42a6..cda4ce11 100644 --- a/Kyoo.Common/Models/MetadataID.cs +++ b/Kyoo.Common/Models/MetadataID.cs @@ -13,27 +13,22 @@ namespace Kyoo.Models /// The ID of the resource which possess the metadata. /// [SerializeIgnore] public int ResourceID { get; set; } - - /// - /// The name of the resource type. This is only used internally to discriminate types. - /// - [SerializeIgnore] public string ResourceType { get; set; } - + /// /// The ID of the provider. /// [SerializeIgnore] public int ProviderID { get; set; } - + /// /// The provider that can do something with this ID. /// public Provider Provider { get; set; } - + /// /// The ID of the resource on the external provider. /// public string DataID { get; set; } - + /// /// The URL of the resource on the external provider. /// @@ -44,10 +39,7 @@ namespace Kyoo.Models /// public static Expression> PrimaryKey { - get - { - return x => new {First = x.ResourceID, Second = x.ProviderID, Type = x.ResourceType}; - } + get { return x => new { First = x.ResourceID, Second = x.ProviderID }; } } } } \ No newline at end of file diff --git a/Kyoo.Common/Models/Resources/Provider.cs b/Kyoo.Common/Models/Resources/Provider.cs index e931479a..630a2880 100644 --- a/Kyoo.Common/Models/Resources/Provider.cs +++ b/Kyoo.Common/Models/Resources/Provider.cs @@ -65,7 +65,10 @@ namespace Kyoo.Models { Slug = Utility.ToSlug(name); Name = name; - Images[Thumbnails.Logo] = logo; + Images = new Dictionary + { + [Thumbnails.Logo] = logo + }; } } } \ No newline at end of file diff --git a/Kyoo.CommonAPI/DatabaseContext.cs b/Kyoo.CommonAPI/DatabaseContext.cs index d0600da1..6d1fec11 100644 --- a/Kyoo.CommonAPI/DatabaseContext.cs +++ b/Kyoo.CommonAPI/DatabaseContext.cs @@ -60,10 +60,7 @@ namespace Kyoo /// All providers of Kyoo. See . /// public DbSet Providers { get; set; } - /// - /// All metadata ids, not discriminated by type. See . - /// - public DbSet MetadataIDs { get; set; } + /// /// The list of registered users. /// @@ -87,6 +84,25 @@ 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 . + /// + /// The metadata of this type will be returned. + /// A queryable of metadata ids for a type. + public DbSet MetadataIds() + where T : class, IMetadata + { + return Set(MetadataName()); + } + /// /// Get a generic link between two resource types. /// @@ -133,9 +149,12 @@ namespace Kyoo private void _HasMetadata(ModelBuilder modelBuilder) where T : class, IMetadata { - modelBuilder.Entity() - .HasMany(x => x.ExternalIDs) - .WithOne() + modelBuilder.SharedTypeEntity(MetadataName()) + .HasKey(MetadataID.PrimaryKey); + + modelBuilder.SharedTypeEntity(MetadataName()) + .HasOne() + .WithMany(x => x.ExternalIDs) .HasForeignKey(x => x.ResourceID) .OnDelete(DeleteBehavior.Cascade); } @@ -149,6 +168,9 @@ namespace Kyoo { base.OnModelCreating(modelBuilder); + modelBuilder.Entity() + .Ignore(x => x.ForPeople); + modelBuilder.Entity() .HasMany(x => x.Seasons) .WithOne(x => x.Show) @@ -243,14 +265,6 @@ namespace Kyoo .WithMany(x => x.ShowLinks), y => y.HasKey(Link.PrimaryKey)); - modelBuilder.Entity() - .HasKey(MetadataID.PrimaryKey); - modelBuilder.Entity() - .Property(x => x.ResourceType) - .IsRequired(); - modelBuilder.Entity() - .HasDiscriminator(x => x.ResourceType); - _HasMetadata(modelBuilder); _HasMetadata(modelBuilder); _HasMetadata(modelBuilder); @@ -259,7 +273,7 @@ namespace Kyoo _HasMetadata(modelBuilder); modelBuilder.Entity() - .HasKey(x => new {First = x.FirstID, Second = x.SecondID}); + .HasKey(x => new { First = x.FirstID, Second = x.SecondID }); modelBuilder.Entity().Property(x => x.Slug).IsRequired(); modelBuilder.Entity().Property(x => x.Slug).IsRequired(); diff --git a/Kyoo.Postgresql/Migrations/20210723224326_Initial.Designer.cs b/Kyoo.Postgresql/Migrations/20210728141410_Initial.Designer.cs similarity index 82% rename from Kyoo.Postgresql/Migrations/20210723224326_Initial.Designer.cs rename to Kyoo.Postgresql/Migrations/20210728141410_Initial.Designer.cs index 3016a040..8722ada5 100644 --- a/Kyoo.Postgresql/Migrations/20210723224326_Initial.Designer.cs +++ b/Kyoo.Postgresql/Migrations/20210728141410_Initial.Designer.cs @@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace Kyoo.Postgresql.Migrations { [DbContext(typeof(PostgresContext))] - [Migration("20210723224326_Initial")] + [Migration("20210728141410_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -34,6 +34,10 @@ namespace Kyoo.Postgresql.Migrations .HasColumnName("id") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("Name") .HasColumnType("text") .HasColumnName("name"); @@ -42,10 +46,6 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("text") .HasColumnName("overview"); - b.Property("Poster") - .HasColumnType("text") - .HasColumnName("poster"); - b.Property("Slug") .IsRequired() .HasColumnType("text") @@ -77,6 +77,10 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("integer") .HasColumnName("episode_number"); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("Overview") .HasColumnType("text") .HasColumnName("overview"); @@ -106,10 +110,6 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("text") .HasColumnName("slug"); - b.Property("Thumb") - .HasColumnType("text") - .HasColumnName("thumb"); - b.Property("Title") .HasColumnType("text") .HasColumnName("title"); @@ -200,14 +200,14 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("timestamp without time zone") .HasColumnName("end_air"); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("Overview") .HasColumnType("text") .HasColumnName("overview"); - b.Property("Poster") - .HasColumnType("text") - .HasColumnName("poster"); - b.Property("Slug") .HasColumnType("text") .HasColumnName("slug"); @@ -348,114 +348,6 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("link_user_show"); }); - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.Property("DataID") - .HasColumnType("text") - .HasColumnName("data_id"); - - b.Property("Link") - .HasColumnType("text") - .HasColumnName("link"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_metadata_id_episode"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_metadata_id_episode_second_id"); - - b.ToTable("metadata_id_episode"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.Property("DataID") - .HasColumnType("text") - .HasColumnName("data_id"); - - b.Property("Link") - .HasColumnType("text") - .HasColumnName("link"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_metadata_id_people"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_metadata_id_people_second_id"); - - b.ToTable("metadata_id_people"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.Property("DataID") - .HasColumnType("text") - .HasColumnName("data_id"); - - b.Property("Link") - .HasColumnType("text") - .HasColumnName("link"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_metadata_id_season"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_metadata_id_season_second_id"); - - b.ToTable("metadata_id_season"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.Property("DataID") - .HasColumnType("text") - .HasColumnName("data_id"); - - b.Property("Link") - .HasColumnType("text") - .HasColumnName("link"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_metadata_id_show"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_metadata_id_show_second_id"); - - b.ToTable("metadata_id_show"); - }); - modelBuilder.Entity("Kyoo.Models.People", b => { b.Property("ID") @@ -464,14 +356,14 @@ namespace Kyoo.Postgresql.Migrations .HasColumnName("id") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("Name") .HasColumnType("text") .HasColumnName("name"); - b.Property("Poster") - .HasColumnType("text") - .HasColumnName("poster"); - b.Property("Slug") .IsRequired() .HasColumnType("text") @@ -495,10 +387,6 @@ namespace Kyoo.Postgresql.Migrations .HasColumnName("id") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - b.Property("ForPeople") - .HasColumnType("boolean") - .HasColumnName("for_people"); - b.Property("PeopleID") .HasColumnType("integer") .HasColumnName("people_id"); @@ -535,9 +423,9 @@ namespace Kyoo.Postgresql.Migrations .HasColumnName("id") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - b.Property("Logo") - .HasColumnType("text") - .HasColumnName("logo"); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); b.Property("LogoExtension") .HasColumnType("text") @@ -574,14 +462,14 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("timestamp without time zone") .HasColumnName("end_date"); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("Overview") .HasColumnType("text") .HasColumnName("overview"); - b.Property("Poster") - .HasColumnType("text") - .HasColumnName("poster"); - b.Property("SeasonNumber") .HasColumnType("integer") .HasColumnName("season_number"); @@ -629,22 +517,18 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("text[]") .HasColumnName("aliases"); - b.Property("Backdrop") - .HasColumnType("text") - .HasColumnName("backdrop"); - b.Property("EndAir") .HasColumnType("timestamp without time zone") .HasColumnName("end_air"); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("IsMovie") .HasColumnType("boolean") .HasColumnName("is_movie"); - b.Property("Logo") - .HasColumnType("text") - .HasColumnName("logo"); - b.Property("Overview") .HasColumnType("text") .HasColumnName("overview"); @@ -653,10 +537,6 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("text") .HasColumnName("path"); - b.Property("Poster") - .HasColumnType("text") - .HasColumnName("poster"); - b.Property("Slug") .IsRequired() .HasColumnType("text") @@ -678,10 +558,6 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("text") .HasColumnName("title"); - b.Property("TrailerUrl") - .HasColumnType("text") - .HasColumnName("trailer_url"); - b.HasKey("ID") .HasName("pk_shows"); @@ -855,6 +731,168 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("watched_episodes"); }); + modelBuilder.Entity("collection_metadata_id", b => + { + b.Property("ResourceID") + .HasColumnType("integer") + .HasColumnName("resource_id"); + + b.Property("ProviderID") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.Property("DataID") + .HasColumnType("text") + .HasColumnName("data_id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link"); + + b.HasKey("ResourceID", "ProviderID") + .HasName("pk_collection_metadata_id"); + + b.HasIndex("ProviderID") + .HasDatabaseName("ix_collection_metadata_id_provider_id"); + + b.ToTable("collection_metadata_id"); + }); + + modelBuilder.Entity("episode_metadata_id", b => + { + b.Property("ResourceID") + .HasColumnType("integer") + .HasColumnName("resource_id"); + + b.Property("ProviderID") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.Property("DataID") + .HasColumnType("text") + .HasColumnName("data_id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link"); + + b.HasKey("ResourceID", "ProviderID") + .HasName("pk_episode_metadata_id"); + + b.HasIndex("ProviderID") + .HasDatabaseName("ix_episode_metadata_id_provider_id"); + + b.ToTable("episode_metadata_id"); + }); + + modelBuilder.Entity("people_metadata_id", b => + { + b.Property("ResourceID") + .HasColumnType("integer") + .HasColumnName("resource_id"); + + b.Property("ProviderID") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.Property("DataID") + .HasColumnType("text") + .HasColumnName("data_id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link"); + + b.HasKey("ResourceID", "ProviderID") + .HasName("pk_people_metadata_id"); + + b.HasIndex("ProviderID") + .HasDatabaseName("ix_people_metadata_id_provider_id"); + + b.ToTable("people_metadata_id"); + }); + + modelBuilder.Entity("season_metadata_id", b => + { + b.Property("ResourceID") + .HasColumnType("integer") + .HasColumnName("resource_id"); + + b.Property("ProviderID") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.Property("DataID") + .HasColumnType("text") + .HasColumnName("data_id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link"); + + b.HasKey("ResourceID", "ProviderID") + .HasName("pk_season_metadata_id"); + + b.HasIndex("ProviderID") + .HasDatabaseName("ix_season_metadata_id_provider_id"); + + b.ToTable("season_metadata_id"); + }); + + modelBuilder.Entity("show_metadata_id", b => + { + b.Property("ResourceID") + .HasColumnType("integer") + .HasColumnName("resource_id"); + + b.Property("ProviderID") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.Property("DataID") + .HasColumnType("text") + .HasColumnName("data_id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link"); + + b.HasKey("ResourceID", "ProviderID") + .HasName("pk_show_metadata_id"); + + b.HasIndex("ProviderID") + .HasDatabaseName("ix_show_metadata_id_provider_id"); + + b.ToTable("show_metadata_id"); + }); + + modelBuilder.Entity("studio_metadata_id", b => + { + b.Property("ResourceID") + .HasColumnType("integer") + .HasColumnName("resource_id"); + + b.Property("ProviderID") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.Property("DataID") + .HasColumnType("text") + .HasColumnName("data_id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link"); + + b.HasKey("ResourceID", "ProviderID") + .HasName("pk_studio_metadata_id"); + + b.HasIndex("ProviderID") + .HasDatabaseName("ix_studio_metadata_id_provider_id"); + + b.ToTable("studio_metadata_id"); + }); + modelBuilder.Entity("Kyoo.Models.Episode", b => { b.HasOne("Kyoo.Models.Season", "Season") @@ -1001,90 +1039,6 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Second"); }); - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Episode", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .HasConstraintName("fk_metadata_id_episode_episodes_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .HasConstraintName("fk_metadata_id_episode_providers_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.People", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .HasConstraintName("fk_metadata_id_people_people_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .HasConstraintName("fk_metadata_id_people_providers_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Season", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .HasConstraintName("fk_metadata_id_season_seasons_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .HasConstraintName("fk_metadata_id_season_providers_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Show", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .HasConstraintName("fk_metadata_id_show_shows_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .HasConstraintName("fk_metadata_id_show_providers_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - modelBuilder.Entity("Kyoo.Models.PeopleRole", b => { b.HasOne("Kyoo.Models.People", "People") @@ -1162,8 +1116,124 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Second"); }); + modelBuilder.Entity("collection_metadata_id", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_collection_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Collection", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_collection_metadata_id_collections_collection_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("episode_metadata_id", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_episode_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Episode", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_episode_metadata_id_episodes_episode_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("people_metadata_id", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_people_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.People", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_people_metadata_id_people_people_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("season_metadata_id", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_season_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Season", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_season_metadata_id_seasons_season_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("show_metadata_id", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_show_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_show_metadata_id_shows_show_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("studio_metadata_id", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_studio_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Studio", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_studio_metadata_id_studios_studio_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + modelBuilder.Entity("Kyoo.Models.Collection", b => { + b.Navigation("ExternalIDs"); + b.Navigation("LibraryLinks"); b.Navigation("ShowLinks"); @@ -1228,6 +1298,8 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("Kyoo.Models.Studio", b => { + b.Navigation("ExternalIDs"); + b.Navigation("Shows"); }); diff --git a/Kyoo.Postgresql/Migrations/20210723224326_Initial.cs b/Kyoo.Postgresql/Migrations/20210728141410_Initial.cs similarity index 82% rename from Kyoo.Postgresql/Migrations/20210723224326_Initial.cs rename to Kyoo.Postgresql/Migrations/20210728141410_Initial.cs index 2ba22c6a..46c09222 100644 --- a/Kyoo.Postgresql/Migrations/20210723224326_Initial.cs +++ b/Kyoo.Postgresql/Migrations/20210728141410_Initial.cs @@ -23,7 +23,7 @@ namespace Kyoo.Postgresql.Migrations .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), slug = table.Column(type: "text", nullable: false), name = table.Column(type: "text", nullable: true), - poster = table.Column(type: "text", nullable: true), + images = table.Column>(type: "jsonb", nullable: true), overview = table.Column(type: "text", nullable: true) }, constraints: table => @@ -68,7 +68,7 @@ namespace Kyoo.Postgresql.Migrations .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), slug = table.Column(type: "text", nullable: false), name = table.Column(type: "text", nullable: true), - poster = table.Column(type: "text", nullable: true) + images = table.Column>(type: "jsonb", nullable: true) }, constraints: table => { @@ -83,7 +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), - logo = table.Column(type: "text", nullable: true), + images = table.Column>(type: "jsonb", nullable: true), logo_extension = table.Column(type: "text", nullable: true) }, constraints: table => @@ -147,6 +147,32 @@ namespace Kyoo.Postgresql.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "collection_metadata_id", + columns: table => new + { + resource_id = table.Column(type: "integer", nullable: false), + provider_id = table.Column(type: "integer", nullable: false), + data_id = table.Column(type: "text", nullable: true), + link = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("pk_collection_metadata_id", x => new { x.resource_id, x.provider_id }); + table.ForeignKey( + name: "fk_collection_metadata_id_collections_collection_id", + column: x => x.resource_id, + principalTable: "collections", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "fk_collection_metadata_id_providers_provider_id", + column: x => x.provider_id, + principalTable: "providers", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "link_library_provider", columns: table => new @@ -172,26 +198,26 @@ namespace Kyoo.Postgresql.Migrations }); migrationBuilder.CreateTable( - name: "metadata_id_people", + name: "people_metadata_id", columns: table => new { - first_id = table.Column(type: "integer", nullable: false), - second_id = table.Column(type: "integer", nullable: false), + resource_id = table.Column(type: "integer", nullable: false), + provider_id = table.Column(type: "integer", nullable: false), data_id = table.Column(type: "text", nullable: true), link = table.Column(type: "text", nullable: true) }, constraints: table => { - table.PrimaryKey("pk_metadata_id_people", x => new { x.first_id, x.second_id }); + table.PrimaryKey("pk_people_metadata_id", x => new { x.resource_id, x.provider_id }); table.ForeignKey( - name: "fk_metadata_id_people_people_first_id", - column: x => x.first_id, + name: "fk_people_metadata_id_people_people_id", + column: x => x.resource_id, principalTable: "people", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "fk_metadata_id_people_providers_second_id", - column: x => x.second_id, + name: "fk_people_metadata_id_providers_provider_id", + column: x => x.provider_id, principalTable: "providers", principalColumn: "id", onDelete: ReferentialAction.Cascade); @@ -209,12 +235,9 @@ namespace Kyoo.Postgresql.Migrations path = table.Column(type: "text", nullable: true), overview = table.Column(type: "text", nullable: true), status = table.Column(type: "status", nullable: false), - trailer_url = table.Column(type: "text", nullable: true), start_air = table.Column(type: "timestamp without time zone", nullable: true), end_air = table.Column(type: "timestamp without time zone", nullable: true), - poster = table.Column(type: "text", nullable: true), - logo = table.Column(type: "text", nullable: true), - backdrop = table.Column(type: "text", nullable: true), + images = table.Column>(type: "jsonb", nullable: true), is_movie = table.Column(type: "boolean", nullable: false), studio_id = table.Column(type: "integer", nullable: true) }, @@ -229,6 +252,32 @@ namespace Kyoo.Postgresql.Migrations onDelete: ReferentialAction.SetNull); }); + migrationBuilder.CreateTable( + name: "studio_metadata_id", + columns: table => new + { + resource_id = table.Column(type: "integer", nullable: false), + provider_id = table.Column(type: "integer", nullable: false), + data_id = table.Column(type: "text", nullable: true), + link = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("pk_studio_metadata_id", x => new { x.resource_id, x.provider_id }); + table.ForeignKey( + name: "fk_studio_metadata_id_providers_provider_id", + column: x => x.provider_id, + principalTable: "providers", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "fk_studio_metadata_id_studios_studio_id", + column: x => x.resource_id, + principalTable: "studios", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "link_collection_show", columns: table => new @@ -325,39 +374,12 @@ namespace Kyoo.Postgresql.Migrations onDelete: ReferentialAction.Cascade); }); - migrationBuilder.CreateTable( - name: "metadata_id_show", - columns: table => new - { - first_id = table.Column(type: "integer", nullable: false), - second_id = table.Column(type: "integer", nullable: false), - data_id = table.Column(type: "text", nullable: true), - link = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("pk_metadata_id_show", x => new { x.first_id, x.second_id }); - table.ForeignKey( - name: "fk_metadata_id_show_providers_second_id", - column: x => x.second_id, - principalTable: "providers", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "fk_metadata_id_show_shows_first_id", - column: x => x.first_id, - principalTable: "shows", - principalColumn: "id", - onDelete: ReferentialAction.Cascade); - }); - migrationBuilder.CreateTable( name: "people_roles", columns: table => new { id = table.Column(type: "integer", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - for_people = table.Column(type: "boolean", nullable: false), people_id = table.Column(type: "integer", nullable: false), show_id = table.Column(type: "integer", nullable: false), type = table.Column(type: "text", nullable: true), @@ -393,7 +415,7 @@ namespace Kyoo.Postgresql.Migrations overview = table.Column(type: "text", nullable: true), start_date = table.Column(type: "timestamp without time zone", nullable: true), end_date = table.Column(type: "timestamp without time zone", nullable: true), - poster = table.Column(type: "text", nullable: true) + images = table.Column>(type: "jsonb", nullable: true) }, constraints: table => { @@ -406,6 +428,32 @@ namespace Kyoo.Postgresql.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "show_metadata_id", + columns: table => new + { + resource_id = table.Column(type: "integer", nullable: false), + provider_id = table.Column(type: "integer", nullable: false), + data_id = table.Column(type: "text", nullable: true), + link = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("pk_show_metadata_id", x => new { x.resource_id, x.provider_id }); + table.ForeignKey( + name: "fk_show_metadata_id_providers_provider_id", + column: x => x.provider_id, + principalTable: "providers", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "fk_show_metadata_id_shows_show_id", + column: x => x.resource_id, + principalTable: "shows", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "episodes", columns: table => new @@ -419,7 +467,7 @@ namespace Kyoo.Postgresql.Migrations episode_number = table.Column(type: "integer", nullable: true), absolute_number = table.Column(type: "integer", nullable: true), path = table.Column(type: "text", nullable: true), - thumb = table.Column(type: "text", nullable: true), + images = table.Column>(type: "jsonb", nullable: true), title = table.Column(type: "text", nullable: true), overview = table.Column(type: "text", nullable: true), release_date = table.Column(type: "timestamp without time zone", nullable: true) @@ -442,52 +490,52 @@ namespace Kyoo.Postgresql.Migrations }); migrationBuilder.CreateTable( - name: "metadata_id_season", + name: "season_metadata_id", columns: table => new { - first_id = table.Column(type: "integer", nullable: false), - second_id = table.Column(type: "integer", nullable: false), + resource_id = table.Column(type: "integer", nullable: false), + provider_id = table.Column(type: "integer", nullable: false), data_id = table.Column(type: "text", nullable: true), link = table.Column(type: "text", nullable: true) }, constraints: table => { - table.PrimaryKey("pk_metadata_id_season", x => new { x.first_id, x.second_id }); + table.PrimaryKey("pk_season_metadata_id", x => new { x.resource_id, x.provider_id }); table.ForeignKey( - name: "fk_metadata_id_season_providers_second_id", - column: x => x.second_id, + name: "fk_season_metadata_id_providers_provider_id", + column: x => x.provider_id, principalTable: "providers", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "fk_metadata_id_season_seasons_first_id", - column: x => x.first_id, + name: "fk_season_metadata_id_seasons_season_id", + column: x => x.resource_id, principalTable: "seasons", principalColumn: "id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( - name: "metadata_id_episode", + name: "episode_metadata_id", columns: table => new { - first_id = table.Column(type: "integer", nullable: false), - second_id = table.Column(type: "integer", nullable: false), + resource_id = table.Column(type: "integer", nullable: false), + provider_id = table.Column(type: "integer", nullable: false), data_id = table.Column(type: "text", nullable: true), link = table.Column(type: "text", nullable: true) }, constraints: table => { - table.PrimaryKey("pk_metadata_id_episode", x => new { x.first_id, x.second_id }); + table.PrimaryKey("pk_episode_metadata_id", x => new { x.resource_id, x.provider_id }); table.ForeignKey( - name: "fk_metadata_id_episode_episodes_first_id", - column: x => x.first_id, + name: "fk_episode_metadata_id_episodes_episode_id", + column: x => x.resource_id, principalTable: "episodes", principalColumn: "id", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "fk_metadata_id_episode_providers_second_id", - column: x => x.second_id, + name: "fk_episode_metadata_id_providers_provider_id", + column: x => x.provider_id, principalTable: "providers", principalColumn: "id", onDelete: ReferentialAction.Cascade); @@ -547,12 +595,22 @@ namespace Kyoo.Postgresql.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateIndex( + name: "ix_collection_metadata_id_provider_id", + table: "collection_metadata_id", + column: "provider_id"); + migrationBuilder.CreateIndex( name: "ix_collections_slug", table: "collections", column: "slug", unique: true); + migrationBuilder.CreateIndex( + name: "ix_episode_metadata_id_provider_id", + table: "episode_metadata_id", + column: "provider_id"); + migrationBuilder.CreateIndex( name: "ix_episodes_season_id", table: "episodes", @@ -612,32 +670,17 @@ namespace Kyoo.Postgresql.Migrations table: "link_user_show", column: "second_id"); - migrationBuilder.CreateIndex( - name: "ix_metadata_id_episode_second_id", - table: "metadata_id_episode", - column: "second_id"); - - migrationBuilder.CreateIndex( - name: "ix_metadata_id_people_second_id", - table: "metadata_id_people", - column: "second_id"); - - migrationBuilder.CreateIndex( - name: "ix_metadata_id_season_second_id", - table: "metadata_id_season", - column: "second_id"); - - migrationBuilder.CreateIndex( - name: "ix_metadata_id_show_second_id", - table: "metadata_id_show", - column: "second_id"); - migrationBuilder.CreateIndex( name: "ix_people_slug", table: "people", column: "slug", unique: true); + migrationBuilder.CreateIndex( + name: "ix_people_metadata_id_provider_id", + table: "people_metadata_id", + column: "provider_id"); + migrationBuilder.CreateIndex( name: "ix_people_roles_people_id", table: "people_roles", @@ -654,6 +697,11 @@ namespace Kyoo.Postgresql.Migrations column: "slug", unique: true); + migrationBuilder.CreateIndex( + name: "ix_season_metadata_id_provider_id", + table: "season_metadata_id", + column: "provider_id"); + migrationBuilder.CreateIndex( name: "ix_seasons_show_id_season_number", table: "seasons", @@ -666,6 +714,11 @@ namespace Kyoo.Postgresql.Migrations column: "slug", unique: true); + migrationBuilder.CreateIndex( + name: "ix_show_metadata_id_provider_id", + table: "show_metadata_id", + column: "provider_id"); + migrationBuilder.CreateIndex( name: "ix_shows_slug", table: "shows", @@ -677,6 +730,11 @@ namespace Kyoo.Postgresql.Migrations table: "shows", column: "studio_id"); + migrationBuilder.CreateIndex( + name: "ix_studio_metadata_id_provider_id", + table: "studio_metadata_id", + column: "provider_id"); + migrationBuilder.CreateIndex( name: "ix_studios_slug", table: "studios", @@ -709,6 +767,12 @@ namespace Kyoo.Postgresql.Migrations protected override void Down(MigrationBuilder migrationBuilder) { + migrationBuilder.DropTable( + name: "collection_metadata_id"); + + migrationBuilder.DropTable( + name: "episode_metadata_id"); + migrationBuilder.DropTable( name: "link_collection_show"); @@ -728,20 +792,20 @@ namespace Kyoo.Postgresql.Migrations name: "link_user_show"); migrationBuilder.DropTable( - name: "metadata_id_episode"); - - migrationBuilder.DropTable( - name: "metadata_id_people"); - - migrationBuilder.DropTable( - name: "metadata_id_season"); - - migrationBuilder.DropTable( - name: "metadata_id_show"); + name: "people_metadata_id"); migrationBuilder.DropTable( name: "people_roles"); + migrationBuilder.DropTable( + name: "season_metadata_id"); + + migrationBuilder.DropTable( + name: "show_metadata_id"); + + migrationBuilder.DropTable( + name: "studio_metadata_id"); + migrationBuilder.DropTable( name: "tracks"); @@ -758,10 +822,10 @@ namespace Kyoo.Postgresql.Migrations name: "genres"); migrationBuilder.DropTable( - name: "providers"); + name: "people"); migrationBuilder.DropTable( - name: "people"); + name: "providers"); migrationBuilder.DropTable( name: "episodes"); diff --git a/Kyoo.Postgresql/Migrations/20210723224335_Triggers.Designer.cs b/Kyoo.Postgresql/Migrations/20210728142213_Triggers.Designer.cs similarity index 82% rename from Kyoo.Postgresql/Migrations/20210723224335_Triggers.Designer.cs rename to Kyoo.Postgresql/Migrations/20210728142213_Triggers.Designer.cs index d377a09f..708cd23b 100644 --- a/Kyoo.Postgresql/Migrations/20210723224335_Triggers.Designer.cs +++ b/Kyoo.Postgresql/Migrations/20210728142213_Triggers.Designer.cs @@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace Kyoo.Postgresql.Migrations { [DbContext(typeof(PostgresContext))] - [Migration("20210723224335_Triggers")] + [Migration("20210728142213_Triggers")] partial class Triggers { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -34,6 +34,10 @@ namespace Kyoo.Postgresql.Migrations .HasColumnName("id") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("Name") .HasColumnType("text") .HasColumnName("name"); @@ -42,10 +46,6 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("text") .HasColumnName("overview"); - b.Property("Poster") - .HasColumnType("text") - .HasColumnName("poster"); - b.Property("Slug") .IsRequired() .HasColumnType("text") @@ -77,6 +77,10 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("integer") .HasColumnName("episode_number"); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("Overview") .HasColumnType("text") .HasColumnName("overview"); @@ -106,10 +110,6 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("text") .HasColumnName("slug"); - b.Property("Thumb") - .HasColumnType("text") - .HasColumnName("thumb"); - b.Property("Title") .HasColumnType("text") .HasColumnName("title"); @@ -200,14 +200,14 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("timestamp without time zone") .HasColumnName("end_air"); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("Overview") .HasColumnType("text") .HasColumnName("overview"); - b.Property("Poster") - .HasColumnType("text") - .HasColumnName("poster"); - b.Property("Slug") .HasColumnType("text") .HasColumnName("slug"); @@ -348,114 +348,6 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("link_user_show"); }); - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.Property("DataID") - .HasColumnType("text") - .HasColumnName("data_id"); - - b.Property("Link") - .HasColumnType("text") - .HasColumnName("link"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_metadata_id_episode"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_metadata_id_episode_second_id"); - - b.ToTable("metadata_id_episode"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.Property("DataID") - .HasColumnType("text") - .HasColumnName("data_id"); - - b.Property("Link") - .HasColumnType("text") - .HasColumnName("link"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_metadata_id_people"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_metadata_id_people_second_id"); - - b.ToTable("metadata_id_people"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.Property("DataID") - .HasColumnType("text") - .HasColumnName("data_id"); - - b.Property("Link") - .HasColumnType("text") - .HasColumnName("link"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_metadata_id_season"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_metadata_id_season_second_id"); - - b.ToTable("metadata_id_season"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.Property("DataID") - .HasColumnType("text") - .HasColumnName("data_id"); - - b.Property("Link") - .HasColumnType("text") - .HasColumnName("link"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_metadata_id_show"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_metadata_id_show_second_id"); - - b.ToTable("metadata_id_show"); - }); - modelBuilder.Entity("Kyoo.Models.People", b => { b.Property("ID") @@ -464,14 +356,14 @@ namespace Kyoo.Postgresql.Migrations .HasColumnName("id") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("Name") .HasColumnType("text") .HasColumnName("name"); - b.Property("Poster") - .HasColumnType("text") - .HasColumnName("poster"); - b.Property("Slug") .IsRequired() .HasColumnType("text") @@ -495,10 +387,6 @@ namespace Kyoo.Postgresql.Migrations .HasColumnName("id") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - b.Property("ForPeople") - .HasColumnType("boolean") - .HasColumnName("for_people"); - b.Property("PeopleID") .HasColumnType("integer") .HasColumnName("people_id"); @@ -535,9 +423,9 @@ namespace Kyoo.Postgresql.Migrations .HasColumnName("id") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - b.Property("Logo") - .HasColumnType("text") - .HasColumnName("logo"); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); b.Property("LogoExtension") .HasColumnType("text") @@ -574,14 +462,14 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("timestamp without time zone") .HasColumnName("end_date"); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("Overview") .HasColumnType("text") .HasColumnName("overview"); - b.Property("Poster") - .HasColumnType("text") - .HasColumnName("poster"); - b.Property("SeasonNumber") .HasColumnType("integer") .HasColumnName("season_number"); @@ -629,22 +517,18 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("text[]") .HasColumnName("aliases"); - b.Property("Backdrop") - .HasColumnType("text") - .HasColumnName("backdrop"); - b.Property("EndAir") .HasColumnType("timestamp without time zone") .HasColumnName("end_air"); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("IsMovie") .HasColumnType("boolean") .HasColumnName("is_movie"); - b.Property("Logo") - .HasColumnType("text") - .HasColumnName("logo"); - b.Property("Overview") .HasColumnType("text") .HasColumnName("overview"); @@ -653,10 +537,6 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("text") .HasColumnName("path"); - b.Property("Poster") - .HasColumnType("text") - .HasColumnName("poster"); - b.Property("Slug") .IsRequired() .HasColumnType("text") @@ -678,10 +558,6 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("text") .HasColumnName("title"); - b.Property("TrailerUrl") - .HasColumnType("text") - .HasColumnName("trailer_url"); - b.HasKey("ID") .HasName("pk_shows"); @@ -855,6 +731,168 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("watched_episodes"); }); + modelBuilder.Entity("collection_metadata_id", b => + { + b.Property("ResourceID") + .HasColumnType("integer") + .HasColumnName("resource_id"); + + b.Property("ProviderID") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.Property("DataID") + .HasColumnType("text") + .HasColumnName("data_id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link"); + + b.HasKey("ResourceID", "ProviderID") + .HasName("pk_collection_metadata_id"); + + b.HasIndex("ProviderID") + .HasDatabaseName("ix_collection_metadata_id_provider_id"); + + b.ToTable("collection_metadata_id"); + }); + + modelBuilder.Entity("episode_metadata_id", b => + { + b.Property("ResourceID") + .HasColumnType("integer") + .HasColumnName("resource_id"); + + b.Property("ProviderID") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.Property("DataID") + .HasColumnType("text") + .HasColumnName("data_id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link"); + + b.HasKey("ResourceID", "ProviderID") + .HasName("pk_episode_metadata_id"); + + b.HasIndex("ProviderID") + .HasDatabaseName("ix_episode_metadata_id_provider_id"); + + b.ToTable("episode_metadata_id"); + }); + + modelBuilder.Entity("people_metadata_id", b => + { + b.Property("ResourceID") + .HasColumnType("integer") + .HasColumnName("resource_id"); + + b.Property("ProviderID") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.Property("DataID") + .HasColumnType("text") + .HasColumnName("data_id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link"); + + b.HasKey("ResourceID", "ProviderID") + .HasName("pk_people_metadata_id"); + + b.HasIndex("ProviderID") + .HasDatabaseName("ix_people_metadata_id_provider_id"); + + b.ToTable("people_metadata_id"); + }); + + modelBuilder.Entity("season_metadata_id", b => + { + b.Property("ResourceID") + .HasColumnType("integer") + .HasColumnName("resource_id"); + + b.Property("ProviderID") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.Property("DataID") + .HasColumnType("text") + .HasColumnName("data_id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link"); + + b.HasKey("ResourceID", "ProviderID") + .HasName("pk_season_metadata_id"); + + b.HasIndex("ProviderID") + .HasDatabaseName("ix_season_metadata_id_provider_id"); + + b.ToTable("season_metadata_id"); + }); + + modelBuilder.Entity("show_metadata_id", b => + { + b.Property("ResourceID") + .HasColumnType("integer") + .HasColumnName("resource_id"); + + b.Property("ProviderID") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.Property("DataID") + .HasColumnType("text") + .HasColumnName("data_id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link"); + + b.HasKey("ResourceID", "ProviderID") + .HasName("pk_show_metadata_id"); + + b.HasIndex("ProviderID") + .HasDatabaseName("ix_show_metadata_id_provider_id"); + + b.ToTable("show_metadata_id"); + }); + + modelBuilder.Entity("studio_metadata_id", b => + { + b.Property("ResourceID") + .HasColumnType("integer") + .HasColumnName("resource_id"); + + b.Property("ProviderID") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.Property("DataID") + .HasColumnType("text") + .HasColumnName("data_id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link"); + + b.HasKey("ResourceID", "ProviderID") + .HasName("pk_studio_metadata_id"); + + b.HasIndex("ProviderID") + .HasDatabaseName("ix_studio_metadata_id_provider_id"); + + b.ToTable("studio_metadata_id"); + }); + modelBuilder.Entity("Kyoo.Models.Episode", b => { b.HasOne("Kyoo.Models.Season", "Season") @@ -1001,90 +1039,6 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Second"); }); - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Episode", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .HasConstraintName("fk_metadata_id_episode_episodes_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .HasConstraintName("fk_metadata_id_episode_providers_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.People", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .HasConstraintName("fk_metadata_id_people_people_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .HasConstraintName("fk_metadata_id_people_providers_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Season", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .HasConstraintName("fk_metadata_id_season_seasons_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .HasConstraintName("fk_metadata_id_season_providers_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Show", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .HasConstraintName("fk_metadata_id_show_shows_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .HasConstraintName("fk_metadata_id_show_providers_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - modelBuilder.Entity("Kyoo.Models.PeopleRole", b => { b.HasOne("Kyoo.Models.People", "People") @@ -1162,8 +1116,124 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Second"); }); + modelBuilder.Entity("collection_metadata_id", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_collection_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Collection", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_collection_metadata_id_collections_collection_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("episode_metadata_id", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_episode_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Episode", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_episode_metadata_id_episodes_episode_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("people_metadata_id", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_people_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.People", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_people_metadata_id_people_people_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("season_metadata_id", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_season_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Season", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_season_metadata_id_seasons_season_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("show_metadata_id", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_show_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_show_metadata_id_shows_show_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("studio_metadata_id", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_studio_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Studio", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_studio_metadata_id_studios_studio_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + modelBuilder.Entity("Kyoo.Models.Collection", b => { + b.Navigation("ExternalIDs"); + b.Navigation("LibraryLinks"); b.Navigation("ShowLinks"); @@ -1228,6 +1298,8 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("Kyoo.Models.Studio", b => { + b.Navigation("ExternalIDs"); + b.Navigation("Shows"); }); diff --git a/Kyoo.Postgresql/Migrations/20210723224335_Triggers.cs b/Kyoo.Postgresql/Migrations/20210728142213_Triggers.cs similarity index 98% rename from Kyoo.Postgresql/Migrations/20210723224335_Triggers.cs rename to Kyoo.Postgresql/Migrations/20210728142213_Triggers.cs index a773e02b..d1933171 100644 --- a/Kyoo.Postgresql/Migrations/20210723224335_Triggers.cs +++ b/Kyoo.Postgresql/Migrations/20210728142213_Triggers.cs @@ -141,7 +141,7 @@ namespace Kyoo.Postgresql.Migrations // language=PostgreSQL migrationBuilder.Sql(@" CREATE VIEW library_items AS - SELECT s.id, s.slug, s.title, s.overview, s.status, s.start_air, s.end_air, s.poster, CASE + SELECT s.id, s.slug, s.title, s.overview, s.status, s.start_air, s.end_air, s.images, CASE WHEN s.is_movie THEN 'movie'::item_type ELSE 'show'::item_type END AS type @@ -153,7 +153,7 @@ namespace Kyoo.Postgresql.Migrations WHERE s.id = l.second_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.poster, 'collection'::item_type AS type + NULL AS start_air, NULL AS end_air, c0.images, 'collection'::item_type AS type FROM collections AS c0"); } diff --git a/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs b/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs index f2d55f24..f7db32a7 100644 --- a/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs +++ b/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs @@ -32,6 +32,10 @@ namespace Kyoo.Postgresql.Migrations .HasColumnName("id") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("Name") .HasColumnType("text") .HasColumnName("name"); @@ -40,10 +44,6 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("text") .HasColumnName("overview"); - b.Property("Poster") - .HasColumnType("text") - .HasColumnName("poster"); - b.Property("Slug") .IsRequired() .HasColumnType("text") @@ -75,6 +75,10 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("integer") .HasColumnName("episode_number"); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("Overview") .HasColumnType("text") .HasColumnName("overview"); @@ -104,10 +108,6 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("text") .HasColumnName("slug"); - b.Property("Thumb") - .HasColumnType("text") - .HasColumnName("thumb"); - b.Property("Title") .HasColumnType("text") .HasColumnName("title"); @@ -198,14 +198,14 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("timestamp without time zone") .HasColumnName("end_air"); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("Overview") .HasColumnType("text") .HasColumnName("overview"); - b.Property("Poster") - .HasColumnType("text") - .HasColumnName("poster"); - b.Property("Slug") .HasColumnType("text") .HasColumnName("slug"); @@ -346,114 +346,6 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("link_user_show"); }); - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.Property("DataID") - .HasColumnType("text") - .HasColumnName("data_id"); - - b.Property("Link") - .HasColumnType("text") - .HasColumnName("link"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_metadata_id_episode"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_metadata_id_episode_second_id"); - - b.ToTable("metadata_id_episode"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.Property("DataID") - .HasColumnType("text") - .HasColumnName("data_id"); - - b.Property("Link") - .HasColumnType("text") - .HasColumnName("link"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_metadata_id_people"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_metadata_id_people_second_id"); - - b.ToTable("metadata_id_people"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.Property("DataID") - .HasColumnType("text") - .HasColumnName("data_id"); - - b.Property("Link") - .HasColumnType("text") - .HasColumnName("link"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_metadata_id_season"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_metadata_id_season_second_id"); - - b.ToTable("metadata_id_season"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("integer") - .HasColumnName("first_id"); - - b.Property("SecondID") - .HasColumnType("integer") - .HasColumnName("second_id"); - - b.Property("DataID") - .HasColumnType("text") - .HasColumnName("data_id"); - - b.Property("Link") - .HasColumnType("text") - .HasColumnName("link"); - - b.HasKey("FirstID", "SecondID") - .HasName("pk_metadata_id_show"); - - b.HasIndex("SecondID") - .HasDatabaseName("ix_metadata_id_show_second_id"); - - b.ToTable("metadata_id_show"); - }); - modelBuilder.Entity("Kyoo.Models.People", b => { b.Property("ID") @@ -462,14 +354,14 @@ namespace Kyoo.Postgresql.Migrations .HasColumnName("id") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("Name") .HasColumnType("text") .HasColumnName("name"); - b.Property("Poster") - .HasColumnType("text") - .HasColumnName("poster"); - b.Property("Slug") .IsRequired() .HasColumnType("text") @@ -493,10 +385,6 @@ namespace Kyoo.Postgresql.Migrations .HasColumnName("id") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - b.Property("ForPeople") - .HasColumnType("boolean") - .HasColumnName("for_people"); - b.Property("PeopleID") .HasColumnType("integer") .HasColumnName("people_id"); @@ -533,9 +421,9 @@ namespace Kyoo.Postgresql.Migrations .HasColumnName("id") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - b.Property("Logo") - .HasColumnType("text") - .HasColumnName("logo"); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); b.Property("LogoExtension") .HasColumnType("text") @@ -572,14 +460,14 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("timestamp without time zone") .HasColumnName("end_date"); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("Overview") .HasColumnType("text") .HasColumnName("overview"); - b.Property("Poster") - .HasColumnType("text") - .HasColumnName("poster"); - b.Property("SeasonNumber") .HasColumnType("integer") .HasColumnName("season_number"); @@ -627,22 +515,18 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("text[]") .HasColumnName("aliases"); - b.Property("Backdrop") - .HasColumnType("text") - .HasColumnName("backdrop"); - b.Property("EndAir") .HasColumnType("timestamp without time zone") .HasColumnName("end_air"); + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + b.Property("IsMovie") .HasColumnType("boolean") .HasColumnName("is_movie"); - b.Property("Logo") - .HasColumnType("text") - .HasColumnName("logo"); - b.Property("Overview") .HasColumnType("text") .HasColumnName("overview"); @@ -651,10 +535,6 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("text") .HasColumnName("path"); - b.Property("Poster") - .HasColumnType("text") - .HasColumnName("poster"); - b.Property("Slug") .IsRequired() .HasColumnType("text") @@ -676,10 +556,6 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("text") .HasColumnName("title"); - b.Property("TrailerUrl") - .HasColumnType("text") - .HasColumnName("trailer_url"); - b.HasKey("ID") .HasName("pk_shows"); @@ -853,6 +729,168 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("watched_episodes"); }); + modelBuilder.Entity("collection_metadata_id", b => + { + b.Property("ResourceID") + .HasColumnType("integer") + .HasColumnName("resource_id"); + + b.Property("ProviderID") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.Property("DataID") + .HasColumnType("text") + .HasColumnName("data_id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link"); + + b.HasKey("ResourceID", "ProviderID") + .HasName("pk_collection_metadata_id"); + + b.HasIndex("ProviderID") + .HasDatabaseName("ix_collection_metadata_id_provider_id"); + + b.ToTable("collection_metadata_id"); + }); + + modelBuilder.Entity("episode_metadata_id", b => + { + b.Property("ResourceID") + .HasColumnType("integer") + .HasColumnName("resource_id"); + + b.Property("ProviderID") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.Property("DataID") + .HasColumnType("text") + .HasColumnName("data_id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link"); + + b.HasKey("ResourceID", "ProviderID") + .HasName("pk_episode_metadata_id"); + + b.HasIndex("ProviderID") + .HasDatabaseName("ix_episode_metadata_id_provider_id"); + + b.ToTable("episode_metadata_id"); + }); + + modelBuilder.Entity("people_metadata_id", b => + { + b.Property("ResourceID") + .HasColumnType("integer") + .HasColumnName("resource_id"); + + b.Property("ProviderID") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.Property("DataID") + .HasColumnType("text") + .HasColumnName("data_id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link"); + + b.HasKey("ResourceID", "ProviderID") + .HasName("pk_people_metadata_id"); + + b.HasIndex("ProviderID") + .HasDatabaseName("ix_people_metadata_id_provider_id"); + + b.ToTable("people_metadata_id"); + }); + + modelBuilder.Entity("season_metadata_id", b => + { + b.Property("ResourceID") + .HasColumnType("integer") + .HasColumnName("resource_id"); + + b.Property("ProviderID") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.Property("DataID") + .HasColumnType("text") + .HasColumnName("data_id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link"); + + b.HasKey("ResourceID", "ProviderID") + .HasName("pk_season_metadata_id"); + + b.HasIndex("ProviderID") + .HasDatabaseName("ix_season_metadata_id_provider_id"); + + b.ToTable("season_metadata_id"); + }); + + modelBuilder.Entity("show_metadata_id", b => + { + b.Property("ResourceID") + .HasColumnType("integer") + .HasColumnName("resource_id"); + + b.Property("ProviderID") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.Property("DataID") + .HasColumnType("text") + .HasColumnName("data_id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link"); + + b.HasKey("ResourceID", "ProviderID") + .HasName("pk_show_metadata_id"); + + b.HasIndex("ProviderID") + .HasDatabaseName("ix_show_metadata_id_provider_id"); + + b.ToTable("show_metadata_id"); + }); + + modelBuilder.Entity("studio_metadata_id", b => + { + b.Property("ResourceID") + .HasColumnType("integer") + .HasColumnName("resource_id"); + + b.Property("ProviderID") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.Property("DataID") + .HasColumnType("text") + .HasColumnName("data_id"); + + b.Property("Link") + .HasColumnType("text") + .HasColumnName("link"); + + b.HasKey("ResourceID", "ProviderID") + .HasName("pk_studio_metadata_id"); + + b.HasIndex("ProviderID") + .HasDatabaseName("ix_studio_metadata_id_provider_id"); + + b.ToTable("studio_metadata_id"); + }); + modelBuilder.Entity("Kyoo.Models.Episode", b => { b.HasOne("Kyoo.Models.Season", "Season") @@ -999,90 +1037,6 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Second"); }); - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Episode", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .HasConstraintName("fk_metadata_id_episode_episodes_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .HasConstraintName("fk_metadata_id_episode_providers_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.People", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .HasConstraintName("fk_metadata_id_people_people_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .HasConstraintName("fk_metadata_id_people_providers_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Season", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .HasConstraintName("fk_metadata_id_season_seasons_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .HasConstraintName("fk_metadata_id_season_providers_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Show", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .HasConstraintName("fk_metadata_id_show_shows_first_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .HasConstraintName("fk_metadata_id_show_providers_second_id") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - modelBuilder.Entity("Kyoo.Models.PeopleRole", b => { b.HasOne("Kyoo.Models.People", "People") @@ -1160,8 +1114,124 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Second"); }); + modelBuilder.Entity("collection_metadata_id", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_collection_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Collection", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_collection_metadata_id_collections_collection_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("episode_metadata_id", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_episode_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Episode", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_episode_metadata_id_episodes_episode_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("people_metadata_id", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_people_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.People", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_people_metadata_id_people_people_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("season_metadata_id", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_season_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Season", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_season_metadata_id_seasons_season_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("show_metadata_id", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_show_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_show_metadata_id_shows_show_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("studio_metadata_id", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_studio_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Studio", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_studio_metadata_id_studios_studio_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + modelBuilder.Entity("Kyoo.Models.Collection", b => { + b.Navigation("ExternalIDs"); + b.Navigation("LibraryLinks"); b.Navigation("ShowLinks"); @@ -1226,6 +1296,8 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("Kyoo.Models.Studio", b => { + b.Navigation("ExternalIDs"); + b.Navigation("Shows"); }); diff --git a/Kyoo.Postgresql/PostgresContext.cs b/Kyoo.Postgresql/PostgresContext.cs index b0e534ed..09f460bc 100644 --- a/Kyoo.Postgresql/PostgresContext.cs +++ b/Kyoo.Postgresql/PostgresContext.cs @@ -1,6 +1,8 @@ using System; +using System.Globalization; using System.Linq.Expressions; using System.Reflection; +using EFCore.NamingConventions.Internal; using Kyoo.Models; using Microsoft.EntityFrameworkCore; using Npgsql; @@ -99,9 +101,38 @@ namespace Kyoo.Postgresql .Property(x => x.ExtraData) .HasColumnType("jsonb"); + modelBuilder.Entity() + .Property(x => x.Images) + .HasColumnType("jsonb"); + modelBuilder.Entity() + .Property(x => x.Images) + .HasColumnType("jsonb"); + modelBuilder.Entity() + .Property(x => x.Images) + .HasColumnType("jsonb"); + modelBuilder.Entity() + .Property(x => x.Images) + .HasColumnType("jsonb"); + modelBuilder.Entity() + .Property(x => x.Images) + .HasColumnType("jsonb"); + modelBuilder.Entity() + .Property(x => x.Images) + .HasColumnType("jsonb"); + modelBuilder.Entity() + .Property(x => x.Images) + .HasColumnType("jsonb"); + base.OnModelCreating(modelBuilder); } + /// + protected override string MetadataName() + { + SnakeCaseNameRewriter rewriter = new(CultureInfo.InvariantCulture); + return rewriter.RewriteName(typeof(T).Name + nameof(MetadataID)); + } + /// protected override bool IsDuplicateException(Exception ex) { diff --git a/Kyoo.SqLite/Migrations/20210723224542_Initial.Designer.cs b/Kyoo.SqLite/Migrations/20210728134952_Initial.Designer.cs similarity index 84% rename from Kyoo.SqLite/Migrations/20210723224542_Initial.Designer.cs rename to Kyoo.SqLite/Migrations/20210728134952_Initial.Designer.cs index eca501eb..3f4290b7 100644 --- a/Kyoo.SqLite/Migrations/20210723224542_Initial.Designer.cs +++ b/Kyoo.SqLite/Migrations/20210728134952_Initial.Designer.cs @@ -9,7 +9,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace Kyoo.SqLite.Migrations { [DbContext(typeof(SqLiteContext))] - [Migration("20210723224542_Initial")] + [Migration("20210728134952_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -18,21 +18,63 @@ namespace Kyoo.SqLite.Migrations modelBuilder .HasAnnotation("ProductVersion", "5.0.8"); + modelBuilder.Entity("CollectionMetadataID", b => + { + b.Property("ResourceID") + .HasColumnType("INTEGER"); + + b.Property("ProviderID") + .HasColumnType("INTEGER"); + + b.Property("DataID") + .HasColumnType("TEXT"); + + b.Property("Link") + .HasColumnType("TEXT"); + + b.HasKey("ResourceID", "ProviderID"); + + b.HasIndex("ProviderID"); + + b.ToTable("CollectionMetadataID"); + }); + + modelBuilder.Entity("EpisodeMetadataID", b => + { + b.Property("ResourceID") + .HasColumnType("INTEGER"); + + b.Property("ProviderID") + .HasColumnType("INTEGER"); + + b.Property("DataID") + .HasColumnType("TEXT"); + + b.Property("Link") + .HasColumnType("TEXT"); + + b.HasKey("ResourceID", "ProviderID"); + + b.HasIndex("ProviderID"); + + b.ToTable("EpisodeMetadataID"); + }); + modelBuilder.Entity("Kyoo.Models.Collection", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); + b.Property("Images") + .HasColumnType("TEXT"); + b.Property("Name") .HasColumnType("TEXT"); b.Property("Overview") .HasColumnType("TEXT"); - b.Property("Poster") - .HasColumnType("TEXT"); - b.Property("Slug") .IsRequired() .HasColumnType("TEXT"); @@ -57,6 +99,9 @@ namespace Kyoo.SqLite.Migrations b.Property("EpisodeNumber") .HasColumnType("INTEGER"); + b.Property("Images") + .HasColumnType("TEXT"); + b.Property("Overview") .HasColumnType("TEXT"); @@ -79,9 +124,6 @@ namespace Kyoo.SqLite.Migrations .ValueGeneratedOnAddOrUpdate() .HasColumnType("TEXT"); - b.Property("Thumb") - .HasColumnType("TEXT"); - b.Property("Title") .HasColumnType("TEXT"); @@ -152,10 +194,10 @@ namespace Kyoo.SqLite.Migrations b.Property("EndAir") .HasColumnType("TEXT"); - b.Property("Overview") + b.Property("Images") .HasColumnType("TEXT"); - b.Property("Poster") + b.Property("Overview") .HasColumnType("TEXT"); b.Property("Slug") @@ -268,100 +310,16 @@ namespace Kyoo.SqLite.Migrations b.ToTable("Link"); }); - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.Property("DataID") - .HasColumnType("TEXT"); - - b.Property("Link") - .HasColumnType("TEXT"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("MetadataID"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.Property("DataID") - .HasColumnType("TEXT"); - - b.Property("Link") - .HasColumnType("TEXT"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("MetadataID"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.Property("DataID") - .HasColumnType("TEXT"); - - b.Property("Link") - .HasColumnType("TEXT"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("MetadataID"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.Property("DataID") - .HasColumnType("TEXT"); - - b.Property("Link") - .HasColumnType("TEXT"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("MetadataID"); - }); - modelBuilder.Entity("Kyoo.Models.People", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); - b.Property("Name") + b.Property("Images") .HasColumnType("TEXT"); - b.Property("Poster") + b.Property("Name") .HasColumnType("TEXT"); b.Property("Slug") @@ -382,9 +340,6 @@ namespace Kyoo.SqLite.Migrations .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); - b.Property("ForPeople") - .HasColumnType("INTEGER"); - b.Property("PeopleID") .HasColumnType("INTEGER"); @@ -412,7 +367,7 @@ namespace Kyoo.SqLite.Migrations .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); - b.Property("Logo") + b.Property("Images") .HasColumnType("TEXT"); b.Property("LogoExtension") @@ -442,10 +397,10 @@ namespace Kyoo.SqLite.Migrations b.Property("EndDate") .HasColumnType("TEXT"); - b.Property("Overview") + b.Property("Images") .HasColumnType("TEXT"); - b.Property("Poster") + b.Property("Overview") .HasColumnType("TEXT"); b.Property("SeasonNumber") @@ -484,27 +439,21 @@ namespace Kyoo.SqLite.Migrations b.Property("Aliases") .HasColumnType("TEXT"); - b.Property("Backdrop") + b.Property("EndAir") .HasColumnType("TEXT"); - b.Property("EndAir") + b.Property("Images") .HasColumnType("TEXT"); b.Property("IsMovie") .HasColumnType("INTEGER"); - b.Property("Logo") - .HasColumnType("TEXT"); - b.Property("Overview") .HasColumnType("TEXT"); b.Property("Path") .HasColumnType("TEXT"); - b.Property("Poster") - .HasColumnType("TEXT"); - b.Property("Slug") .IsRequired() .HasColumnType("TEXT"); @@ -521,9 +470,6 @@ namespace Kyoo.SqLite.Migrations b.Property("Title") .HasColumnType("TEXT"); - b.Property("TrailerUrl") - .HasColumnType("TEXT"); - b.HasKey("ID"); b.HasIndex("Slug") @@ -657,6 +603,124 @@ namespace Kyoo.SqLite.Migrations b.ToTable("WatchedEpisodes"); }); + modelBuilder.Entity("PeopleMetadataID", b => + { + b.Property("ResourceID") + .HasColumnType("INTEGER"); + + b.Property("ProviderID") + .HasColumnType("INTEGER"); + + b.Property("DataID") + .HasColumnType("TEXT"); + + b.Property("Link") + .HasColumnType("TEXT"); + + b.HasKey("ResourceID", "ProviderID"); + + b.HasIndex("ProviderID"); + + b.ToTable("PeopleMetadataID"); + }); + + modelBuilder.Entity("SeasonMetadataID", b => + { + b.Property("ResourceID") + .HasColumnType("INTEGER"); + + b.Property("ProviderID") + .HasColumnType("INTEGER"); + + b.Property("DataID") + .HasColumnType("TEXT"); + + b.Property("Link") + .HasColumnType("TEXT"); + + b.HasKey("ResourceID", "ProviderID"); + + b.HasIndex("ProviderID"); + + b.ToTable("SeasonMetadataID"); + }); + + modelBuilder.Entity("ShowMetadataID", b => + { + b.Property("ResourceID") + .HasColumnType("INTEGER"); + + b.Property("ProviderID") + .HasColumnType("INTEGER"); + + b.Property("DataID") + .HasColumnType("TEXT"); + + b.Property("Link") + .HasColumnType("TEXT"); + + b.HasKey("ResourceID", "ProviderID"); + + b.HasIndex("ProviderID"); + + b.ToTable("ShowMetadataID"); + }); + + modelBuilder.Entity("StudioMetadataID", b => + { + b.Property("ResourceID") + .HasColumnType("INTEGER"); + + b.Property("ProviderID") + .HasColumnType("INTEGER"); + + b.Property("DataID") + .HasColumnType("TEXT"); + + b.Property("Link") + .HasColumnType("TEXT"); + + b.HasKey("ResourceID", "ProviderID"); + + b.HasIndex("ProviderID"); + + b.ToTable("StudioMetadataID"); + }); + + modelBuilder.Entity("CollectionMetadataID", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Collection", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("EpisodeMetadataID", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Episode", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + modelBuilder.Entity("Kyoo.Models.Episode", b => { b.HasOne("Kyoo.Models.Season", "Season") @@ -789,82 +853,6 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Second"); }); - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Episode", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.People", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Season", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Show", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "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") @@ -935,8 +923,78 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Second"); }); + modelBuilder.Entity("PeopleMetadataID", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.People", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("SeasonMetadataID", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Season", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("ShowMetadataID", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("StudioMetadataID", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Studio", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + modelBuilder.Entity("Kyoo.Models.Collection", b => { + b.Navigation("ExternalIDs"); + b.Navigation("LibraryLinks"); b.Navigation("ShowLinks"); @@ -1001,6 +1059,8 @@ namespace Kyoo.SqLite.Migrations modelBuilder.Entity("Kyoo.Models.Studio", b => { + b.Navigation("ExternalIDs"); + b.Navigation("Shows"); }); diff --git a/Kyoo.SqLite/Migrations/20210723224542_Initial.cs b/Kyoo.SqLite/Migrations/20210728134952_Initial.cs similarity index 82% rename from Kyoo.SqLite/Migrations/20210723224542_Initial.cs rename to Kyoo.SqLite/Migrations/20210728134952_Initial.cs index 1fa93860..b0567f79 100644 --- a/Kyoo.SqLite/Migrations/20210723224542_Initial.cs +++ b/Kyoo.SqLite/Migrations/20210728134952_Initial.cs @@ -15,7 +15,7 @@ namespace Kyoo.SqLite.Migrations .Annotation("Sqlite:Autoincrement", true), Slug = table.Column(type: "TEXT", nullable: false), Name = table.Column(type: "TEXT", nullable: true), - Poster = table.Column(type: "TEXT", nullable: true), + Images = table.Column(type: "TEXT", nullable: true), Overview = table.Column(type: "TEXT", nullable: true) }, constraints: table => @@ -60,7 +60,7 @@ namespace Kyoo.SqLite.Migrations .Annotation("Sqlite:Autoincrement", true), Slug = table.Column(type: "TEXT", nullable: false), Name = table.Column(type: "TEXT", nullable: true), - Poster = table.Column(type: "TEXT", nullable: true) + Images = table.Column(type: "TEXT", nullable: true) }, constraints: table => { @@ -75,7 +75,7 @@ namespace Kyoo.SqLite.Migrations .Annotation("Sqlite:Autoincrement", true), Slug = table.Column(type: "TEXT", nullable: false), Name = table.Column(type: "TEXT", nullable: true), - Logo = table.Column(type: "TEXT", nullable: true), + Images = table.Column(type: "TEXT", nullable: true), LogoExtension = table.Column(type: "TEXT", nullable: true) }, constraints: table => @@ -139,6 +139,32 @@ namespace Kyoo.SqLite.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "CollectionMetadataID", + columns: table => new + { + ResourceID = table.Column(type: "INTEGER", nullable: false), + ProviderID = table.Column(type: "INTEGER", nullable: false), + DataID = table.Column(type: "TEXT", nullable: true), + Link = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_CollectionMetadataID", x => new { x.ResourceID, x.ProviderID }); + table.ForeignKey( + name: "FK_CollectionMetadataID_Collections_ResourceID", + column: x => x.ResourceID, + principalTable: "Collections", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_CollectionMetadataID_Providers_ProviderID", + column: x => x.ProviderID, + principalTable: "Providers", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "Link", columns: table => new @@ -164,26 +190,26 @@ namespace Kyoo.SqLite.Migrations }); migrationBuilder.CreateTable( - name: "MetadataID", + name: "PeopleMetadataID", columns: table => new { - FirstID = table.Column(type: "INTEGER", nullable: false), - SecondID = table.Column(type: "INTEGER", nullable: false), + ResourceID = table.Column(type: "INTEGER", nullable: false), + ProviderID = table.Column(type: "INTEGER", nullable: false), DataID = table.Column(type: "TEXT", nullable: true), Link = table.Column(type: "TEXT", nullable: true) }, constraints: table => { - table.PrimaryKey("PK_MetadataID", x => new { x.FirstID, x.SecondID }); + table.PrimaryKey("PK_PeopleMetadataID", x => new { x.ResourceID, x.ProviderID }); table.ForeignKey( - name: "FK_MetadataID_People_FirstID", - column: x => x.FirstID, + name: "FK_PeopleMetadataID_People_ResourceID", + column: x => x.ResourceID, principalTable: "People", principalColumn: "ID", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "FK_MetadataID_Providers_SecondID", - column: x => x.SecondID, + name: "FK_PeopleMetadataID_Providers_ProviderID", + column: x => x.ProviderID, principalTable: "Providers", principalColumn: "ID", onDelete: ReferentialAction.Cascade); @@ -201,12 +227,9 @@ namespace Kyoo.SqLite.Migrations Path = table.Column(type: "TEXT", nullable: true), Overview = table.Column(type: "TEXT", nullable: true), Status = table.Column(type: "INTEGER", nullable: false), - TrailerUrl = table.Column(type: "TEXT", nullable: true), StartAir = table.Column(type: "TEXT", nullable: true), EndAir = table.Column(type: "TEXT", nullable: true), - Poster = table.Column(type: "TEXT", nullable: true), - Logo = table.Column(type: "TEXT", nullable: true), - Backdrop = table.Column(type: "TEXT", nullable: true), + Images = table.Column(type: "TEXT", nullable: true), IsMovie = table.Column(type: "INTEGER", nullable: false), StudioID = table.Column(type: "INTEGER", nullable: true) }, @@ -221,6 +244,32 @@ namespace Kyoo.SqLite.Migrations onDelete: ReferentialAction.SetNull); }); + migrationBuilder.CreateTable( + name: "StudioMetadataID", + columns: table => new + { + ResourceID = table.Column(type: "INTEGER", nullable: false), + ProviderID = table.Column(type: "INTEGER", nullable: false), + DataID = table.Column(type: "TEXT", nullable: true), + Link = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_StudioMetadataID", x => new { x.ResourceID, x.ProviderID }); + table.ForeignKey( + name: "FK_StudioMetadataID_Providers_ProviderID", + column: x => x.ProviderID, + principalTable: "Providers", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_StudioMetadataID_Studios_ResourceID", + column: x => x.ResourceID, + principalTable: "Studios", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "Link", columns: table => new @@ -317,39 +366,12 @@ namespace Kyoo.SqLite.Migrations onDelete: ReferentialAction.Cascade); }); - migrationBuilder.CreateTable( - name: "MetadataID", - columns: table => new - { - FirstID = table.Column(type: "INTEGER", nullable: false), - SecondID = table.Column(type: "INTEGER", nullable: false), - DataID = table.Column(type: "TEXT", nullable: true), - Link = table.Column(type: "TEXT", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_MetadataID", x => new { x.FirstID, x.SecondID }); - table.ForeignKey( - name: "FK_MetadataID_Providers_SecondID", - column: x => x.SecondID, - principalTable: "Providers", - principalColumn: "ID", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_MetadataID_Shows_FirstID", - column: x => x.FirstID, - principalTable: "Shows", - principalColumn: "ID", - onDelete: ReferentialAction.Cascade); - }); - migrationBuilder.CreateTable( name: "PeopleRoles", columns: table => new { ID = table.Column(type: "INTEGER", nullable: false) .Annotation("Sqlite:Autoincrement", true), - ForPeople = table.Column(type: "INTEGER", nullable: false), PeopleID = table.Column(type: "INTEGER", nullable: false), ShowID = table.Column(type: "INTEGER", nullable: false), Type = table.Column(type: "TEXT", nullable: true), @@ -385,7 +407,7 @@ namespace Kyoo.SqLite.Migrations Overview = table.Column(type: "TEXT", nullable: true), StartDate = table.Column(type: "TEXT", nullable: true), EndDate = table.Column(type: "TEXT", nullable: true), - Poster = table.Column(type: "TEXT", nullable: true) + Images = table.Column(type: "TEXT", nullable: true) }, constraints: table => { @@ -398,6 +420,32 @@ namespace Kyoo.SqLite.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "ShowMetadataID", + columns: table => new + { + ResourceID = table.Column(type: "INTEGER", nullable: false), + ProviderID = table.Column(type: "INTEGER", nullable: false), + DataID = table.Column(type: "TEXT", nullable: true), + Link = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ShowMetadataID", x => new { x.ResourceID, x.ProviderID }); + table.ForeignKey( + name: "FK_ShowMetadataID_Providers_ProviderID", + column: x => x.ProviderID, + principalTable: "Providers", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ShowMetadataID_Shows_ResourceID", + column: x => x.ResourceID, + principalTable: "Shows", + principalColumn: "ID", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "Episodes", columns: table => new @@ -411,7 +459,7 @@ namespace Kyoo.SqLite.Migrations EpisodeNumber = table.Column(type: "INTEGER", nullable: true), AbsoluteNumber = table.Column(type: "INTEGER", nullable: true), Path = table.Column(type: "TEXT", nullable: true), - Thumb = table.Column(type: "TEXT", nullable: true), + Images = table.Column(type: "TEXT", nullable: true), Title = table.Column(type: "TEXT", nullable: true), Overview = table.Column(type: "TEXT", nullable: true), ReleaseDate = table.Column(type: "TEXT", nullable: true) @@ -434,52 +482,52 @@ namespace Kyoo.SqLite.Migrations }); migrationBuilder.CreateTable( - name: "MetadataID", + name: "SeasonMetadataID", columns: table => new { - FirstID = table.Column(type: "INTEGER", nullable: false), - SecondID = table.Column(type: "INTEGER", nullable: false), + ResourceID = table.Column(type: "INTEGER", nullable: false), + ProviderID = table.Column(type: "INTEGER", nullable: false), DataID = table.Column(type: "TEXT", nullable: true), Link = table.Column(type: "TEXT", nullable: true) }, constraints: table => { - table.PrimaryKey("PK_MetadataID", x => new { x.FirstID, x.SecondID }); + table.PrimaryKey("PK_SeasonMetadataID", x => new { x.ResourceID, x.ProviderID }); table.ForeignKey( - name: "FK_MetadataID_Providers_SecondID", - column: x => x.SecondID, + name: "FK_SeasonMetadataID_Providers_ProviderID", + column: x => x.ProviderID, principalTable: "Providers", principalColumn: "ID", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "FK_MetadataID_Seasons_FirstID", - column: x => x.FirstID, + name: "FK_SeasonMetadataID_Seasons_ResourceID", + column: x => x.ResourceID, principalTable: "Seasons", principalColumn: "ID", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( - name: "MetadataID", + name: "EpisodeMetadataID", columns: table => new { - FirstID = table.Column(type: "INTEGER", nullable: false), - SecondID = table.Column(type: "INTEGER", nullable: false), + ResourceID = table.Column(type: "INTEGER", nullable: false), + ProviderID = table.Column(type: "INTEGER", nullable: false), DataID = table.Column(type: "TEXT", nullable: true), Link = table.Column(type: "TEXT", nullable: true) }, constraints: table => { - table.PrimaryKey("PK_MetadataID", x => new { x.FirstID, x.SecondID }); + table.PrimaryKey("PK_EpisodeMetadataID", x => new { x.ResourceID, x.ProviderID }); table.ForeignKey( - name: "FK_MetadataID_Episodes_FirstID", - column: x => x.FirstID, + name: "FK_EpisodeMetadataID_Episodes_ResourceID", + column: x => x.ResourceID, principalTable: "Episodes", principalColumn: "ID", onDelete: ReferentialAction.Cascade); table.ForeignKey( - name: "FK_MetadataID_Providers_SecondID", - column: x => x.SecondID, + name: "FK_EpisodeMetadataID_Providers_ProviderID", + column: x => x.ProviderID, principalTable: "Providers", principalColumn: "ID", onDelete: ReferentialAction.Cascade); @@ -539,12 +587,22 @@ namespace Kyoo.SqLite.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateIndex( + name: "IX_CollectionMetadataID_ProviderID", + table: "CollectionMetadataID", + column: "ProviderID"); + migrationBuilder.CreateIndex( name: "IX_Collections_Slug", table: "Collections", column: "Slug", unique: true); + migrationBuilder.CreateIndex( + name: "IX_EpisodeMetadataID_ProviderID", + table: "EpisodeMetadataID", + column: "ProviderID"); + migrationBuilder.CreateIndex( name: "IX_Episodes_SeasonID", table: "Episodes", @@ -604,32 +662,17 @@ namespace Kyoo.SqLite.Migrations table: "Link", column: "SecondID"); - migrationBuilder.CreateIndex( - name: "IX_MetadataID_SecondID", - table: "MetadataID", - column: "SecondID"); - - migrationBuilder.CreateIndex( - name: "IX_MetadataID_SecondID", - table: "MetadataID", - column: "SecondID"); - - migrationBuilder.CreateIndex( - name: "IX_MetadataID_SecondID", - table: "MetadataID", - column: "SecondID"); - - migrationBuilder.CreateIndex( - name: "IX_MetadataID_SecondID", - table: "MetadataID", - column: "SecondID"); - migrationBuilder.CreateIndex( name: "IX_People_Slug", table: "People", column: "Slug", unique: true); + migrationBuilder.CreateIndex( + name: "IX_PeopleMetadataID_ProviderID", + table: "PeopleMetadataID", + column: "ProviderID"); + migrationBuilder.CreateIndex( name: "IX_PeopleRoles_PeopleID", table: "PeopleRoles", @@ -646,6 +689,11 @@ namespace Kyoo.SqLite.Migrations column: "Slug", unique: true); + migrationBuilder.CreateIndex( + name: "IX_SeasonMetadataID_ProviderID", + table: "SeasonMetadataID", + column: "ProviderID"); + migrationBuilder.CreateIndex( name: "IX_Seasons_ShowID_SeasonNumber", table: "Seasons", @@ -658,6 +706,11 @@ namespace Kyoo.SqLite.Migrations column: "Slug", unique: true); + migrationBuilder.CreateIndex( + name: "IX_ShowMetadataID_ProviderID", + table: "ShowMetadataID", + column: "ProviderID"); + migrationBuilder.CreateIndex( name: "IX_Shows_Slug", table: "Shows", @@ -669,6 +722,11 @@ namespace Kyoo.SqLite.Migrations table: "Shows", column: "StudioID"); + migrationBuilder.CreateIndex( + name: "IX_StudioMetadataID_ProviderID", + table: "StudioMetadataID", + column: "ProviderID"); + migrationBuilder.CreateIndex( name: "IX_Studios_Slug", table: "Studios", @@ -701,6 +759,12 @@ namespace Kyoo.SqLite.Migrations protected override void Down(MigrationBuilder migrationBuilder) { + migrationBuilder.DropTable( + name: "CollectionMetadataID"); + + migrationBuilder.DropTable( + name: "EpisodeMetadataID"); + migrationBuilder.DropTable( name: "Link"); @@ -720,20 +784,20 @@ namespace Kyoo.SqLite.Migrations name: "Link"); migrationBuilder.DropTable( - name: "MetadataID"); - - migrationBuilder.DropTable( - name: "MetadataID"); - - migrationBuilder.DropTable( - name: "MetadataID"); - - migrationBuilder.DropTable( - name: "MetadataID"); + name: "PeopleMetadataID"); migrationBuilder.DropTable( name: "PeopleRoles"); + migrationBuilder.DropTable( + name: "SeasonMetadataID"); + + migrationBuilder.DropTable( + name: "ShowMetadataID"); + + migrationBuilder.DropTable( + name: "StudioMetadataID"); + migrationBuilder.DropTable( name: "Tracks"); @@ -750,10 +814,10 @@ namespace Kyoo.SqLite.Migrations name: "Genres"); migrationBuilder.DropTable( - name: "Providers"); + name: "People"); migrationBuilder.DropTable( - name: "People"); + name: "Providers"); migrationBuilder.DropTable( name: "Episodes"); diff --git a/Kyoo.SqLite/Migrations/20210723224550_Triggers.Designer.cs b/Kyoo.SqLite/Migrations/20210728135127_Triggers.Designer.cs similarity index 84% rename from Kyoo.SqLite/Migrations/20210723224550_Triggers.Designer.cs rename to Kyoo.SqLite/Migrations/20210728135127_Triggers.Designer.cs index 059a3aa4..43174e4b 100644 --- a/Kyoo.SqLite/Migrations/20210723224550_Triggers.Designer.cs +++ b/Kyoo.SqLite/Migrations/20210728135127_Triggers.Designer.cs @@ -9,7 +9,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace Kyoo.SqLite.Migrations { [DbContext(typeof(SqLiteContext))] - [Migration("20210723224550_Triggers")] + [Migration("20210728135127_Triggers")] partial class Triggers { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -18,21 +18,63 @@ namespace Kyoo.SqLite.Migrations modelBuilder .HasAnnotation("ProductVersion", "5.0.8"); + modelBuilder.Entity("CollectionMetadataID", b => + { + b.Property("ResourceID") + .HasColumnType("INTEGER"); + + b.Property("ProviderID") + .HasColumnType("INTEGER"); + + b.Property("DataID") + .HasColumnType("TEXT"); + + b.Property("Link") + .HasColumnType("TEXT"); + + b.HasKey("ResourceID", "ProviderID"); + + b.HasIndex("ProviderID"); + + b.ToTable("CollectionMetadataID"); + }); + + modelBuilder.Entity("EpisodeMetadataID", b => + { + b.Property("ResourceID") + .HasColumnType("INTEGER"); + + b.Property("ProviderID") + .HasColumnType("INTEGER"); + + b.Property("DataID") + .HasColumnType("TEXT"); + + b.Property("Link") + .HasColumnType("TEXT"); + + b.HasKey("ResourceID", "ProviderID"); + + b.HasIndex("ProviderID"); + + b.ToTable("EpisodeMetadataID"); + }); + modelBuilder.Entity("Kyoo.Models.Collection", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); + b.Property("Images") + .HasColumnType("TEXT"); + b.Property("Name") .HasColumnType("TEXT"); b.Property("Overview") .HasColumnType("TEXT"); - b.Property("Poster") - .HasColumnType("TEXT"); - b.Property("Slug") .IsRequired() .HasColumnType("TEXT"); @@ -57,6 +99,9 @@ namespace Kyoo.SqLite.Migrations b.Property("EpisodeNumber") .HasColumnType("INTEGER"); + b.Property("Images") + .HasColumnType("TEXT"); + b.Property("Overview") .HasColumnType("TEXT"); @@ -79,9 +124,6 @@ namespace Kyoo.SqLite.Migrations .ValueGeneratedOnAddOrUpdate() .HasColumnType("TEXT"); - b.Property("Thumb") - .HasColumnType("TEXT"); - b.Property("Title") .HasColumnType("TEXT"); @@ -152,10 +194,10 @@ namespace Kyoo.SqLite.Migrations b.Property("EndAir") .HasColumnType("TEXT"); - b.Property("Overview") + b.Property("Images") .HasColumnType("TEXT"); - b.Property("Poster") + b.Property("Overview") .HasColumnType("TEXT"); b.Property("Slug") @@ -268,100 +310,16 @@ namespace Kyoo.SqLite.Migrations b.ToTable("Link"); }); - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.Property("DataID") - .HasColumnType("TEXT"); - - b.Property("Link") - .HasColumnType("TEXT"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("MetadataID"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.Property("DataID") - .HasColumnType("TEXT"); - - b.Property("Link") - .HasColumnType("TEXT"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("MetadataID"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.Property("DataID") - .HasColumnType("TEXT"); - - b.Property("Link") - .HasColumnType("TEXT"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("MetadataID"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.Property("DataID") - .HasColumnType("TEXT"); - - b.Property("Link") - .HasColumnType("TEXT"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("MetadataID"); - }); - modelBuilder.Entity("Kyoo.Models.People", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); - b.Property("Name") + b.Property("Images") .HasColumnType("TEXT"); - b.Property("Poster") + b.Property("Name") .HasColumnType("TEXT"); b.Property("Slug") @@ -382,9 +340,6 @@ namespace Kyoo.SqLite.Migrations .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); - b.Property("ForPeople") - .HasColumnType("INTEGER"); - b.Property("PeopleID") .HasColumnType("INTEGER"); @@ -412,7 +367,7 @@ namespace Kyoo.SqLite.Migrations .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); - b.Property("Logo") + b.Property("Images") .HasColumnType("TEXT"); b.Property("LogoExtension") @@ -442,10 +397,10 @@ namespace Kyoo.SqLite.Migrations b.Property("EndDate") .HasColumnType("TEXT"); - b.Property("Overview") + b.Property("Images") .HasColumnType("TEXT"); - b.Property("Poster") + b.Property("Overview") .HasColumnType("TEXT"); b.Property("SeasonNumber") @@ -484,27 +439,21 @@ namespace Kyoo.SqLite.Migrations b.Property("Aliases") .HasColumnType("TEXT"); - b.Property("Backdrop") + b.Property("EndAir") .HasColumnType("TEXT"); - b.Property("EndAir") + b.Property("Images") .HasColumnType("TEXT"); b.Property("IsMovie") .HasColumnType("INTEGER"); - b.Property("Logo") - .HasColumnType("TEXT"); - b.Property("Overview") .HasColumnType("TEXT"); b.Property("Path") .HasColumnType("TEXT"); - b.Property("Poster") - .HasColumnType("TEXT"); - b.Property("Slug") .IsRequired() .HasColumnType("TEXT"); @@ -521,9 +470,6 @@ namespace Kyoo.SqLite.Migrations b.Property("Title") .HasColumnType("TEXT"); - b.Property("TrailerUrl") - .HasColumnType("TEXT"); - b.HasKey("ID"); b.HasIndex("Slug") @@ -657,6 +603,124 @@ namespace Kyoo.SqLite.Migrations b.ToTable("WatchedEpisodes"); }); + modelBuilder.Entity("PeopleMetadataID", b => + { + b.Property("ResourceID") + .HasColumnType("INTEGER"); + + b.Property("ProviderID") + .HasColumnType("INTEGER"); + + b.Property("DataID") + .HasColumnType("TEXT"); + + b.Property("Link") + .HasColumnType("TEXT"); + + b.HasKey("ResourceID", "ProviderID"); + + b.HasIndex("ProviderID"); + + b.ToTable("PeopleMetadataID"); + }); + + modelBuilder.Entity("SeasonMetadataID", b => + { + b.Property("ResourceID") + .HasColumnType("INTEGER"); + + b.Property("ProviderID") + .HasColumnType("INTEGER"); + + b.Property("DataID") + .HasColumnType("TEXT"); + + b.Property("Link") + .HasColumnType("TEXT"); + + b.HasKey("ResourceID", "ProviderID"); + + b.HasIndex("ProviderID"); + + b.ToTable("SeasonMetadataID"); + }); + + modelBuilder.Entity("ShowMetadataID", b => + { + b.Property("ResourceID") + .HasColumnType("INTEGER"); + + b.Property("ProviderID") + .HasColumnType("INTEGER"); + + b.Property("DataID") + .HasColumnType("TEXT"); + + b.Property("Link") + .HasColumnType("TEXT"); + + b.HasKey("ResourceID", "ProviderID"); + + b.HasIndex("ProviderID"); + + b.ToTable("ShowMetadataID"); + }); + + modelBuilder.Entity("StudioMetadataID", b => + { + b.Property("ResourceID") + .HasColumnType("INTEGER"); + + b.Property("ProviderID") + .HasColumnType("INTEGER"); + + b.Property("DataID") + .HasColumnType("TEXT"); + + b.Property("Link") + .HasColumnType("TEXT"); + + b.HasKey("ResourceID", "ProviderID"); + + b.HasIndex("ProviderID"); + + b.ToTable("StudioMetadataID"); + }); + + modelBuilder.Entity("CollectionMetadataID", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Collection", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("EpisodeMetadataID", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Episode", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + modelBuilder.Entity("Kyoo.Models.Episode", b => { b.HasOne("Kyoo.Models.Season", "Season") @@ -789,82 +853,6 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Second"); }); - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Episode", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.People", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Season", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Show", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "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") @@ -935,8 +923,78 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Second"); }); + modelBuilder.Entity("PeopleMetadataID", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.People", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("SeasonMetadataID", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Season", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("ShowMetadataID", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("StudioMetadataID", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Studio", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + modelBuilder.Entity("Kyoo.Models.Collection", b => { + b.Navigation("ExternalIDs"); + b.Navigation("LibraryLinks"); b.Navigation("ShowLinks"); @@ -1001,6 +1059,8 @@ namespace Kyoo.SqLite.Migrations modelBuilder.Entity("Kyoo.Models.Studio", b => { + b.Navigation("ExternalIDs"); + b.Navigation("Shows"); }); diff --git a/Kyoo.SqLite/Migrations/20210723224550_Triggers.cs b/Kyoo.SqLite/Migrations/20210728135127_Triggers.cs similarity index 98% rename from Kyoo.SqLite/Migrations/20210723224550_Triggers.cs rename to Kyoo.SqLite/Migrations/20210728135127_Triggers.cs index 370fdd37..f26ab7e2 100644 --- a/Kyoo.SqLite/Migrations/20210723224550_Triggers.cs +++ b/Kyoo.SqLite/Migrations/20210728135127_Triggers.cs @@ -154,7 +154,7 @@ namespace Kyoo.SqLite.Migrations // language=SQLite migrationBuilder.Sql(@" CREATE VIEW LibraryItems AS - SELECT s.ID, s.Slug, s.Title, s.Overview, s.Status, s.StartAir, s.EndAir, s.Poster, CASE + SELECT s.ID, s.Slug, s.Title, s.Overview, s.Status, s.StartAir, s.EndAir, s.Images, CASE WHEN s.IsMovie THEN 1 ELSE 0 END AS Type @@ -166,7 +166,7 @@ namespace Kyoo.SqLite.Migrations WHERE s.ID = l.SecondID)) UNION ALL SELECT -c0.ID, c0.Slug, c0.Name AS Title, c0.Overview, 3 AS Status, - NULL AS StartAir, NULL AS EndAir, c0.Poster, 2 AS Type + NULL AS StartAir, NULL AS EndAir, c0.Images, 2 AS Type FROM collections AS c0"); } diff --git a/Kyoo.SqLite/Migrations/SqLiteContextModelSnapshot.cs b/Kyoo.SqLite/Migrations/SqLiteContextModelSnapshot.cs index 12f5d94b..fc7c6cac 100644 --- a/Kyoo.SqLite/Migrations/SqLiteContextModelSnapshot.cs +++ b/Kyoo.SqLite/Migrations/SqLiteContextModelSnapshot.cs @@ -16,21 +16,63 @@ namespace Kyoo.SqLite.Migrations modelBuilder .HasAnnotation("ProductVersion", "5.0.8"); + modelBuilder.Entity("CollectionMetadataID", b => + { + b.Property("ResourceID") + .HasColumnType("INTEGER"); + + b.Property("ProviderID") + .HasColumnType("INTEGER"); + + b.Property("DataID") + .HasColumnType("TEXT"); + + b.Property("Link") + .HasColumnType("TEXT"); + + b.HasKey("ResourceID", "ProviderID"); + + b.HasIndex("ProviderID"); + + b.ToTable("CollectionMetadataID"); + }); + + modelBuilder.Entity("EpisodeMetadataID", b => + { + b.Property("ResourceID") + .HasColumnType("INTEGER"); + + b.Property("ProviderID") + .HasColumnType("INTEGER"); + + b.Property("DataID") + .HasColumnType("TEXT"); + + b.Property("Link") + .HasColumnType("TEXT"); + + b.HasKey("ResourceID", "ProviderID"); + + b.HasIndex("ProviderID"); + + b.ToTable("EpisodeMetadataID"); + }); + modelBuilder.Entity("Kyoo.Models.Collection", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); + b.Property("Images") + .HasColumnType("TEXT"); + b.Property("Name") .HasColumnType("TEXT"); b.Property("Overview") .HasColumnType("TEXT"); - b.Property("Poster") - .HasColumnType("TEXT"); - b.Property("Slug") .IsRequired() .HasColumnType("TEXT"); @@ -55,6 +97,9 @@ namespace Kyoo.SqLite.Migrations b.Property("EpisodeNumber") .HasColumnType("INTEGER"); + b.Property("Images") + .HasColumnType("TEXT"); + b.Property("Overview") .HasColumnType("TEXT"); @@ -77,9 +122,6 @@ namespace Kyoo.SqLite.Migrations .ValueGeneratedOnAddOrUpdate() .HasColumnType("TEXT"); - b.Property("Thumb") - .HasColumnType("TEXT"); - b.Property("Title") .HasColumnType("TEXT"); @@ -150,10 +192,10 @@ namespace Kyoo.SqLite.Migrations b.Property("EndAir") .HasColumnType("TEXT"); - b.Property("Overview") + b.Property("Images") .HasColumnType("TEXT"); - b.Property("Poster") + b.Property("Overview") .HasColumnType("TEXT"); b.Property("Slug") @@ -266,100 +308,16 @@ namespace Kyoo.SqLite.Migrations b.ToTable("Link"); }); - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.Property("DataID") - .HasColumnType("TEXT"); - - b.Property("Link") - .HasColumnType("TEXT"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("MetadataID"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.Property("DataID") - .HasColumnType("TEXT"); - - b.Property("Link") - .HasColumnType("TEXT"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("MetadataID"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.Property("DataID") - .HasColumnType("TEXT"); - - b.Property("Link") - .HasColumnType("TEXT"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("MetadataID"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.Property("FirstID") - .HasColumnType("INTEGER"); - - b.Property("SecondID") - .HasColumnType("INTEGER"); - - b.Property("DataID") - .HasColumnType("TEXT"); - - b.Property("Link") - .HasColumnType("TEXT"); - - b.HasKey("FirstID", "SecondID"); - - b.HasIndex("SecondID"); - - b.ToTable("MetadataID"); - }); - modelBuilder.Entity("Kyoo.Models.People", b => { b.Property("ID") .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); - b.Property("Name") + b.Property("Images") .HasColumnType("TEXT"); - b.Property("Poster") + b.Property("Name") .HasColumnType("TEXT"); b.Property("Slug") @@ -380,9 +338,6 @@ namespace Kyoo.SqLite.Migrations .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); - b.Property("ForPeople") - .HasColumnType("INTEGER"); - b.Property("PeopleID") .HasColumnType("INTEGER"); @@ -410,7 +365,7 @@ namespace Kyoo.SqLite.Migrations .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); - b.Property("Logo") + b.Property("Images") .HasColumnType("TEXT"); b.Property("LogoExtension") @@ -440,10 +395,10 @@ namespace Kyoo.SqLite.Migrations b.Property("EndDate") .HasColumnType("TEXT"); - b.Property("Overview") + b.Property("Images") .HasColumnType("TEXT"); - b.Property("Poster") + b.Property("Overview") .HasColumnType("TEXT"); b.Property("SeasonNumber") @@ -482,27 +437,21 @@ namespace Kyoo.SqLite.Migrations b.Property("Aliases") .HasColumnType("TEXT"); - b.Property("Backdrop") + b.Property("EndAir") .HasColumnType("TEXT"); - b.Property("EndAir") + b.Property("Images") .HasColumnType("TEXT"); b.Property("IsMovie") .HasColumnType("INTEGER"); - b.Property("Logo") - .HasColumnType("TEXT"); - b.Property("Overview") .HasColumnType("TEXT"); b.Property("Path") .HasColumnType("TEXT"); - b.Property("Poster") - .HasColumnType("TEXT"); - b.Property("Slug") .IsRequired() .HasColumnType("TEXT"); @@ -519,9 +468,6 @@ namespace Kyoo.SqLite.Migrations b.Property("Title") .HasColumnType("TEXT"); - b.Property("TrailerUrl") - .HasColumnType("TEXT"); - b.HasKey("ID"); b.HasIndex("Slug") @@ -655,6 +601,124 @@ namespace Kyoo.SqLite.Migrations b.ToTable("WatchedEpisodes"); }); + modelBuilder.Entity("PeopleMetadataID", b => + { + b.Property("ResourceID") + .HasColumnType("INTEGER"); + + b.Property("ProviderID") + .HasColumnType("INTEGER"); + + b.Property("DataID") + .HasColumnType("TEXT"); + + b.Property("Link") + .HasColumnType("TEXT"); + + b.HasKey("ResourceID", "ProviderID"); + + b.HasIndex("ProviderID"); + + b.ToTable("PeopleMetadataID"); + }); + + modelBuilder.Entity("SeasonMetadataID", b => + { + b.Property("ResourceID") + .HasColumnType("INTEGER"); + + b.Property("ProviderID") + .HasColumnType("INTEGER"); + + b.Property("DataID") + .HasColumnType("TEXT"); + + b.Property("Link") + .HasColumnType("TEXT"); + + b.HasKey("ResourceID", "ProviderID"); + + b.HasIndex("ProviderID"); + + b.ToTable("SeasonMetadataID"); + }); + + modelBuilder.Entity("ShowMetadataID", b => + { + b.Property("ResourceID") + .HasColumnType("INTEGER"); + + b.Property("ProviderID") + .HasColumnType("INTEGER"); + + b.Property("DataID") + .HasColumnType("TEXT"); + + b.Property("Link") + .HasColumnType("TEXT"); + + b.HasKey("ResourceID", "ProviderID"); + + b.HasIndex("ProviderID"); + + b.ToTable("ShowMetadataID"); + }); + + modelBuilder.Entity("StudioMetadataID", b => + { + b.Property("ResourceID") + .HasColumnType("INTEGER"); + + b.Property("ProviderID") + .HasColumnType("INTEGER"); + + b.Property("DataID") + .HasColumnType("TEXT"); + + b.Property("Link") + .HasColumnType("TEXT"); + + b.HasKey("ResourceID", "ProviderID"); + + b.HasIndex("ProviderID"); + + b.ToTable("StudioMetadataID"); + }); + + modelBuilder.Entity("CollectionMetadataID", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Collection", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("EpisodeMetadataID", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Episode", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + modelBuilder.Entity("Kyoo.Models.Episode", b => { b.HasOne("Kyoo.Models.Season", "Season") @@ -787,82 +851,6 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Second"); }); - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Episode", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.People", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Season", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "Second") - .WithMany() - .HasForeignKey("SecondID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("First"); - - b.Navigation("Second"); - }); - - modelBuilder.Entity("Kyoo.Models.MetadataID", b => - { - b.HasOne("Kyoo.Models.Show", "First") - .WithMany("ExternalIDs") - .HasForeignKey("FirstID") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Kyoo.Models.Provider", "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") @@ -933,8 +921,78 @@ namespace Kyoo.SqLite.Migrations b.Navigation("Second"); }); + modelBuilder.Entity("PeopleMetadataID", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.People", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("SeasonMetadataID", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Season", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("ShowMetadataID", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Show", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("StudioMetadataID", b => + { + b.HasOne("Kyoo.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Models.Studio", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + modelBuilder.Entity("Kyoo.Models.Collection", b => { + b.Navigation("ExternalIDs"); + b.Navigation("LibraryLinks"); b.Navigation("ShowLinks"); @@ -999,6 +1057,8 @@ namespace Kyoo.SqLite.Migrations modelBuilder.Entity("Kyoo.Models.Studio", b => { + b.Navigation("ExternalIDs"); + b.Navigation("Shows"); }); diff --git a/Kyoo.SqLite/SqLiteContext.cs b/Kyoo.SqLite/SqLiteContext.cs index 23145cf1..e81a91ad 100644 --- a/Kyoo.SqLite/SqLiteContext.cs +++ b/Kyoo.SqLite/SqLiteContext.cs @@ -102,12 +102,38 @@ namespace Kyoo.SqLite .Property(x => x.Type) .HasConversion(); - ValueConverter, string> jsonConvertor = new( + ValueConverter, string> extraDataConvertor = new( x => JsonConvert.SerializeObject(x), x => JsonConvert.DeserializeObject>(x)); modelBuilder.Entity() .Property(x => x.ExtraData) + .HasConversion(extraDataConvertor); + + ValueConverter, string> jsonConvertor = new( + x => JsonConvert.SerializeObject(x), + x => JsonConvert.DeserializeObject>(x)); + modelBuilder.Entity() + .Property(x => x.Images) .HasConversion(jsonConvertor); + modelBuilder.Entity() + .Property(x => x.Images) + .HasConversion(jsonConvertor); + modelBuilder.Entity() + .Property(x => x.Images) + .HasConversion(jsonConvertor); + modelBuilder.Entity() + .Property(x => x.Images) + .HasConversion(jsonConvertor); + modelBuilder.Entity() + .Property(x => x.Images) + .HasConversion(jsonConvertor); + modelBuilder.Entity() + .Property(x => x.Images) + .HasConversion(jsonConvertor); + modelBuilder.Entity() + .Property(x => x.Images) + .HasConversion(jsonConvertor); + modelBuilder.Entity() .ToView("LibraryItems") @@ -115,6 +141,12 @@ namespace Kyoo.SqLite base.OnModelCreating(modelBuilder); } + /// + protected override string MetadataName() + { + return typeof(T).Name + nameof(MetadataID); + } + /// protected override bool IsDuplicateException(Exception ex) { diff --git a/Kyoo.Tests/Database/TestSample.cs b/Kyoo.Tests/Database/TestSample.cs index d81612ad..0faf16da 100644 --- a/Kyoo.Tests/Database/TestSample.cs +++ b/Kyoo.Tests/Database/TestSample.cs @@ -41,7 +41,7 @@ namespace Kyoo.Tests Slug = "collection", Name = "Collection", Overview = "A nice collection for tests", - Images = + Images = new Dictionary { [Thumbnails.Poster] = "Poster" } @@ -66,7 +66,7 @@ namespace Kyoo.Tests Status = Status.Finished, StartAir = new DateTime(2011, 1, 1), EndAir = new DateTime(2011, 1, 1), - Images = + Images = new Dictionary { [Thumbnails.Poster] = "Poster", [Thumbnails.Logo] = "Logo", @@ -88,7 +88,7 @@ namespace Kyoo.Tests Overview = "The first season", StartDate = new DateTime(2020, 06, 05), EndDate = new DateTime(2020, 07, 05), - Images = + Images = new Dictionary { [Thumbnails.Poster] = "Poster", [Thumbnails.Logo] = "Logo", @@ -108,7 +108,7 @@ namespace Kyoo.Tests EpisodeNumber = 1, AbsoluteNumber = 1, Path = "/home/kyoo/anohana-s1e1", - Images = + Images = new Dictionary { [Thumbnails.Poster] = "Poster", [Thumbnails.Logo] = "Logo", @@ -144,7 +144,7 @@ namespace Kyoo.Tests ID = 1, Slug = "the-actor", Name = "The Actor", - Images = + Images = new Dictionary { [Thumbnails.Poster] = "Poster", [Thumbnails.Logo] = "Logo", @@ -177,7 +177,7 @@ namespace Kyoo.Tests ID = 1, Slug = "tvdb", Name = "The TVDB", - Images = + Images = new Dictionary { [Thumbnails.Poster] = "Poster", [Thumbnails.Logo] = "path/tvdb.svg", @@ -282,7 +282,7 @@ namespace Kyoo.Tests EpisodeNumber = null, AbsoluteNumber = 3, Path = "/home/kyoo/anohana-3", - Images = + Images = new Dictionary { [Thumbnails.Poster] = "Poster", [Thumbnails.Logo] = "Logo", @@ -302,7 +302,7 @@ namespace Kyoo.Tests ShowSlug = "anohana", ShowID = 1, Path = "/home/kyoo/john-wick", - Images = + Images = new Dictionary { [Thumbnails.Poster] = "Poster", [Thumbnails.Logo] = "Logo", diff --git a/Kyoo.TheMovieDb/Convertors.cs b/Kyoo.TheMovieDb/Convertors.cs index b6fd4ad1..cbd63e10 100644 --- a/Kyoo.TheMovieDb/Convertors.cs +++ b/Kyoo.TheMovieDb/Convertors.cs @@ -1,3 +1,4 @@ +using System.Collections.Generic; using System.Linq; using Kyoo.Models; using TMDbLib.Objects.General; @@ -29,7 +30,7 @@ namespace Kyoo.TheMovieDb Status = movie.Status == "Released" ? Status.Finished : Status.Planned, StartAir = movie.ReleaseDate, EndAir = movie.ReleaseDate, - Images = + Images = new Dictionary { [Thumbnails.Poster] = movie.PosterPath != null ? $"https://image.tmdb.org/t/p/original{movie.PosterPath}" @@ -79,7 +80,7 @@ namespace Kyoo.TheMovieDb Status = tv.Status == "Ended" ? Status.Finished : Status.Planned, StartAir = tv.FirstAirDate, EndAir = tv.LastAirDate, - Images = + Images = new Dictionary { [Thumbnails.Poster] = tv.PosterPath != null ? $"https://image.tmdb.org/t/p/original{tv.PosterPath}" @@ -125,7 +126,7 @@ namespace Kyoo.TheMovieDb { Slug = Utility.ToSlug(collection.Name), Name = collection.Name, - Images = + Images = new Dictionary { [Thumbnails.Poster] = collection.PosterPath != null ? $"https://image.tmdb.org/t/p/original{collection.PosterPath}" @@ -152,7 +153,7 @@ namespace Kyoo.TheMovieDb Overview = movie.Overview, StartAir = movie.ReleaseDate, EndAir = movie.ReleaseDate, - Images = + Images = new Dictionary { [Thumbnails.Poster] = movie.PosterPath != null ? $"https://image.tmdb.org/t/p/original{movie.PosterPath}" @@ -188,7 +189,7 @@ namespace Kyoo.TheMovieDb Title = tv.Name, Overview = tv.Overview, StartAir = tv.FirstAirDate, - Images = + Images = new Dictionary { [Thumbnails.Poster] = tv.PosterPath != null ? $"https://image.tmdb.org/t/p/original{tv.PosterPath}" @@ -224,7 +225,7 @@ namespace Kyoo.TheMovieDb { Slug = Utility.ToSlug(cast.Name), Name = cast.Name, - Images = + Images = new Dictionary { [Thumbnails.Poster] = cast.ProfilePath != null ? $"https://image.tmdb.org/t/p/original{cast.ProfilePath}" @@ -259,7 +260,7 @@ namespace Kyoo.TheMovieDb { Slug = Utility.ToSlug(cast.Name), Name = cast.Name, - Images = + Images = new Dictionary { [Thumbnails.Poster] = cast.ProfilePath != null ? $"https://image.tmdb.org/t/p/original{cast.ProfilePath}" @@ -294,7 +295,7 @@ namespace Kyoo.TheMovieDb { Slug = Utility.ToSlug(crew.Name), Name = crew.Name, - Images = + Images = new Dictionary { [Thumbnails.Poster] = crew.ProfilePath != null ? $"https://image.tmdb.org/t/p/original{crew.ProfilePath}" diff --git a/Kyoo.TheMovieDb/ProviderTmdb.cs b/Kyoo.TheMovieDb/ProviderTmdb.cs index bde0a748..d5f9f7ef 100644 --- a/Kyoo.TheMovieDb/ProviderTmdb.cs +++ b/Kyoo.TheMovieDb/ProviderTmdb.cs @@ -29,7 +29,7 @@ namespace Kyoo.TheMovieDb Slug = "the-moviedb", Name = "TheMovieDB", LogoExtension = "svg", - Images = + Images = new Dictionary { [Thumbnails.Logo] = "https://www.themoviedb.org/assets/2/v4/logos/v2/" + "blue_short-8e7b30f73a4020692ccca9c88bafe5dcb6f8a62a4c6bc55cd9ba82bb2cd95f6c.svg" diff --git a/Kyoo.TheTvdb/Convertors.cs b/Kyoo.TheTvdb/Convertors.cs index b992481d..4cff035a 100644 --- a/Kyoo.TheTvdb/Convertors.cs +++ b/Kyoo.TheTvdb/Convertors.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Globalization; using System.Linq; using Kyoo.Models; @@ -55,7 +56,7 @@ namespace Kyoo.TheTvdb Overview = result.Overview, Status = _GetStatus(result.Status), StartAir = _ParseDate(result.FirstAired), - Images = + Images = new Dictionary { [Thumbnails.Poster] = result.Poster != null ? $"https://www.thetvdb.com{result.Poster}" @@ -89,7 +90,7 @@ namespace Kyoo.TheTvdb Overview = series.Overview, Status = _GetStatus(series.Status), StartAir = _ParseDate(series.FirstAired), - Images= + Images = new Dictionary { [Thumbnails.Poster] = series.Poster != null ? $"https://www.thetvdb.com/banners/{series.Poster}" @@ -125,7 +126,7 @@ namespace Kyoo.TheTvdb { Slug = Utility.ToSlug(actor.Name), Name = actor.Name, - Images = + Images = new Dictionary { [Thumbnails.Poster] = actor.Image != null ? $"https://www.thetvdb.com/banners/{actor.Image}" @@ -161,7 +162,7 @@ namespace Kyoo.TheTvdb AbsoluteNumber = episode.AbsoluteNumber, Title = episode.EpisodeName, Overview = episode.Overview, - Images = + Images = new Dictionary { [Thumbnails.Thumbnail] = episode.Filename != null ? $"https://www.thetvdb.com/banners/{episode.Filename}" diff --git a/Kyoo.TheTvdb/ProviderTvdb.cs b/Kyoo.TheTvdb/ProviderTvdb.cs index b2ba5683..13aefa80 100644 --- a/Kyoo.TheTvdb/ProviderTvdb.cs +++ b/Kyoo.TheTvdb/ProviderTvdb.cs @@ -33,7 +33,7 @@ namespace Kyoo.TheTvdb Slug = "the-tvdb", Name = "TheTVDB", LogoExtension = "png", - Images = + 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 6b546f07..a757d1c9 100644 --- a/Kyoo/Controllers/Repositories/CollectionRepository.cs +++ b/Kyoo/Controllers/Repositories/CollectionRepository.cs @@ -53,7 +53,6 @@ namespace Kyoo.Controllers { await base.Create(obj); _database.Entry(obj).State = EntityState.Added; - obj.ExternalIDs.ForEach(x => _database.Entry(x).State = EntityState.Added); await _database.SaveChangesAsync($"Trying to insert a duplicated collection (slug {obj.Slug} already exists)."); return obj; } @@ -66,7 +65,6 @@ namespace Kyoo.Controllers { x.Provider = await _providers.CreateIfNotExists(x.Provider); x.ProviderID = x.Provider.ID; - x.ResourceType = nameof(Collection); _database.Entry(x.Provider).State = EntityState.Detached; }); } diff --git a/Kyoo/Controllers/Repositories/EpisodeRepository.cs b/Kyoo/Controllers/Repositories/EpisodeRepository.cs index 7a2b0479..51f58cd9 100644 --- a/Kyoo/Controllers/Repositories/EpisodeRepository.cs +++ b/Kyoo/Controllers/Repositories/EpisodeRepository.cs @@ -111,7 +111,6 @@ namespace Kyoo.Controllers { await base.Create(obj); _database.Entry(obj).State = EntityState.Added; - obj.ExternalIDs.ForEach(x => _database.Entry(x).State = EntityState.Added); await _database.SaveChangesAsync($"Trying to insert a duplicated episode (slug {obj.Slug} already exists)."); return await ValidateTracks(obj); } @@ -162,7 +161,6 @@ namespace Kyoo.Controllers { x.Provider = await _providers.CreateIfNotExists(x.Provider); x.ProviderID = x.Provider.ID; - x.ResourceType = nameof(Episode); _database.Entry(x.Provider).State = EntityState.Detached; }); } diff --git a/Kyoo/Controllers/Repositories/PeopleRepository.cs b/Kyoo/Controllers/Repositories/PeopleRepository.cs index 6267f52f..6ca99c37 100644 --- a/Kyoo/Controllers/Repositories/PeopleRepository.cs +++ b/Kyoo/Controllers/Repositories/PeopleRepository.cs @@ -62,7 +62,6 @@ namespace Kyoo.Controllers { await base.Create(obj); _database.Entry(obj).State = EntityState.Added; - obj.ExternalIDs.ForEach(x => _database.Entry(x).State = EntityState.Added); await _database.SaveChangesAsync($"Trying to insert a duplicated people (slug {obj.Slug} already exists)."); return obj; } @@ -75,7 +74,6 @@ namespace Kyoo.Controllers { id.Provider = await _providers.CreateIfNotExists(id.Provider); id.ProviderID = id.Provider.ID; - id.ResourceType = nameof(People); _database.Entry(id.Provider).State = EntityState.Detached; }); await resource.Roles.ForEachAsync(async role => diff --git a/Kyoo/Controllers/Repositories/ProviderRepository.cs b/Kyoo/Controllers/Repositories/ProviderRepository.cs index 13525c9c..5edf451b 100644 --- a/Kyoo/Controllers/Repositories/ProviderRepository.cs +++ b/Kyoo/Controllers/Repositories/ProviderRepository.cs @@ -69,11 +69,9 @@ namespace Kyoo.Controllers where T : class, IMetadata { string discriminator = typeof(T).Name; - return ApplyFilters(_database.MetadataIDs - .Include(y => y.Provider) - .Where(x => x.ResourceType == discriminator), - x => _database.MetadataIDs.FirstOrDefaultAsync(y => y.ResourceID == x - && y.ResourceType == discriminator), + return ApplyFilters(_database.MetadataIds() + .Include(y => y.Provider), + x => _database.MetadataIds().FirstOrDefaultAsync(y => y.ResourceID == x), x => x.ResourceID, where, sort, diff --git a/Kyoo/Controllers/Repositories/SeasonRepository.cs b/Kyoo/Controllers/Repositories/SeasonRepository.cs index 45aa4554..c481e866 100644 --- a/Kyoo/Controllers/Repositories/SeasonRepository.cs +++ b/Kyoo/Controllers/Repositories/SeasonRepository.cs @@ -87,7 +87,6 @@ namespace Kyoo.Controllers { await base.Create(obj); _database.Entry(obj).State = EntityState.Added; - obj.ExternalIDs.ForEach(x => _database.Entry(x).State = EntityState.Added); await _database.SaveChangesAsync($"Trying to insert a duplicated season (slug {obj.Slug} already exists)."); return obj; } @@ -108,7 +107,6 @@ namespace Kyoo.Controllers { id.Provider = await _providers.CreateIfNotExists(id.Provider); id.ProviderID = id.Provider.ID; - id.ResourceType = nameof(Season); _database.Entry(id.Provider).State = EntityState.Detached; }); } diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index 37921c4d..84923cd3 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -78,7 +78,6 @@ namespace Kyoo.Controllers _database.Entry(obj).State = EntityState.Added; obj.GenreLinks.ForEach(x => _database.Entry(x).State = EntityState.Added); obj.People.ForEach(x => _database.Entry(x).State = EntityState.Added); - obj.ExternalIDs.ForEach(x => _database.Entry(x).State = EntityState.Added); await _database.SaveChangesAsync($"Trying to insert a duplicated show (slug {obj.Slug} already exists)."); return obj; } @@ -103,7 +102,6 @@ namespace Kyoo.Controllers { id.Provider = await _providers.CreateIfNotExists(id.Provider); id.ProviderID = id.Provider.ID; - id.ResourceType = nameof(Show); _database.Entry(id.Provider).State = EntityState.Detached; }); await resource.People.ForEachAsync(async role => diff --git a/Kyoo/Controllers/Repositories/StudioRepository.cs b/Kyoo/Controllers/Repositories/StudioRepository.cs index 0422c382..ef0dfecc 100644 --- a/Kyoo/Controllers/Repositories/StudioRepository.cs +++ b/Kyoo/Controllers/Repositories/StudioRepository.cs @@ -66,7 +66,6 @@ namespace Kyoo.Controllers { x.Provider = await _providers.CreateIfNotExists(x.Provider); x.ProviderID = x.Provider.ID; - x.ResourceType = nameof(Studio); _database.Entry(x.Provider).State = EntityState.Detached; }); }