diff --git a/Kyoo.Common/Kyoo.Common.csproj b/Kyoo.Common/Kyoo.Common.csproj
index fcf33415..c4c2f3d6 100644
--- a/Kyoo.Common/Kyoo.Common.csproj
+++ b/Kyoo.Common/Kyoo.Common.csproj
@@ -17,7 +17,7 @@
snupkg
default
- ENABLE_INTERNAL_LINKS
+
diff --git a/Kyoo.Common/Models/Resources/Provider.cs b/Kyoo.Common/Models/Resources/Provider.cs
index 920b7345..35f94fc9 100644
--- a/Kyoo.Common/Models/Resources/Provider.cs
+++ b/Kyoo.Common/Models/Resources/Provider.cs
@@ -32,12 +32,7 @@ namespace Kyoo.Models
///
[SerializeAs("{HOST}/api/providers/{Slug}/logo")]
public string Logo => Images?.GetValueOrDefault(Thumbnails.Logo);
-
- ///
- /// The extension of the logo. This is used for http responses.
- ///
- [SerializeIgnore] public string LogoExtension { get; set; }
-
+
///
/// The list of libraries that uses this provider.
///
diff --git a/Kyoo.Common/Models/Resources/User.cs b/Kyoo.Common/Models/Resources/User.cs
index 05f56534..8cae9671 100644
--- a/Kyoo.Common/Models/Resources/User.cs
+++ b/Kyoo.Common/Models/Resources/User.cs
@@ -6,7 +6,7 @@ namespace Kyoo.Models
///
/// A single user of the app.
///
- public class User : IResource
+ public class User : IResource, IThumbnails
{
///
public int ID { get; set; }
@@ -38,7 +38,10 @@ namespace Kyoo.Models
/// Arbitrary extra data that can be used by specific authentication implementations.
///
public Dictionary ExtraData { get; set; }
-
+
+ ///
+ public Dictionary Images { get; set; }
+
///
/// The list of shows the user has finished.
///
@@ -48,7 +51,7 @@ namespace Kyoo.Models
/// The list of episodes the user is watching (stopped in progress or the next episode of the show)
///
public ICollection CurrentlyWatching { get; set; }
-
+
#if ENABLE_INTERNAL_LINKS
///
/// Links between Users and Shows.
@@ -60,8 +63,23 @@ namespace Kyoo.Models
///
/// Metadata of episode currently watching by an user
///
- public class WatchedEpisode : Link
+ public class WatchedEpisode
{
+ ///
+ /// The ID of the user that started watching this episode.
+ ///
+ public int UserID { get; set; }
+
+ ///
+ /// The ID of the episode started.
+ ///
+ public int EpisodeID { get; set; }
+
+ ///
+ /// The started.
+ ///
+ public Episode Episode { get; set; }
+
///
/// Where the player has stopped watching the episode (between 0 and 100).
///
diff --git a/Kyoo.CommonAPI/DatabaseContext.cs b/Kyoo.CommonAPI/DatabaseContext.cs
index 6d1fec11..d2eb8e2f 100644
--- a/Kyoo.CommonAPI/DatabaseContext.cs
+++ b/Kyoo.CommonAPI/DatabaseContext.cs
@@ -84,14 +84,6 @@ namespace Kyoo
///
public DbSet LibraryItems { get; set; }
- ///
- /// Get the name of the metadata table of the given type.
- ///
- /// The type related to the metadata
- /// The name of the table containing the metadata.
- protected abstract string MetadataName()
- where T : IMetadata;
-
///
/// Get all metadataIDs (ExternalIDs) of a given resource. See .
///
@@ -131,6 +123,24 @@ namespace Kyoo
: base(options)
{ }
+ ///
+ /// Get the name of the metadata table of the given type.
+ ///
+ /// The type related to the metadata
+ /// The name of the table containing the metadata.
+ protected abstract string MetadataName()
+ where T : IMetadata;
+
+ ///
+ /// Get the name of the link table of the two given types.
+ ///
+ /// The owner type of the relation
+ /// The child type of the relation
+ /// The name of the table containing the links.
+ protected abstract string LinkName()
+ where T : IResource
+ where T2 : IResource;
+
///
/// Set basic configurations (like preventing query tracking)
///
@@ -196,74 +206,27 @@ namespace Kyoo
modelBuilder.Entity()
.HasMany(x => x.Libraries)
.WithMany(x => x.Providers)
- .UsingEntity>(
- y => y
- .HasOne(x => x.First)
- .WithMany(x => x.ProviderLinks),
- y => y
- .HasOne(x => x.Second)
- .WithMany(x => x.LibraryLinks),
- y => y.HasKey(Link.PrimaryKey));
-
+ .UsingEntity(x => x.ToTable(LinkName()));
modelBuilder.Entity()
.HasMany(x => x.Libraries)
.WithMany(x => x.Collections)
- .UsingEntity>(
- y => y
- .HasOne(x => x.First)
- .WithMany(x => x.CollectionLinks),
- y => y
- .HasOne(x => x.Second)
- .WithMany(x => x.LibraryLinks),
- y => y.HasKey(Link.PrimaryKey));
-
+ .UsingEntity(x => x.ToTable(LinkName()));
modelBuilder.Entity()
.HasMany(x => x.Libraries)
.WithMany(x => x.Shows)
- .UsingEntity>(
- y => y
- .HasOne(x => x.First)
- .WithMany(x => x.ShowLinks),
- y => y
- .HasOne(x => x.Second)
- .WithMany(x => x.LibraryLinks),
- y => y.HasKey(Link.PrimaryKey));
-
+ .UsingEntity(x => x.ToTable(LinkName()));
modelBuilder.Entity()
.HasMany(x => x.Collections)
.WithMany(x => x.Shows)
- .UsingEntity>(
- y => y
- .HasOne(x => x.First)
- .WithMany(x => x.ShowLinks),
- y => y
- .HasOne(x => x.Second)
- .WithMany(x => x.CollectionLinks),
- y => y.HasKey(Link.PrimaryKey));
-
+ .UsingEntity(x => x.ToTable(LinkName()));
modelBuilder.Entity()
.HasMany(x => x.Shows)
.WithMany(x => x.Genres)
- .UsingEntity>(
- y => y
- .HasOne(x => x.First)
- .WithMany(x => x.GenreLinks),
- y => y
- .HasOne(x => x.Second)
- .WithMany(x => x.ShowLinks),
- y => y.HasKey(Link.PrimaryKey));
-
+ .UsingEntity(x => x.ToTable(LinkName()));
modelBuilder.Entity()
.HasMany(x => x.Watched)
- .WithMany("users")
- .UsingEntity>(
- y => y
- .HasOne(x => x.Second)
- .WithMany(),
- y => y
- .HasOne(x => x.First)
- .WithMany(x => x.ShowLinks),
- y => y.HasKey(Link.PrimaryKey));
+ .WithMany("Users")
+ .UsingEntity(x => x.ToTable(LinkName()));
_HasMetadata(modelBuilder);
_HasMetadata(modelBuilder);
@@ -273,7 +236,7 @@ namespace Kyoo
_HasMetadata(modelBuilder);
modelBuilder.Entity()
- .HasKey(x => new { First = x.FirstID, Second = x.SecondID });
+ .HasKey(x => new { User = x.UserID, Episode = x.EpisodeID });
modelBuilder.Entity().Property(x => x.Slug).IsRequired();
modelBuilder.Entity().Property(x => x.Slug).IsRequired();
diff --git a/Kyoo.Postgresql/Migrations/20210728141410_Initial.Designer.cs b/Kyoo.Postgresql/Migrations/20210730183548_Initial.Designer.cs
similarity index 85%
rename from Kyoo.Postgresql/Migrations/20210728141410_Initial.Designer.cs
rename to Kyoo.Postgresql/Migrations/20210730183548_Initial.Designer.cs
index 8722ada5..10c42bb3 100644
--- a/Kyoo.Postgresql/Migrations/20210728141410_Initial.Designer.cs
+++ b/Kyoo.Postgresql/Migrations/20210730183548_Initial.Designer.cs
@@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
namespace Kyoo.Postgresql.Migrations
{
[DbContext(typeof(PostgresContext))]
- [Migration("20210728141410_Initial")]
+ [Migration("20210730183548_Initial")]
partial class Initial
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
@@ -26,6 +26,63 @@ namespace Kyoo.Postgresql.Migrations
.HasAnnotation("ProductVersion", "5.0.8")
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+ modelBuilder.Entity("CollectionLibrary", b =>
+ {
+ b.Property("CollectionsID")
+ .HasColumnType("integer")
+ .HasColumnName("collections_id");
+
+ b.Property("LibrariesID")
+ .HasColumnType("integer")
+ .HasColumnName("libraries_id");
+
+ b.HasKey("CollectionsID", "LibrariesID")
+ .HasName("pk_link_library_collection");
+
+ b.HasIndex("LibrariesID")
+ .HasDatabaseName("ix_link_library_collection_libraries_id");
+
+ b.ToTable("link_library_collection");
+ });
+
+ modelBuilder.Entity("CollectionShow", b =>
+ {
+ b.Property("CollectionsID")
+ .HasColumnType("integer")
+ .HasColumnName("collections_id");
+
+ b.Property("ShowsID")
+ .HasColumnType("integer")
+ .HasColumnName("shows_id");
+
+ b.HasKey("CollectionsID", "ShowsID")
+ .HasName("pk_link_collection_show");
+
+ b.HasIndex("ShowsID")
+ .HasDatabaseName("ix_link_collection_show_shows_id");
+
+ b.ToTable("link_collection_show");
+ });
+
+ modelBuilder.Entity("GenreShow", b =>
+ {
+ b.Property("GenresID")
+ .HasColumnType("integer")
+ .HasColumnName("genres_id");
+
+ b.Property("ShowsID")
+ .HasColumnType("integer")
+ .HasColumnName("shows_id");
+
+ b.HasKey("GenresID", "ShowsID")
+ .HasName("pk_link_show_genre");
+
+ b.HasIndex("ShowsID")
+ .HasDatabaseName("ix_link_show_genre_shows_id");
+
+ b.ToTable("link_show_genre");
+ });
+
modelBuilder.Entity("Kyoo.Models.Collection", b =>
{
b.Property("ID")
@@ -234,120 +291,6 @@ namespace Kyoo.Postgresql.Migrations
b.ToView("library_items");
});
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("integer")
- .HasColumnName("first_id");
-
- b.Property("SecondID")
- .HasColumnType("integer")
- .HasColumnName("second_id");
-
- b.HasKey("FirstID", "SecondID")
- .HasName("pk_link_collection_show");
-
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_link_collection_show_second_id");
-
- b.ToTable("link_collection_show");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("integer")
- .HasColumnName("first_id");
-
- b.Property("SecondID")
- .HasColumnType("integer")
- .HasColumnName("second_id");
-
- b.HasKey("FirstID", "SecondID")
- .HasName("pk_link_library_collection");
-
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_link_library_collection_second_id");
-
- b.ToTable("link_library_collection");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("integer")
- .HasColumnName("first_id");
-
- b.Property("SecondID")
- .HasColumnType("integer")
- .HasColumnName("second_id");
-
- b.HasKey("FirstID", "SecondID")
- .HasName("pk_link_library_provider");
-
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_link_library_provider_second_id");
-
- b.ToTable("link_library_provider");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("integer")
- .HasColumnName("first_id");
-
- b.Property("SecondID")
- .HasColumnType("integer")
- .HasColumnName("second_id");
-
- b.HasKey("FirstID", "SecondID")
- .HasName("pk_link_library_show");
-
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_link_library_show_second_id");
-
- b.ToTable("link_library_show");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("integer")
- .HasColumnName("first_id");
-
- b.Property("SecondID")
- .HasColumnType("integer")
- .HasColumnName("second_id");
-
- b.HasKey("FirstID", "SecondID")
- .HasName("pk_link_show_genre");
-
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_link_show_genre_second_id");
-
- b.ToTable("link_show_genre");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("integer")
- .HasColumnName("first_id");
-
- b.Property("SecondID")
- .HasColumnType("integer")
- .HasColumnName("second_id");
-
- b.HasKey("FirstID", "SecondID")
- .HasName("pk_link_user_show");
-
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_link_user_show_second_id");
-
- b.ToTable("link_user_show");
- });
-
modelBuilder.Entity("Kyoo.Models.People", b =>
{
b.Property("ID")
@@ -427,10 +370,6 @@ namespace Kyoo.Postgresql.Migrations
.HasColumnType("jsonb")
.HasColumnName("images");
- b.Property("LogoExtension")
- .HasColumnType("text")
- .HasColumnName("logo_extension");
-
b.Property("Name")
.HasColumnType("text")
.HasColumnName("name");
@@ -681,6 +620,10 @@ namespace Kyoo.Postgresql.Migrations
.HasColumnType("jsonb")
.HasColumnName("extra_data");
+ b.Property>("Images")
+ .HasColumnType("jsonb")
+ .HasColumnName("images");
+
b.Property("Password")
.HasColumnType("text")
.HasColumnName("password");
@@ -710,27 +653,84 @@ namespace Kyoo.Postgresql.Migrations
modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b =>
{
- b.Property("FirstID")
+ b.Property("UserID")
.HasColumnType("integer")
- .HasColumnName("first_id");
+ .HasColumnName("user_id");
- b.Property("SecondID")
+ b.Property("EpisodeID")
.HasColumnType("integer")
- .HasColumnName("second_id");
+ .HasColumnName("episode_id");
b.Property("WatchedPercentage")
.HasColumnType("integer")
.HasColumnName("watched_percentage");
- b.HasKey("FirstID", "SecondID")
+ b.HasKey("UserID", "EpisodeID")
.HasName("pk_watched_episodes");
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_watched_episodes_second_id");
+ b.HasIndex("EpisodeID")
+ .HasDatabaseName("ix_watched_episodes_episode_id");
b.ToTable("watched_episodes");
});
+ modelBuilder.Entity("LibraryProvider", b =>
+ {
+ b.Property("LibrariesID")
+ .HasColumnType("integer")
+ .HasColumnName("libraries_id");
+
+ b.Property("ProvidersID")
+ .HasColumnType("integer")
+ .HasColumnName("providers_id");
+
+ b.HasKey("LibrariesID", "ProvidersID")
+ .HasName("pk_link_library_provider");
+
+ b.HasIndex("ProvidersID")
+ .HasDatabaseName("ix_link_library_provider_providers_id");
+
+ b.ToTable("link_library_provider");
+ });
+
+ modelBuilder.Entity("LibraryShow", b =>
+ {
+ b.Property("LibrariesID")
+ .HasColumnType("integer")
+ .HasColumnName("libraries_id");
+
+ b.Property("ShowsID")
+ .HasColumnType("integer")
+ .HasColumnName("shows_id");
+
+ b.HasKey("LibrariesID", "ShowsID")
+ .HasName("pk_link_library_show");
+
+ b.HasIndex("ShowsID")
+ .HasDatabaseName("ix_link_library_show_shows_id");
+
+ b.ToTable("link_library_show");
+ });
+
+ modelBuilder.Entity("ShowUser", b =>
+ {
+ b.Property("UsersID")
+ .HasColumnType("integer")
+ .HasColumnName("users_id");
+
+ b.Property("WatchedID")
+ .HasColumnType("integer")
+ .HasColumnName("watched_id");
+
+ b.HasKey("UsersID", "WatchedID")
+ .HasName("pk_link_user_show");
+
+ b.HasIndex("WatchedID")
+ .HasDatabaseName("ix_link_user_show_watched_id");
+
+ b.ToTable("link_user_show");
+ });
+
modelBuilder.Entity("collection_metadata_id", b =>
{
b.Property("ResourceID")
@@ -893,6 +893,57 @@ namespace Kyoo.Postgresql.Migrations
b.ToTable("studio_metadata_id");
});
+ modelBuilder.Entity("CollectionLibrary", b =>
+ {
+ b.HasOne("Kyoo.Models.Collection", null)
+ .WithMany()
+ .HasForeignKey("CollectionsID")
+ .HasConstraintName("fk_link_library_collection_collections_collections_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Library", null)
+ .WithMany()
+ .HasForeignKey("LibrariesID")
+ .HasConstraintName("fk_link_library_collection_libraries_libraries_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("CollectionShow", b =>
+ {
+ b.HasOne("Kyoo.Models.Collection", null)
+ .WithMany()
+ .HasForeignKey("CollectionsID")
+ .HasConstraintName("fk_link_collection_show_collections_collections_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Show", null)
+ .WithMany()
+ .HasForeignKey("ShowsID")
+ .HasConstraintName("fk_link_collection_show_shows_shows_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("GenreShow", b =>
+ {
+ b.HasOne("Kyoo.Models.Genre", null)
+ .WithMany()
+ .HasForeignKey("GenresID")
+ .HasConstraintName("fk_link_show_genre_genres_genres_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Show", null)
+ .WithMany()
+ .HasForeignKey("ShowsID")
+ .HasConstraintName("fk_link_show_genre_shows_shows_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
modelBuilder.Entity("Kyoo.Models.Episode", b =>
{
b.HasOne("Kyoo.Models.Season", "Season")
@@ -913,132 +964,6 @@ namespace Kyoo.Postgresql.Migrations
b.Navigation("Show");
});
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.HasOne("Kyoo.Models.Collection", "First")
- .WithMany("ShowLinks")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_link_collection_show_collections_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Show", "Second")
- .WithMany("CollectionLinks")
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_link_collection_show_shows_second_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("First");
-
- b.Navigation("Second");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.HasOne("Kyoo.Models.Library", "First")
- .WithMany("CollectionLinks")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_link_library_collection_libraries_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Collection", "Second")
- .WithMany("LibraryLinks")
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_link_library_collection_collections_second_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("First");
-
- b.Navigation("Second");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.HasOne("Kyoo.Models.Library", "First")
- .WithMany("ProviderLinks")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_link_library_provider_libraries_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Provider", "Second")
- .WithMany("LibraryLinks")
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_link_library_provider_providers_second_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("First");
-
- b.Navigation("Second");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.HasOne("Kyoo.Models.Library", "First")
- .WithMany("ShowLinks")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_link_library_show_libraries_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Show", "Second")
- .WithMany("LibraryLinks")
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_link_library_show_shows_second_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("First");
-
- b.Navigation("Second");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.HasOne("Kyoo.Models.Show", "First")
- .WithMany("GenreLinks")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_link_show_genre_shows_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Genre", "Second")
- .WithMany("ShowLinks")
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_link_show_genre_genres_second_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("First");
-
- b.Navigation("Second");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.HasOne("Kyoo.Models.User", "First")
- .WithMany("ShowLinks")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_link_user_show_users_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Show", "Second")
- .WithMany()
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_link_user_show_shows_second_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("First");
-
- b.Navigation("Second");
- });
-
modelBuilder.Entity("Kyoo.Models.PeopleRole", b =>
{
b.HasOne("Kyoo.Models.People", "People")
@@ -1097,23 +1022,72 @@ namespace Kyoo.Postgresql.Migrations
modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b =>
{
- b.HasOne("Kyoo.Models.User", "First")
- .WithMany("CurrentlyWatching")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_watched_episodes_users_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Episode", "Second")
+ b.HasOne("Kyoo.Models.Episode", "Episode")
.WithMany()
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_watched_episodes_episodes_second_id")
+ .HasForeignKey("EpisodeID")
+ .HasConstraintName("fk_watched_episodes_episodes_episode_id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
- b.Navigation("First");
+ b.HasOne("Kyoo.Models.User", null)
+ .WithMany("CurrentlyWatching")
+ .HasForeignKey("UserID")
+ .HasConstraintName("fk_watched_episodes_users_user_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
- b.Navigation("Second");
+ b.Navigation("Episode");
+ });
+
+ modelBuilder.Entity("LibraryProvider", b =>
+ {
+ b.HasOne("Kyoo.Models.Library", null)
+ .WithMany()
+ .HasForeignKey("LibrariesID")
+ .HasConstraintName("fk_link_library_provider_libraries_libraries_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Provider", null)
+ .WithMany()
+ .HasForeignKey("ProvidersID")
+ .HasConstraintName("fk_link_library_provider_providers_providers_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("LibraryShow", b =>
+ {
+ b.HasOne("Kyoo.Models.Library", null)
+ .WithMany()
+ .HasForeignKey("LibrariesID")
+ .HasConstraintName("fk_link_library_show_libraries_libraries_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Show", null)
+ .WithMany()
+ .HasForeignKey("ShowsID")
+ .HasConstraintName("fk_link_library_show_shows_shows_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("ShowUser", b =>
+ {
+ b.HasOne("Kyoo.Models.User", null)
+ .WithMany()
+ .HasForeignKey("UsersID")
+ .HasConstraintName("fk_link_user_show_users_users_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Show", null)
+ .WithMany()
+ .HasForeignKey("WatchedID")
+ .HasConstraintName("fk_link_user_show_shows_watched_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
});
modelBuilder.Entity("collection_metadata_id", b =>
@@ -1233,10 +1207,6 @@ namespace Kyoo.Postgresql.Migrations
modelBuilder.Entity("Kyoo.Models.Collection", b =>
{
b.Navigation("ExternalIDs");
-
- b.Navigation("LibraryLinks");
-
- b.Navigation("ShowLinks");
});
modelBuilder.Entity("Kyoo.Models.Episode", b =>
@@ -1246,20 +1216,6 @@ namespace Kyoo.Postgresql.Migrations
b.Navigation("Tracks");
});
- modelBuilder.Entity("Kyoo.Models.Genre", b =>
- {
- b.Navigation("ShowLinks");
- });
-
- modelBuilder.Entity("Kyoo.Models.Library", b =>
- {
- b.Navigation("CollectionLinks");
-
- b.Navigation("ProviderLinks");
-
- b.Navigation("ShowLinks");
- });
-
modelBuilder.Entity("Kyoo.Models.People", b =>
{
b.Navigation("ExternalIDs");
@@ -1267,11 +1223,6 @@ namespace Kyoo.Postgresql.Migrations
b.Navigation("Roles");
});
- modelBuilder.Entity("Kyoo.Models.Provider", b =>
- {
- b.Navigation("LibraryLinks");
- });
-
modelBuilder.Entity("Kyoo.Models.Season", b =>
{
b.Navigation("Episodes");
@@ -1281,16 +1232,10 @@ namespace Kyoo.Postgresql.Migrations
modelBuilder.Entity("Kyoo.Models.Show", b =>
{
- b.Navigation("CollectionLinks");
-
b.Navigation("Episodes");
b.Navigation("ExternalIDs");
- b.Navigation("GenreLinks");
-
- b.Navigation("LibraryLinks");
-
b.Navigation("People");
b.Navigation("Seasons");
@@ -1306,8 +1251,6 @@ namespace Kyoo.Postgresql.Migrations
modelBuilder.Entity("Kyoo.Models.User", b =>
{
b.Navigation("CurrentlyWatching");
-
- b.Navigation("ShowLinks");
});
#pragma warning restore 612, 618
}
diff --git a/Kyoo.Postgresql/Migrations/20210728141410_Initial.cs b/Kyoo.Postgresql/Migrations/20210730183548_Initial.cs
similarity index 90%
rename from Kyoo.Postgresql/Migrations/20210728141410_Initial.cs
rename to Kyoo.Postgresql/Migrations/20210730183548_Initial.cs
index 46c09222..dc37cba9 100644
--- a/Kyoo.Postgresql/Migrations/20210728141410_Initial.cs
+++ b/Kyoo.Postgresql/Migrations/20210730183548_Initial.cs
@@ -83,8 +83,7 @@ namespace Kyoo.Postgresql.Migrations
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
slug = table.Column(type: "text", nullable: false),
name = table.Column(type: "text", nullable: true),
- images = table.Column>(type: "jsonb", nullable: true),
- logo_extension = table.Column(type: "text", nullable: true)
+ images = table.Column>(type: "jsonb", nullable: true)
},
constraints: table =>
{
@@ -116,7 +115,8 @@ namespace Kyoo.Postgresql.Migrations
email = table.Column(type: "text", nullable: true),
password = table.Column(type: "text", nullable: true),
permissions = table.Column(type: "text[]", nullable: true),
- extra_data = table.Column>(type: "jsonb", nullable: true)
+ extra_data = table.Column>(type: "jsonb", nullable: true),
+ images = table.Column>(type: "jsonb", nullable: true)
},
constraints: table =>
{
@@ -127,21 +127,21 @@ namespace Kyoo.Postgresql.Migrations
name: "link_library_collection",
columns: table => new
{
- first_id = table.Column(type: "integer", nullable: false),
- second_id = table.Column(type: "integer", nullable: false)
+ collections_id = table.Column(type: "integer", nullable: false),
+ libraries_id = table.Column(type: "integer", nullable: false)
},
constraints: table =>
{
- table.PrimaryKey("pk_link_library_collection", x => new { x.first_id, x.second_id });
+ table.PrimaryKey("pk_link_library_collection", x => new { x.collections_id, x.libraries_id });
table.ForeignKey(
- name: "fk_link_library_collection_collections_second_id",
- column: x => x.second_id,
+ name: "fk_link_library_collection_collections_collections_id",
+ column: x => x.collections_id,
principalTable: "collections",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
- name: "fk_link_library_collection_libraries_first_id",
- column: x => x.first_id,
+ name: "fk_link_library_collection_libraries_libraries_id",
+ column: x => x.libraries_id,
principalTable: "libraries",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
@@ -177,21 +177,21 @@ namespace Kyoo.Postgresql.Migrations
name: "link_library_provider",
columns: table => new
{
- first_id = table.Column(type: "integer", nullable: false),
- second_id = table.Column(type: "integer", nullable: false)
+ libraries_id = table.Column(type: "integer", nullable: false),
+ providers_id = table.Column(type: "integer", nullable: false)
},
constraints: table =>
{
- table.PrimaryKey("pk_link_library_provider", x => new { x.first_id, x.second_id });
+ table.PrimaryKey("pk_link_library_provider", x => new { x.libraries_id, x.providers_id });
table.ForeignKey(
- name: "fk_link_library_provider_libraries_first_id",
- column: x => x.first_id,
+ name: "fk_link_library_provider_libraries_libraries_id",
+ column: x => x.libraries_id,
principalTable: "libraries",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
- name: "fk_link_library_provider_providers_second_id",
- column: x => x.second_id,
+ name: "fk_link_library_provider_providers_providers_id",
+ column: x => x.providers_id,
principalTable: "providers",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
@@ -282,21 +282,21 @@ namespace Kyoo.Postgresql.Migrations
name: "link_collection_show",
columns: table => new
{
- first_id = table.Column(type: "integer", nullable: false),
- second_id = table.Column(type: "integer", nullable: false)
+ collections_id = table.Column(type: "integer", nullable: false),
+ shows_id = table.Column(type: "integer", nullable: false)
},
constraints: table =>
{
- table.PrimaryKey("pk_link_collection_show", x => new { x.first_id, x.second_id });
+ table.PrimaryKey("pk_link_collection_show", x => new { x.collections_id, x.shows_id });
table.ForeignKey(
- name: "fk_link_collection_show_collections_first_id",
- column: x => x.first_id,
+ name: "fk_link_collection_show_collections_collections_id",
+ column: x => x.collections_id,
principalTable: "collections",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
- name: "fk_link_collection_show_shows_second_id",
- column: x => x.second_id,
+ name: "fk_link_collection_show_shows_shows_id",
+ column: x => x.shows_id,
principalTable: "shows",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
@@ -306,21 +306,21 @@ namespace Kyoo.Postgresql.Migrations
name: "link_library_show",
columns: table => new
{
- first_id = table.Column(type: "integer", nullable: false),
- second_id = table.Column(type: "integer", nullable: false)
+ libraries_id = table.Column(type: "integer", nullable: false),
+ shows_id = table.Column(type: "integer", nullable: false)
},
constraints: table =>
{
- table.PrimaryKey("pk_link_library_show", x => new { x.first_id, x.second_id });
+ table.PrimaryKey("pk_link_library_show", x => new { x.libraries_id, x.shows_id });
table.ForeignKey(
- name: "fk_link_library_show_libraries_first_id",
- column: x => x.first_id,
+ name: "fk_link_library_show_libraries_libraries_id",
+ column: x => x.libraries_id,
principalTable: "libraries",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
- name: "fk_link_library_show_shows_second_id",
- column: x => x.second_id,
+ name: "fk_link_library_show_shows_shows_id",
+ column: x => x.shows_id,
principalTable: "shows",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
@@ -330,21 +330,21 @@ namespace Kyoo.Postgresql.Migrations
name: "link_show_genre",
columns: table => new
{
- first_id = table.Column(type: "integer", nullable: false),
- second_id = table.Column(type: "integer", nullable: false)
+ genres_id = table.Column(type: "integer", nullable: false),
+ shows_id = table.Column(type: "integer", nullable: false)
},
constraints: table =>
{
- table.PrimaryKey("pk_link_show_genre", x => new { x.first_id, x.second_id });
+ table.PrimaryKey("pk_link_show_genre", x => new { x.genres_id, x.shows_id });
table.ForeignKey(
- name: "fk_link_show_genre_genres_second_id",
- column: x => x.second_id,
+ name: "fk_link_show_genre_genres_genres_id",
+ column: x => x.genres_id,
principalTable: "genres",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
- name: "fk_link_show_genre_shows_first_id",
- column: x => x.first_id,
+ name: "fk_link_show_genre_shows_shows_id",
+ column: x => x.shows_id,
principalTable: "shows",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
@@ -354,21 +354,21 @@ namespace Kyoo.Postgresql.Migrations
name: "link_user_show",
columns: table => new
{
- first_id = table.Column(type: "integer", nullable: false),
- second_id = table.Column(type: "integer", nullable: false)
+ users_id = table.Column(type: "integer", nullable: false),
+ watched_id = table.Column(type: "integer", nullable: false)
},
constraints: table =>
{
- table.PrimaryKey("pk_link_user_show", x => new { x.first_id, x.second_id });
+ table.PrimaryKey("pk_link_user_show", x => new { x.users_id, x.watched_id });
table.ForeignKey(
- name: "fk_link_user_show_shows_second_id",
- column: x => x.second_id,
+ name: "fk_link_user_show_shows_watched_id",
+ column: x => x.watched_id,
principalTable: "shows",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
- name: "fk_link_user_show_users_first_id",
- column: x => x.first_id,
+ name: "fk_link_user_show_users_users_id",
+ column: x => x.users_id,
principalTable: "users",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
@@ -574,22 +574,22 @@ namespace Kyoo.Postgresql.Migrations
name: "watched_episodes",
columns: table => new
{
- first_id = table.Column(type: "integer", nullable: false),
- second_id = table.Column(type: "integer", nullable: false),
+ user_id = table.Column(type: "integer", nullable: false),
+ episode_id = table.Column(type: "integer", nullable: false),
watched_percentage = table.Column(type: "integer", nullable: false)
},
constraints: table =>
{
- table.PrimaryKey("pk_watched_episodes", x => new { x.first_id, x.second_id });
+ table.PrimaryKey("pk_watched_episodes", x => new { x.user_id, x.episode_id });
table.ForeignKey(
- name: "fk_watched_episodes_episodes_second_id",
- column: x => x.second_id,
+ name: "fk_watched_episodes_episodes_episode_id",
+ column: x => x.episode_id,
principalTable: "episodes",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
- name: "fk_watched_episodes_users_first_id",
- column: x => x.first_id,
+ name: "fk_watched_episodes_users_user_id",
+ column: x => x.user_id,
principalTable: "users",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
@@ -641,34 +641,34 @@ namespace Kyoo.Postgresql.Migrations
unique: true);
migrationBuilder.CreateIndex(
- name: "ix_link_collection_show_second_id",
+ name: "ix_link_collection_show_shows_id",
table: "link_collection_show",
- column: "second_id");
+ column: "shows_id");
migrationBuilder.CreateIndex(
- name: "ix_link_library_collection_second_id",
+ name: "ix_link_library_collection_libraries_id",
table: "link_library_collection",
- column: "second_id");
+ column: "libraries_id");
migrationBuilder.CreateIndex(
- name: "ix_link_library_provider_second_id",
+ name: "ix_link_library_provider_providers_id",
table: "link_library_provider",
- column: "second_id");
+ column: "providers_id");
migrationBuilder.CreateIndex(
- name: "ix_link_library_show_second_id",
+ name: "ix_link_library_show_shows_id",
table: "link_library_show",
- column: "second_id");
+ column: "shows_id");
migrationBuilder.CreateIndex(
- name: "ix_link_show_genre_second_id",
+ name: "ix_link_show_genre_shows_id",
table: "link_show_genre",
- column: "second_id");
+ column: "shows_id");
migrationBuilder.CreateIndex(
- name: "ix_link_user_show_second_id",
+ name: "ix_link_user_show_watched_id",
table: "link_user_show",
- column: "second_id");
+ column: "watched_id");
migrationBuilder.CreateIndex(
name: "ix_people_slug",
@@ -760,9 +760,9 @@ namespace Kyoo.Postgresql.Migrations
unique: true);
migrationBuilder.CreateIndex(
- name: "ix_watched_episodes_second_id",
+ name: "ix_watched_episodes_episode_id",
table: "watched_episodes",
- column: "second_id");
+ column: "episode_id");
}
protected override void Down(MigrationBuilder migrationBuilder)
diff --git a/Kyoo.Postgresql/Migrations/20210728142213_Triggers.Designer.cs b/Kyoo.Postgresql/Migrations/20210730203102_Triggers.Designer.cs
similarity index 85%
rename from Kyoo.Postgresql/Migrations/20210728142213_Triggers.Designer.cs
rename to Kyoo.Postgresql/Migrations/20210730203102_Triggers.Designer.cs
index 708cd23b..ff1ae33b 100644
--- a/Kyoo.Postgresql/Migrations/20210728142213_Triggers.Designer.cs
+++ b/Kyoo.Postgresql/Migrations/20210730203102_Triggers.Designer.cs
@@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
namespace Kyoo.Postgresql.Migrations
{
[DbContext(typeof(PostgresContext))]
- [Migration("20210728142213_Triggers")]
+ [Migration("20210730203102_Triggers")]
partial class Triggers
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
@@ -26,6 +26,63 @@ namespace Kyoo.Postgresql.Migrations
.HasAnnotation("ProductVersion", "5.0.8")
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+ modelBuilder.Entity("CollectionLibrary", b =>
+ {
+ b.Property("CollectionsID")
+ .HasColumnType("integer")
+ .HasColumnName("collections_id");
+
+ b.Property("LibrariesID")
+ .HasColumnType("integer")
+ .HasColumnName("libraries_id");
+
+ b.HasKey("CollectionsID", "LibrariesID")
+ .HasName("pk_link_library_collection");
+
+ b.HasIndex("LibrariesID")
+ .HasDatabaseName("ix_link_library_collection_libraries_id");
+
+ b.ToTable("link_library_collection");
+ });
+
+ modelBuilder.Entity("CollectionShow", b =>
+ {
+ b.Property("CollectionsID")
+ .HasColumnType("integer")
+ .HasColumnName("collections_id");
+
+ b.Property("ShowsID")
+ .HasColumnType("integer")
+ .HasColumnName("shows_id");
+
+ b.HasKey("CollectionsID", "ShowsID")
+ .HasName("pk_link_collection_show");
+
+ b.HasIndex("ShowsID")
+ .HasDatabaseName("ix_link_collection_show_shows_id");
+
+ b.ToTable("link_collection_show");
+ });
+
+ modelBuilder.Entity("GenreShow", b =>
+ {
+ b.Property("GenresID")
+ .HasColumnType("integer")
+ .HasColumnName("genres_id");
+
+ b.Property("ShowsID")
+ .HasColumnType("integer")
+ .HasColumnName("shows_id");
+
+ b.HasKey("GenresID", "ShowsID")
+ .HasName("pk_link_show_genre");
+
+ b.HasIndex("ShowsID")
+ .HasDatabaseName("ix_link_show_genre_shows_id");
+
+ b.ToTable("link_show_genre");
+ });
+
modelBuilder.Entity("Kyoo.Models.Collection", b =>
{
b.Property("ID")
@@ -234,120 +291,6 @@ namespace Kyoo.Postgresql.Migrations
b.ToView("library_items");
});
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("integer")
- .HasColumnName("first_id");
-
- b.Property("SecondID")
- .HasColumnType("integer")
- .HasColumnName("second_id");
-
- b.HasKey("FirstID", "SecondID")
- .HasName("pk_link_collection_show");
-
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_link_collection_show_second_id");
-
- b.ToTable("link_collection_show");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("integer")
- .HasColumnName("first_id");
-
- b.Property("SecondID")
- .HasColumnType("integer")
- .HasColumnName("second_id");
-
- b.HasKey("FirstID", "SecondID")
- .HasName("pk_link_library_collection");
-
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_link_library_collection_second_id");
-
- b.ToTable("link_library_collection");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("integer")
- .HasColumnName("first_id");
-
- b.Property("SecondID")
- .HasColumnType("integer")
- .HasColumnName("second_id");
-
- b.HasKey("FirstID", "SecondID")
- .HasName("pk_link_library_provider");
-
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_link_library_provider_second_id");
-
- b.ToTable("link_library_provider");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("integer")
- .HasColumnName("first_id");
-
- b.Property("SecondID")
- .HasColumnType("integer")
- .HasColumnName("second_id");
-
- b.HasKey("FirstID", "SecondID")
- .HasName("pk_link_library_show");
-
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_link_library_show_second_id");
-
- b.ToTable("link_library_show");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("integer")
- .HasColumnName("first_id");
-
- b.Property("SecondID")
- .HasColumnType("integer")
- .HasColumnName("second_id");
-
- b.HasKey("FirstID", "SecondID")
- .HasName("pk_link_show_genre");
-
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_link_show_genre_second_id");
-
- b.ToTable("link_show_genre");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("integer")
- .HasColumnName("first_id");
-
- b.Property("SecondID")
- .HasColumnType("integer")
- .HasColumnName("second_id");
-
- b.HasKey("FirstID", "SecondID")
- .HasName("pk_link_user_show");
-
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_link_user_show_second_id");
-
- b.ToTable("link_user_show");
- });
-
modelBuilder.Entity("Kyoo.Models.People", b =>
{
b.Property("ID")
@@ -427,10 +370,6 @@ namespace Kyoo.Postgresql.Migrations
.HasColumnType("jsonb")
.HasColumnName("images");
- b.Property("LogoExtension")
- .HasColumnType("text")
- .HasColumnName("logo_extension");
-
b.Property("Name")
.HasColumnType("text")
.HasColumnName("name");
@@ -681,6 +620,10 @@ namespace Kyoo.Postgresql.Migrations
.HasColumnType("jsonb")
.HasColumnName("extra_data");
+ b.Property>("Images")
+ .HasColumnType("jsonb")
+ .HasColumnName("images");
+
b.Property("Password")
.HasColumnType("text")
.HasColumnName("password");
@@ -710,27 +653,84 @@ namespace Kyoo.Postgresql.Migrations
modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b =>
{
- b.Property("FirstID")
+ b.Property("UserID")
.HasColumnType("integer")
- .HasColumnName("first_id");
+ .HasColumnName("user_id");
- b.Property("SecondID")
+ b.Property("EpisodeID")
.HasColumnType("integer")
- .HasColumnName("second_id");
+ .HasColumnName("episode_id");
b.Property("WatchedPercentage")
.HasColumnType("integer")
.HasColumnName("watched_percentage");
- b.HasKey("FirstID", "SecondID")
+ b.HasKey("UserID", "EpisodeID")
.HasName("pk_watched_episodes");
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_watched_episodes_second_id");
+ b.HasIndex("EpisodeID")
+ .HasDatabaseName("ix_watched_episodes_episode_id");
b.ToTable("watched_episodes");
});
+ modelBuilder.Entity("LibraryProvider", b =>
+ {
+ b.Property("LibrariesID")
+ .HasColumnType("integer")
+ .HasColumnName("libraries_id");
+
+ b.Property("ProvidersID")
+ .HasColumnType("integer")
+ .HasColumnName("providers_id");
+
+ b.HasKey("LibrariesID", "ProvidersID")
+ .HasName("pk_link_library_provider");
+
+ b.HasIndex("ProvidersID")
+ .HasDatabaseName("ix_link_library_provider_providers_id");
+
+ b.ToTable("link_library_provider");
+ });
+
+ modelBuilder.Entity("LibraryShow", b =>
+ {
+ b.Property("LibrariesID")
+ .HasColumnType("integer")
+ .HasColumnName("libraries_id");
+
+ b.Property("ShowsID")
+ .HasColumnType("integer")
+ .HasColumnName("shows_id");
+
+ b.HasKey("LibrariesID", "ShowsID")
+ .HasName("pk_link_library_show");
+
+ b.HasIndex("ShowsID")
+ .HasDatabaseName("ix_link_library_show_shows_id");
+
+ b.ToTable("link_library_show");
+ });
+
+ modelBuilder.Entity("ShowUser", b =>
+ {
+ b.Property("UsersID")
+ .HasColumnType("integer")
+ .HasColumnName("users_id");
+
+ b.Property("WatchedID")
+ .HasColumnType("integer")
+ .HasColumnName("watched_id");
+
+ b.HasKey("UsersID", "WatchedID")
+ .HasName("pk_link_user_show");
+
+ b.HasIndex("WatchedID")
+ .HasDatabaseName("ix_link_user_show_watched_id");
+
+ b.ToTable("link_user_show");
+ });
+
modelBuilder.Entity("collection_metadata_id", b =>
{
b.Property("ResourceID")
@@ -893,6 +893,57 @@ namespace Kyoo.Postgresql.Migrations
b.ToTable("studio_metadata_id");
});
+ modelBuilder.Entity("CollectionLibrary", b =>
+ {
+ b.HasOne("Kyoo.Models.Collection", null)
+ .WithMany()
+ .HasForeignKey("CollectionsID")
+ .HasConstraintName("fk_link_library_collection_collections_collections_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Library", null)
+ .WithMany()
+ .HasForeignKey("LibrariesID")
+ .HasConstraintName("fk_link_library_collection_libraries_libraries_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("CollectionShow", b =>
+ {
+ b.HasOne("Kyoo.Models.Collection", null)
+ .WithMany()
+ .HasForeignKey("CollectionsID")
+ .HasConstraintName("fk_link_collection_show_collections_collections_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Show", null)
+ .WithMany()
+ .HasForeignKey("ShowsID")
+ .HasConstraintName("fk_link_collection_show_shows_shows_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("GenreShow", b =>
+ {
+ b.HasOne("Kyoo.Models.Genre", null)
+ .WithMany()
+ .HasForeignKey("GenresID")
+ .HasConstraintName("fk_link_show_genre_genres_genres_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Show", null)
+ .WithMany()
+ .HasForeignKey("ShowsID")
+ .HasConstraintName("fk_link_show_genre_shows_shows_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
modelBuilder.Entity("Kyoo.Models.Episode", b =>
{
b.HasOne("Kyoo.Models.Season", "Season")
@@ -913,132 +964,6 @@ namespace Kyoo.Postgresql.Migrations
b.Navigation("Show");
});
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.HasOne("Kyoo.Models.Collection", "First")
- .WithMany("ShowLinks")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_link_collection_show_collections_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Show", "Second")
- .WithMany("CollectionLinks")
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_link_collection_show_shows_second_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("First");
-
- b.Navigation("Second");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.HasOne("Kyoo.Models.Library", "First")
- .WithMany("CollectionLinks")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_link_library_collection_libraries_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Collection", "Second")
- .WithMany("LibraryLinks")
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_link_library_collection_collections_second_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("First");
-
- b.Navigation("Second");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.HasOne("Kyoo.Models.Library", "First")
- .WithMany("ProviderLinks")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_link_library_provider_libraries_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Provider", "Second")
- .WithMany("LibraryLinks")
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_link_library_provider_providers_second_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("First");
-
- b.Navigation("Second");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.HasOne("Kyoo.Models.Library", "First")
- .WithMany("ShowLinks")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_link_library_show_libraries_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Show", "Second")
- .WithMany("LibraryLinks")
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_link_library_show_shows_second_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("First");
-
- b.Navigation("Second");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.HasOne("Kyoo.Models.Show", "First")
- .WithMany("GenreLinks")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_link_show_genre_shows_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Genre", "Second")
- .WithMany("ShowLinks")
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_link_show_genre_genres_second_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("First");
-
- b.Navigation("Second");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.HasOne("Kyoo.Models.User", "First")
- .WithMany("ShowLinks")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_link_user_show_users_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Show", "Second")
- .WithMany()
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_link_user_show_shows_second_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("First");
-
- b.Navigation("Second");
- });
-
modelBuilder.Entity("Kyoo.Models.PeopleRole", b =>
{
b.HasOne("Kyoo.Models.People", "People")
@@ -1097,23 +1022,72 @@ namespace Kyoo.Postgresql.Migrations
modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b =>
{
- b.HasOne("Kyoo.Models.User", "First")
- .WithMany("CurrentlyWatching")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_watched_episodes_users_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Episode", "Second")
+ b.HasOne("Kyoo.Models.Episode", "Episode")
.WithMany()
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_watched_episodes_episodes_second_id")
+ .HasForeignKey("EpisodeID")
+ .HasConstraintName("fk_watched_episodes_episodes_episode_id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
- b.Navigation("First");
+ b.HasOne("Kyoo.Models.User", null)
+ .WithMany("CurrentlyWatching")
+ .HasForeignKey("UserID")
+ .HasConstraintName("fk_watched_episodes_users_user_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
- b.Navigation("Second");
+ b.Navigation("Episode");
+ });
+
+ modelBuilder.Entity("LibraryProvider", b =>
+ {
+ b.HasOne("Kyoo.Models.Library", null)
+ .WithMany()
+ .HasForeignKey("LibrariesID")
+ .HasConstraintName("fk_link_library_provider_libraries_libraries_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Provider", null)
+ .WithMany()
+ .HasForeignKey("ProvidersID")
+ .HasConstraintName("fk_link_library_provider_providers_providers_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("LibraryShow", b =>
+ {
+ b.HasOne("Kyoo.Models.Library", null)
+ .WithMany()
+ .HasForeignKey("LibrariesID")
+ .HasConstraintName("fk_link_library_show_libraries_libraries_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Show", null)
+ .WithMany()
+ .HasForeignKey("ShowsID")
+ .HasConstraintName("fk_link_library_show_shows_shows_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("ShowUser", b =>
+ {
+ b.HasOne("Kyoo.Models.User", null)
+ .WithMany()
+ .HasForeignKey("UsersID")
+ .HasConstraintName("fk_link_user_show_users_users_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Show", null)
+ .WithMany()
+ .HasForeignKey("WatchedID")
+ .HasConstraintName("fk_link_user_show_shows_watched_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
});
modelBuilder.Entity("collection_metadata_id", b =>
@@ -1233,10 +1207,6 @@ namespace Kyoo.Postgresql.Migrations
modelBuilder.Entity("Kyoo.Models.Collection", b =>
{
b.Navigation("ExternalIDs");
-
- b.Navigation("LibraryLinks");
-
- b.Navigation("ShowLinks");
});
modelBuilder.Entity("Kyoo.Models.Episode", b =>
@@ -1246,20 +1216,6 @@ namespace Kyoo.Postgresql.Migrations
b.Navigation("Tracks");
});
- modelBuilder.Entity("Kyoo.Models.Genre", b =>
- {
- b.Navigation("ShowLinks");
- });
-
- modelBuilder.Entity("Kyoo.Models.Library", b =>
- {
- b.Navigation("CollectionLinks");
-
- b.Navigation("ProviderLinks");
-
- b.Navigation("ShowLinks");
- });
-
modelBuilder.Entity("Kyoo.Models.People", b =>
{
b.Navigation("ExternalIDs");
@@ -1267,11 +1223,6 @@ namespace Kyoo.Postgresql.Migrations
b.Navigation("Roles");
});
- modelBuilder.Entity("Kyoo.Models.Provider", b =>
- {
- b.Navigation("LibraryLinks");
- });
-
modelBuilder.Entity("Kyoo.Models.Season", b =>
{
b.Navigation("Episodes");
@@ -1281,16 +1232,10 @@ namespace Kyoo.Postgresql.Migrations
modelBuilder.Entity("Kyoo.Models.Show", b =>
{
- b.Navigation("CollectionLinks");
-
b.Navigation("Episodes");
b.Navigation("ExternalIDs");
- b.Navigation("GenreLinks");
-
- b.Navigation("LibraryLinks");
-
b.Navigation("People");
b.Navigation("Seasons");
@@ -1306,8 +1251,6 @@ namespace Kyoo.Postgresql.Migrations
modelBuilder.Entity("Kyoo.Models.User", b =>
{
b.Navigation("CurrentlyWatching");
-
- b.Navigation("ShowLinks");
});
#pragma warning restore 612, 618
}
diff --git a/Kyoo.Postgresql/Migrations/20210728142213_Triggers.cs b/Kyoo.Postgresql/Migrations/20210730203102_Triggers.cs
similarity index 98%
rename from Kyoo.Postgresql/Migrations/20210728142213_Triggers.cs
rename to Kyoo.Postgresql/Migrations/20210730203102_Triggers.cs
index d1933171..f84b767b 100644
--- a/Kyoo.Postgresql/Migrations/20210728142213_Triggers.cs
+++ b/Kyoo.Postgresql/Migrations/20210730203102_Triggers.cs
@@ -149,8 +149,8 @@ namespace Kyoo.Postgresql.Migrations
WHERE NOT (EXISTS (
SELECT 1
FROM link_collection_show AS l
- INNER JOIN collections AS c ON l.first_id = c.id
- WHERE s.id = l.second_id))
+ INNER JOIN collections AS c ON l.collections_id = c.id
+ WHERE s.id = l.shows_id))
UNION ALL
SELECT -c0.id, c0.slug, c0.name AS title, c0.overview, 'unknown'::status AS status,
NULL AS start_air, NULL AS end_air, c0.images, 'collection'::item_type AS type
diff --git a/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs b/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs
index f7db32a7..379b8d09 100644
--- a/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs
+++ b/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs
@@ -24,6 +24,63 @@ namespace Kyoo.Postgresql.Migrations
.HasAnnotation("ProductVersion", "5.0.8")
.HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+ modelBuilder.Entity("CollectionLibrary", b =>
+ {
+ b.Property("CollectionsID")
+ .HasColumnType("integer")
+ .HasColumnName("collections_id");
+
+ b.Property("LibrariesID")
+ .HasColumnType("integer")
+ .HasColumnName("libraries_id");
+
+ b.HasKey("CollectionsID", "LibrariesID")
+ .HasName("pk_link_library_collection");
+
+ b.HasIndex("LibrariesID")
+ .HasDatabaseName("ix_link_library_collection_libraries_id");
+
+ b.ToTable("link_library_collection");
+ });
+
+ modelBuilder.Entity("CollectionShow", b =>
+ {
+ b.Property("CollectionsID")
+ .HasColumnType("integer")
+ .HasColumnName("collections_id");
+
+ b.Property("ShowsID")
+ .HasColumnType("integer")
+ .HasColumnName("shows_id");
+
+ b.HasKey("CollectionsID", "ShowsID")
+ .HasName("pk_link_collection_show");
+
+ b.HasIndex("ShowsID")
+ .HasDatabaseName("ix_link_collection_show_shows_id");
+
+ b.ToTable("link_collection_show");
+ });
+
+ modelBuilder.Entity("GenreShow", b =>
+ {
+ b.Property("GenresID")
+ .HasColumnType("integer")
+ .HasColumnName("genres_id");
+
+ b.Property("ShowsID")
+ .HasColumnType("integer")
+ .HasColumnName("shows_id");
+
+ b.HasKey("GenresID", "ShowsID")
+ .HasName("pk_link_show_genre");
+
+ b.HasIndex("ShowsID")
+ .HasDatabaseName("ix_link_show_genre_shows_id");
+
+ b.ToTable("link_show_genre");
+ });
+
modelBuilder.Entity("Kyoo.Models.Collection", b =>
{
b.Property("ID")
@@ -232,120 +289,6 @@ namespace Kyoo.Postgresql.Migrations
b.ToView("library_items");
});
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("integer")
- .HasColumnName("first_id");
-
- b.Property("SecondID")
- .HasColumnType("integer")
- .HasColumnName("second_id");
-
- b.HasKey("FirstID", "SecondID")
- .HasName("pk_link_collection_show");
-
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_link_collection_show_second_id");
-
- b.ToTable("link_collection_show");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("integer")
- .HasColumnName("first_id");
-
- b.Property("SecondID")
- .HasColumnType("integer")
- .HasColumnName("second_id");
-
- b.HasKey("FirstID", "SecondID")
- .HasName("pk_link_library_collection");
-
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_link_library_collection_second_id");
-
- b.ToTable("link_library_collection");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("integer")
- .HasColumnName("first_id");
-
- b.Property("SecondID")
- .HasColumnType("integer")
- .HasColumnName("second_id");
-
- b.HasKey("FirstID", "SecondID")
- .HasName("pk_link_library_provider");
-
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_link_library_provider_second_id");
-
- b.ToTable("link_library_provider");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("integer")
- .HasColumnName("first_id");
-
- b.Property("SecondID")
- .HasColumnType("integer")
- .HasColumnName("second_id");
-
- b.HasKey("FirstID", "SecondID")
- .HasName("pk_link_library_show");
-
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_link_library_show_second_id");
-
- b.ToTable("link_library_show");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("integer")
- .HasColumnName("first_id");
-
- b.Property("SecondID")
- .HasColumnType("integer")
- .HasColumnName("second_id");
-
- b.HasKey("FirstID", "SecondID")
- .HasName("pk_link_show_genre");
-
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_link_show_genre_second_id");
-
- b.ToTable("link_show_genre");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("integer")
- .HasColumnName("first_id");
-
- b.Property("SecondID")
- .HasColumnType("integer")
- .HasColumnName("second_id");
-
- b.HasKey("FirstID", "SecondID")
- .HasName("pk_link_user_show");
-
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_link_user_show_second_id");
-
- b.ToTable("link_user_show");
- });
-
modelBuilder.Entity("Kyoo.Models.People", b =>
{
b.Property("ID")
@@ -425,10 +368,6 @@ namespace Kyoo.Postgresql.Migrations
.HasColumnType("jsonb")
.HasColumnName("images");
- b.Property("LogoExtension")
- .HasColumnType("text")
- .HasColumnName("logo_extension");
-
b.Property("Name")
.HasColumnType("text")
.HasColumnName("name");
@@ -679,6 +618,10 @@ namespace Kyoo.Postgresql.Migrations
.HasColumnType("jsonb")
.HasColumnName("extra_data");
+ b.Property>("Images")
+ .HasColumnType("jsonb")
+ .HasColumnName("images");
+
b.Property("Password")
.HasColumnType("text")
.HasColumnName("password");
@@ -708,27 +651,84 @@ namespace Kyoo.Postgresql.Migrations
modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b =>
{
- b.Property("FirstID")
+ b.Property("UserID")
.HasColumnType("integer")
- .HasColumnName("first_id");
+ .HasColumnName("user_id");
- b.Property("SecondID")
+ b.Property("EpisodeID")
.HasColumnType("integer")
- .HasColumnName("second_id");
+ .HasColumnName("episode_id");
b.Property("WatchedPercentage")
.HasColumnType("integer")
.HasColumnName("watched_percentage");
- b.HasKey("FirstID", "SecondID")
+ b.HasKey("UserID", "EpisodeID")
.HasName("pk_watched_episodes");
- b.HasIndex("SecondID")
- .HasDatabaseName("ix_watched_episodes_second_id");
+ b.HasIndex("EpisodeID")
+ .HasDatabaseName("ix_watched_episodes_episode_id");
b.ToTable("watched_episodes");
});
+ modelBuilder.Entity("LibraryProvider", b =>
+ {
+ b.Property("LibrariesID")
+ .HasColumnType("integer")
+ .HasColumnName("libraries_id");
+
+ b.Property("ProvidersID")
+ .HasColumnType("integer")
+ .HasColumnName("providers_id");
+
+ b.HasKey("LibrariesID", "ProvidersID")
+ .HasName("pk_link_library_provider");
+
+ b.HasIndex("ProvidersID")
+ .HasDatabaseName("ix_link_library_provider_providers_id");
+
+ b.ToTable("link_library_provider");
+ });
+
+ modelBuilder.Entity("LibraryShow", b =>
+ {
+ b.Property("LibrariesID")
+ .HasColumnType("integer")
+ .HasColumnName("libraries_id");
+
+ b.Property("ShowsID")
+ .HasColumnType("integer")
+ .HasColumnName("shows_id");
+
+ b.HasKey("LibrariesID", "ShowsID")
+ .HasName("pk_link_library_show");
+
+ b.HasIndex("ShowsID")
+ .HasDatabaseName("ix_link_library_show_shows_id");
+
+ b.ToTable("link_library_show");
+ });
+
+ modelBuilder.Entity("ShowUser", b =>
+ {
+ b.Property("UsersID")
+ .HasColumnType("integer")
+ .HasColumnName("users_id");
+
+ b.Property("WatchedID")
+ .HasColumnType("integer")
+ .HasColumnName("watched_id");
+
+ b.HasKey("UsersID", "WatchedID")
+ .HasName("pk_link_user_show");
+
+ b.HasIndex("WatchedID")
+ .HasDatabaseName("ix_link_user_show_watched_id");
+
+ b.ToTable("link_user_show");
+ });
+
modelBuilder.Entity("collection_metadata_id", b =>
{
b.Property("ResourceID")
@@ -891,6 +891,57 @@ namespace Kyoo.Postgresql.Migrations
b.ToTable("studio_metadata_id");
});
+ modelBuilder.Entity("CollectionLibrary", b =>
+ {
+ b.HasOne("Kyoo.Models.Collection", null)
+ .WithMany()
+ .HasForeignKey("CollectionsID")
+ .HasConstraintName("fk_link_library_collection_collections_collections_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Library", null)
+ .WithMany()
+ .HasForeignKey("LibrariesID")
+ .HasConstraintName("fk_link_library_collection_libraries_libraries_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("CollectionShow", b =>
+ {
+ b.HasOne("Kyoo.Models.Collection", null)
+ .WithMany()
+ .HasForeignKey("CollectionsID")
+ .HasConstraintName("fk_link_collection_show_collections_collections_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Show", null)
+ .WithMany()
+ .HasForeignKey("ShowsID")
+ .HasConstraintName("fk_link_collection_show_shows_shows_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("GenreShow", b =>
+ {
+ b.HasOne("Kyoo.Models.Genre", null)
+ .WithMany()
+ .HasForeignKey("GenresID")
+ .HasConstraintName("fk_link_show_genre_genres_genres_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Show", null)
+ .WithMany()
+ .HasForeignKey("ShowsID")
+ .HasConstraintName("fk_link_show_genre_shows_shows_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
modelBuilder.Entity("Kyoo.Models.Episode", b =>
{
b.HasOne("Kyoo.Models.Season", "Season")
@@ -911,132 +962,6 @@ namespace Kyoo.Postgresql.Migrations
b.Navigation("Show");
});
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.HasOne("Kyoo.Models.Collection", "First")
- .WithMany("ShowLinks")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_link_collection_show_collections_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Show", "Second")
- .WithMany("CollectionLinks")
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_link_collection_show_shows_second_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("First");
-
- b.Navigation("Second");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.HasOne("Kyoo.Models.Library", "First")
- .WithMany("CollectionLinks")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_link_library_collection_libraries_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Collection", "Second")
- .WithMany("LibraryLinks")
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_link_library_collection_collections_second_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("First");
-
- b.Navigation("Second");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.HasOne("Kyoo.Models.Library", "First")
- .WithMany("ProviderLinks")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_link_library_provider_libraries_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Provider", "Second")
- .WithMany("LibraryLinks")
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_link_library_provider_providers_second_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("First");
-
- b.Navigation("Second");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.HasOne("Kyoo.Models.Library", "First")
- .WithMany("ShowLinks")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_link_library_show_libraries_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Show", "Second")
- .WithMany("LibraryLinks")
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_link_library_show_shows_second_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("First");
-
- b.Navigation("Second");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.HasOne("Kyoo.Models.Show", "First")
- .WithMany("GenreLinks")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_link_show_genre_shows_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Genre", "Second")
- .WithMany("ShowLinks")
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_link_show_genre_genres_second_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("First");
-
- b.Navigation("Second");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.HasOne("Kyoo.Models.User", "First")
- .WithMany("ShowLinks")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_link_user_show_users_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Show", "Second")
- .WithMany()
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_link_user_show_shows_second_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.Navigation("First");
-
- b.Navigation("Second");
- });
-
modelBuilder.Entity("Kyoo.Models.PeopleRole", b =>
{
b.HasOne("Kyoo.Models.People", "People")
@@ -1095,23 +1020,72 @@ namespace Kyoo.Postgresql.Migrations
modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b =>
{
- b.HasOne("Kyoo.Models.User", "First")
- .WithMany("CurrentlyWatching")
- .HasForeignKey("FirstID")
- .HasConstraintName("fk_watched_episodes_users_first_id")
- .OnDelete(DeleteBehavior.Cascade)
- .IsRequired();
-
- b.HasOne("Kyoo.Models.Episode", "Second")
+ b.HasOne("Kyoo.Models.Episode", "Episode")
.WithMany()
- .HasForeignKey("SecondID")
- .HasConstraintName("fk_watched_episodes_episodes_second_id")
+ .HasForeignKey("EpisodeID")
+ .HasConstraintName("fk_watched_episodes_episodes_episode_id")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
- b.Navigation("First");
+ b.HasOne("Kyoo.Models.User", null)
+ .WithMany("CurrentlyWatching")
+ .HasForeignKey("UserID")
+ .HasConstraintName("fk_watched_episodes_users_user_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
- b.Navigation("Second");
+ b.Navigation("Episode");
+ });
+
+ modelBuilder.Entity("LibraryProvider", b =>
+ {
+ b.HasOne("Kyoo.Models.Library", null)
+ .WithMany()
+ .HasForeignKey("LibrariesID")
+ .HasConstraintName("fk_link_library_provider_libraries_libraries_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Provider", null)
+ .WithMany()
+ .HasForeignKey("ProvidersID")
+ .HasConstraintName("fk_link_library_provider_providers_providers_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("LibraryShow", b =>
+ {
+ b.HasOne("Kyoo.Models.Library", null)
+ .WithMany()
+ .HasForeignKey("LibrariesID")
+ .HasConstraintName("fk_link_library_show_libraries_libraries_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Show", null)
+ .WithMany()
+ .HasForeignKey("ShowsID")
+ .HasConstraintName("fk_link_library_show_shows_shows_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("ShowUser", b =>
+ {
+ b.HasOne("Kyoo.Models.User", null)
+ .WithMany()
+ .HasForeignKey("UsersID")
+ .HasConstraintName("fk_link_user_show_users_users_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Show", null)
+ .WithMany()
+ .HasForeignKey("WatchedID")
+ .HasConstraintName("fk_link_user_show_shows_watched_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
});
modelBuilder.Entity("collection_metadata_id", b =>
@@ -1231,10 +1205,6 @@ namespace Kyoo.Postgresql.Migrations
modelBuilder.Entity("Kyoo.Models.Collection", b =>
{
b.Navigation("ExternalIDs");
-
- b.Navigation("LibraryLinks");
-
- b.Navigation("ShowLinks");
});
modelBuilder.Entity("Kyoo.Models.Episode", b =>
@@ -1244,20 +1214,6 @@ namespace Kyoo.Postgresql.Migrations
b.Navigation("Tracks");
});
- modelBuilder.Entity("Kyoo.Models.Genre", b =>
- {
- b.Navigation("ShowLinks");
- });
-
- modelBuilder.Entity("Kyoo.Models.Library", b =>
- {
- b.Navigation("CollectionLinks");
-
- b.Navigation("ProviderLinks");
-
- b.Navigation("ShowLinks");
- });
-
modelBuilder.Entity("Kyoo.Models.People", b =>
{
b.Navigation("ExternalIDs");
@@ -1265,11 +1221,6 @@ namespace Kyoo.Postgresql.Migrations
b.Navigation("Roles");
});
- modelBuilder.Entity("Kyoo.Models.Provider", b =>
- {
- b.Navigation("LibraryLinks");
- });
-
modelBuilder.Entity("Kyoo.Models.Season", b =>
{
b.Navigation("Episodes");
@@ -1279,16 +1230,10 @@ namespace Kyoo.Postgresql.Migrations
modelBuilder.Entity("Kyoo.Models.Show", b =>
{
- b.Navigation("CollectionLinks");
-
b.Navigation("Episodes");
b.Navigation("ExternalIDs");
- b.Navigation("GenreLinks");
-
- b.Navigation("LibraryLinks");
-
b.Navigation("People");
b.Navigation("Seasons");
@@ -1304,8 +1249,6 @@ namespace Kyoo.Postgresql.Migrations
modelBuilder.Entity("Kyoo.Models.User", b =>
{
b.Navigation("CurrentlyWatching");
-
- b.Navigation("ShowLinks");
});
#pragma warning restore 612, 618
}
diff --git a/Kyoo.Postgresql/PostgresContext.cs b/Kyoo.Postgresql/PostgresContext.cs
index 09f460bc..eaea9927 100644
--- a/Kyoo.Postgresql/PostgresContext.cs
+++ b/Kyoo.Postgresql/PostgresContext.cs
@@ -122,6 +122,9 @@ namespace Kyoo.Postgresql
modelBuilder.Entity()
.Property(x => x.Images)
.HasColumnType("jsonb");
+ modelBuilder.Entity()
+ .Property(x => x.Images)
+ .HasColumnType("jsonb");
base.OnModelCreating(modelBuilder);
}
@@ -132,6 +135,13 @@ namespace Kyoo.Postgresql
SnakeCaseNameRewriter rewriter = new(CultureInfo.InvariantCulture);
return rewriter.RewriteName(typeof(T).Name + nameof(MetadataID));
}
+
+ ///
+ protected override string LinkName()
+ {
+ SnakeCaseNameRewriter rewriter = new(CultureInfo.InvariantCulture);
+ return rewriter.RewriteName("Link" + typeof(T).Name + typeof(T2).Name);
+ }
///
protected override bool IsDuplicateException(Exception ex)
diff --git a/Kyoo.Postgresql/PostgresModule.cs b/Kyoo.Postgresql/PostgresModule.cs
index 124df770..6b84bd93 100644
--- a/Kyoo.Postgresql/PostgresModule.cs
+++ b/Kyoo.Postgresql/PostgresModule.cs
@@ -66,7 +66,7 @@ namespace Kyoo.Postgresql
x.UseNpgsql(_configuration.GetDatabaseConnection("postgres"));
if (_environment.IsDevelopment())
x.EnableDetailedErrors().EnableSensitiveDataLogging();
- });
+ }, ServiceLifetime.Transient);
}
///
diff --git a/Kyoo.SqLite/Migrations/20210728134952_Initial.Designer.cs b/Kyoo.SqLite/Migrations/20210730203155_Initial.Designer.cs
similarity index 81%
rename from Kyoo.SqLite/Migrations/20210728134952_Initial.Designer.cs
rename to Kyoo.SqLite/Migrations/20210730203155_Initial.Designer.cs
index 3f4290b7..48b89a25 100644
--- a/Kyoo.SqLite/Migrations/20210728134952_Initial.Designer.cs
+++ b/Kyoo.SqLite/Migrations/20210730203155_Initial.Designer.cs
@@ -9,7 +9,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace Kyoo.SqLite.Migrations
{
[DbContext(typeof(SqLiteContext))]
- [Migration("20210728134952_Initial")]
+ [Migration("20210730203155_Initial")]
partial class Initial
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
@@ -18,6 +18,21 @@ namespace Kyoo.SqLite.Migrations
modelBuilder
.HasAnnotation("ProductVersion", "5.0.8");
+ modelBuilder.Entity("CollectionLibrary", b =>
+ {
+ b.Property("CollectionsID")
+ .HasColumnType("INTEGER");
+
+ b.Property("LibrariesID")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("CollectionsID", "LibrariesID");
+
+ b.HasIndex("LibrariesID");
+
+ b.ToTable("LinkLibraryCollection");
+ });
+
modelBuilder.Entity("CollectionMetadataID", b =>
{
b.Property("ResourceID")
@@ -39,6 +54,21 @@ namespace Kyoo.SqLite.Migrations
b.ToTable("CollectionMetadataID");
});
+ modelBuilder.Entity("CollectionShow", b =>
+ {
+ b.Property("CollectionsID")
+ .HasColumnType("INTEGER");
+
+ b.Property("ShowsID")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("CollectionsID", "ShowsID");
+
+ b.HasIndex("ShowsID");
+
+ b.ToTable("LinkCollectionShow");
+ });
+
modelBuilder.Entity("EpisodeMetadataID", b =>
{
b.Property("ResourceID")
@@ -60,6 +90,21 @@ namespace Kyoo.SqLite.Migrations
b.ToTable("EpisodeMetadataID");
});
+ modelBuilder.Entity("GenreShow", b =>
+ {
+ b.Property("GenresID")
+ .HasColumnType("INTEGER");
+
+ b.Property("ShowsID")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("GenresID", "ShowsID");
+
+ b.HasIndex("ShowsID");
+
+ b.ToTable("LinkShowGenre");
+ });
+
modelBuilder.Entity("Kyoo.Models.Collection", b =>
{
b.Property("ID")
@@ -220,96 +265,6 @@ namespace Kyoo.SqLite.Migrations
b.ToView("LibraryItems");
});
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("INTEGER");
-
- b.Property("SecondID")
- .HasColumnType("INTEGER");
-
- b.HasKey("FirstID", "SecondID");
-
- b.HasIndex("SecondID");
-
- b.ToTable("Link");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("INTEGER");
-
- b.Property("SecondID")
- .HasColumnType("INTEGER");
-
- b.HasKey("FirstID", "SecondID");
-
- b.HasIndex("SecondID");
-
- b.ToTable("Link");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("INTEGER");
-
- b.Property("SecondID")
- .HasColumnType("INTEGER");
-
- b.HasKey("FirstID", "SecondID");
-
- b.HasIndex("SecondID");
-
- b.ToTable("Link");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("INTEGER");
-
- b.Property("SecondID")
- .HasColumnType("INTEGER");
-
- b.HasKey("FirstID", "SecondID");
-
- b.HasIndex("SecondID");
-
- b.ToTable("Link");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("INTEGER");
-
- b.Property("SecondID")
- .HasColumnType("INTEGER");
-
- b.HasKey("FirstID", "SecondID");
-
- b.HasIndex("SecondID");
-
- b.ToTable("Link");
- });
-
- modelBuilder.Entity("Kyoo.Models.Link", b =>
- {
- b.Property("FirstID")
- .HasColumnType("INTEGER");
-
- b.Property("SecondID")
- .HasColumnType("INTEGER");
-
- b.HasKey("FirstID", "SecondID");
-
- b.HasIndex("SecondID");
-
- b.ToTable("Link");
- });
-
modelBuilder.Entity("Kyoo.Models.People", b =>
{
b.Property