diff --git a/back/.config/dotnet-tools.json b/back/.config/dotnet-tools.json new file mode 100644 index 00000000..b4a41b06 --- /dev/null +++ b/back/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-ef": { + "version": "7.0.7", + "commands": [ + "dotnet-ef" + ] + } + } +} \ No newline at end of file diff --git a/back/src/Kyoo.Core/Controllers/Repositories/EpisodeRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/EpisodeRepository.cs index be329f3c..ee07ac4d 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/EpisodeRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/EpisodeRepository.cs @@ -61,9 +61,11 @@ namespace Kyoo.Core.Controllers /// Create a new . /// /// The database handle to use. + /// A show repository /// A provider repository /// A track repository public EpisodeRepository(DatabaseContext database, + IShowRepository shows, IProviderRepository providers, ITrackRepository tracks) : base(database) @@ -71,6 +73,14 @@ namespace Kyoo.Core.Controllers _database = database; _providers = providers; _tracks = tracks; + + // Edit episode slugs when the show's slug changes. + shows.OnEdited += async (show) => + { + foreach (Episode ep in _database.Episodes.Where(x => x.ShowID == show.ID)) + ep.ShowSlug = show.Slug; + await _database.SaveChangesAsync(); + }; } /// diff --git a/back/src/Kyoo.Core/Controllers/Repositories/SeasonRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/SeasonRepository.cs index a512fa6a..965097f7 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/SeasonRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/SeasonRepository.cs @@ -50,13 +50,23 @@ namespace Kyoo.Core.Controllers /// Create a new . /// /// The database handle that will be used + /// A shows repository /// A provider repository public SeasonRepository(DatabaseContext database, + IShowRepository shows, IProviderRepository providers) : base(database) { _database = database; _providers = providers; + + // Edit seasons slugs when the show's slug changes. + shows.OnEdited += async (show) => + { + foreach (Season season in _database.Seasons.Where(x => x.ShowID == show.ID)) + season.ShowSlug = show.Slug; + await _database.SaveChangesAsync(); + }; } /// diff --git a/back/src/Kyoo.Postgresql/Migrations/20230621074246_RemoveTrigers.Designer.cs b/back/src/Kyoo.Postgresql/Migrations/20230621074246_RemoveTrigers.Designer.cs new file mode 100644 index 00000000..58f1b145 --- /dev/null +++ b/back/src/Kyoo.Postgresql/Migrations/20230621074246_RemoveTrigers.Designer.cs @@ -0,0 +1,1258 @@ +// +using System; +using System.Collections.Generic; +using Kyoo.Abstractions.Models; +using Kyoo.Postgresql; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +namespace Kyoo.Postgresql.Migrations +{ + [DbContext(typeof(PostgresContext))] + [Migration("20230621074246_RemoveTrigers")] + partial class RemoveTrigers + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasPostgresEnum(null, "item_type", new[] { "show", "movie", "collection" }) + .HasPostgresEnum(null, "status", new[] { "unknown", "finished", "airing", "planned" }) + .HasPostgresEnum(null, "stream_type", new[] { "unknown", "video", "audio", "subtitle" }) + .HasAnnotation("Relational:MaxIdentifierLength", 63) + .HasAnnotation("ProductVersion", "5.0.7") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + modelBuilder.Entity("Kyoo.Abstractions.Models.Collection", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Overview") + .HasColumnType("text") + .HasColumnName("overview"); + + b.Property("Slug") + .IsRequired() + .HasColumnType("text") + .HasColumnName("slug"); + + b.HasKey("ID") + .HasName("pk_collections"); + + b.HasIndex("Slug") + .IsUnique() + .HasDatabaseName("ix_collections_slug"); + + b.ToTable("collections"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.Episode", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("AbsoluteNumber") + .HasColumnType("integer") + .HasColumnName("absolute_number"); + + b.Property("EpisodeNumber") + .HasColumnType("integer") + .HasColumnName("episode_number"); + + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + + b.Property("Overview") + .HasColumnType("text") + .HasColumnName("overview"); + + b.Property("Path") + .HasColumnType("text") + .HasColumnName("path"); + + b.Property("ReleaseDate") + .HasColumnType("timestamp without time zone") + .HasColumnName("release_date"); + + b.Property("SeasonID") + .HasColumnType("integer") + .HasColumnName("season_id"); + + b.Property("SeasonNumber") + .HasColumnType("integer") + .HasColumnName("season_number"); + + b.Property("ShowID") + .HasColumnType("integer") + .HasColumnName("show_id"); + + b.Property("Slug") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("text") + .HasColumnName("slug"); + + b.Property("Title") + .HasColumnType("text") + .HasColumnName("title"); + + b.HasKey("ID") + .HasName("pk_episodes"); + + b.HasIndex("SeasonID") + .HasDatabaseName("ix_episodes_season_id"); + + b.HasIndex("Slug") + .IsUnique() + .HasDatabaseName("ix_episodes_slug"); + + b.HasIndex("ShowID", "SeasonNumber", "EpisodeNumber", "AbsoluteNumber") + .IsUnique() + .HasDatabaseName("ix_episodes_show_id_season_number_episode_number_absolute_numb"); + + b.ToTable("episodes"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.Genre", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Slug") + .IsRequired() + .HasColumnType("text") + .HasColumnName("slug"); + + b.HasKey("ID") + .HasName("pk_genres"); + + b.HasIndex("Slug") + .IsUnique() + .HasDatabaseName("ix_genres_slug"); + + b.ToTable("genres"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.Library", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Paths") + .HasColumnType("text[]") + .HasColumnName("paths"); + + b.Property("Slug") + .IsRequired() + .HasColumnType("text") + .HasColumnName("slug"); + + b.HasKey("ID") + .HasName("pk_libraries"); + + b.HasIndex("Slug") + .IsUnique() + .HasDatabaseName("ix_libraries_slug"); + + b.ToTable("libraries"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.LibraryItem", b => + { + b.Property("ID") + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("EndAir") + .HasColumnType("timestamp without time zone") + .HasColumnName("end_air"); + + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + + b.Property("Overview") + .HasColumnType("text") + .HasColumnName("overview"); + + b.Property("Slug") + .HasColumnType("text") + .HasColumnName("slug"); + + b.Property("StartAir") + .HasColumnType("timestamp without time zone") + .HasColumnName("start_air"); + + b.Property("Status") + .HasColumnType("status") + .HasColumnName("status"); + + b.Property("Title") + .HasColumnType("text") + .HasColumnName("title"); + + b.Property("Type") + .HasColumnType("item_type") + .HasColumnName("type"); + + b.HasKey("ID") + .HasName("pk_library_items"); + + b.ToView("library_items"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.People", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Slug") + .IsRequired() + .HasColumnType("text") + .HasColumnName("slug"); + + b.HasKey("ID") + .HasName("pk_people"); + + b.HasIndex("Slug") + .IsUnique() + .HasDatabaseName("ix_people_slug"); + + b.ToTable("people"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.PeopleRole", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("PeopleID") + .HasColumnType("integer") + .HasColumnName("people_id"); + + b.Property("Role") + .HasColumnType("text") + .HasColumnName("role"); + + b.Property("ShowID") + .HasColumnType("integer") + .HasColumnName("show_id"); + + b.Property("Type") + .HasColumnType("text") + .HasColumnName("type"); + + b.HasKey("ID") + .HasName("pk_people_roles"); + + b.HasIndex("PeopleID") + .HasDatabaseName("ix_people_roles_people_id"); + + b.HasIndex("ShowID") + .HasDatabaseName("ix_people_roles_show_id"); + + b.ToTable("people_roles"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.Provider", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Slug") + .IsRequired() + .HasColumnType("text") + .HasColumnName("slug"); + + b.HasKey("ID") + .HasName("pk_providers"); + + b.HasIndex("Slug") + .IsUnique() + .HasDatabaseName("ix_providers_slug"); + + b.ToTable("providers"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.Season", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("EndDate") + .HasColumnType("timestamp without time zone") + .HasColumnName("end_date"); + + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + + b.Property("Overview") + .HasColumnType("text") + .HasColumnName("overview"); + + b.Property("SeasonNumber") + .HasColumnType("integer") + .HasColumnName("season_number"); + + b.Property("ShowID") + .HasColumnType("integer") + .HasColumnName("show_id"); + + b.Property("Slug") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("text") + .HasColumnName("slug"); + + b.Property("StartDate") + .HasColumnType("timestamp without time zone") + .HasColumnName("start_date"); + + b.Property("Title") + .HasColumnType("text") + .HasColumnName("title"); + + b.HasKey("ID") + .HasName("pk_seasons"); + + b.HasIndex("Slug") + .IsUnique() + .HasDatabaseName("ix_seasons_slug"); + + b.HasIndex("ShowID", "SeasonNumber") + .IsUnique() + .HasDatabaseName("ix_seasons_show_id_season_number"); + + b.ToTable("seasons"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.Show", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Aliases") + .HasColumnType("text[]") + .HasColumnName("aliases"); + + 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("Overview") + .HasColumnType("text") + .HasColumnName("overview"); + + b.Property("Path") + .HasColumnType("text") + .HasColumnName("path"); + + b.Property("Slug") + .IsRequired() + .HasColumnType("text") + .HasColumnName("slug"); + + b.Property("StartAir") + .HasColumnType("timestamp without time zone") + .HasColumnName("start_air"); + + b.Property("Status") + .HasColumnType("status") + .HasColumnName("status"); + + b.Property("StudioID") + .HasColumnType("integer") + .HasColumnName("studio_id"); + + b.Property("Title") + .HasColumnType("text") + .HasColumnName("title"); + + b.HasKey("ID") + .HasName("pk_shows"); + + b.HasIndex("Slug") + .IsUnique() + .HasDatabaseName("ix_shows_slug"); + + b.HasIndex("StudioID") + .HasDatabaseName("ix_shows_studio_id"); + + b.ToTable("shows"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.Studio", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Slug") + .IsRequired() + .HasColumnType("text") + .HasColumnName("slug"); + + b.HasKey("ID") + .HasName("pk_studios"); + + b.HasIndex("Slug") + .IsUnique() + .HasDatabaseName("ix_studios_slug"); + + b.ToTable("studios"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.Track", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Codec") + .HasColumnType("text") + .HasColumnName("codec"); + + b.Property("EpisodeID") + .HasColumnType("integer") + .HasColumnName("episode_id"); + + b.Property("IsDefault") + .HasColumnType("boolean") + .HasColumnName("is_default"); + + b.Property("IsExternal") + .HasColumnType("boolean") + .HasColumnName("is_external"); + + b.Property("IsForced") + .HasColumnType("boolean") + .HasColumnName("is_forced"); + + b.Property("Language") + .HasColumnType("text") + .HasColumnName("language"); + + b.Property("Path") + .HasColumnType("text") + .HasColumnName("path"); + + b.Property("Slug") + .ValueGeneratedOnAddOrUpdate() + .HasColumnType("text") + .HasColumnName("slug"); + + b.Property("Title") + .HasColumnType("text") + .HasColumnName("title"); + + b.Property("TrackIndex") + .HasColumnType("integer") + .HasColumnName("track_index"); + + b.Property("Type") + .HasColumnType("stream_type") + .HasColumnName("type"); + + b.HasKey("ID") + .HasName("pk_tracks"); + + b.HasIndex("Slug") + .IsUnique() + .HasDatabaseName("ix_tracks_slug"); + + b.HasIndex("EpisodeID", "Type", "Language", "TrackIndex", "IsForced") + .IsUnique() + .HasDatabaseName("ix_tracks_episode_id_type_language_track_index_is_forced"); + + b.ToTable("tracks"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.User", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); + + b.Property("Email") + .HasColumnType("text") + .HasColumnName("email"); + + b.Property>("ExtraData") + .HasColumnType("jsonb") + .HasColumnName("extra_data"); + + b.Property>("Images") + .HasColumnType("jsonb") + .HasColumnName("images"); + + b.Property("Password") + .HasColumnType("text") + .HasColumnName("password"); + + b.Property("Permissions") + .HasColumnType("text[]") + .HasColumnName("permissions"); + + b.Property("Slug") + .IsRequired() + .HasColumnType("text") + .HasColumnName("slug"); + + b.Property("Username") + .HasColumnType("text") + .HasColumnName("username"); + + b.HasKey("ID") + .HasName("pk_users"); + + b.HasIndex("Slug") + .IsUnique() + .HasDatabaseName("ix_users_slug"); + + b.ToTable("users"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.WatchedEpisode", b => + { + b.Property("UserID") + .HasColumnType("integer") + .HasColumnName("user_id"); + + b.Property("EpisodeID") + .HasColumnType("integer") + .HasColumnName("episode_id"); + + b.Property("WatchedPercentage") + .HasColumnType("integer") + .HasColumnName("watched_percentage"); + + b.HasKey("UserID", "EpisodeID") + .HasName("pk_watched_episodes"); + + b.HasIndex("EpisodeID") + .HasDatabaseName("ix_watched_episodes_episode_id"); + + b.ToTable("watched_episodes"); + }); + + 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") + .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("link_collection_show", b => + { + b.Property("collection_id") + .HasColumnType("integer") + .HasColumnName("collection_id"); + + b.Property("show_id") + .HasColumnType("integer") + .HasColumnName("show_id"); + + b.HasKey("collection_id", "show_id") + .HasName("pk_link_collection_show"); + + b.HasIndex("show_id") + .HasDatabaseName("ix_link_collection_show_show_id"); + + b.ToTable("link_collection_show"); + }); + + modelBuilder.Entity("link_library_collection", b => + { + b.Property("collection_id") + .HasColumnType("integer") + .HasColumnName("collection_id"); + + b.Property("library_id") + .HasColumnType("integer") + .HasColumnName("library_id"); + + b.HasKey("collection_id", "library_id") + .HasName("pk_link_library_collection"); + + b.HasIndex("library_id") + .HasDatabaseName("ix_link_library_collection_library_id"); + + b.ToTable("link_library_collection"); + }); + + modelBuilder.Entity("link_library_provider", b => + { + b.Property("library_id") + .HasColumnType("integer") + .HasColumnName("library_id"); + + b.Property("provider_id") + .HasColumnType("integer") + .HasColumnName("provider_id"); + + b.HasKey("library_id", "provider_id") + .HasName("pk_link_library_provider"); + + b.HasIndex("provider_id") + .HasDatabaseName("ix_link_library_provider_provider_id"); + + b.ToTable("link_library_provider"); + }); + + modelBuilder.Entity("link_library_show", b => + { + b.Property("library_id") + .HasColumnType("integer") + .HasColumnName("library_id"); + + b.Property("show_id") + .HasColumnType("integer") + .HasColumnName("show_id"); + + b.HasKey("library_id", "show_id") + .HasName("pk_link_library_show"); + + b.HasIndex("show_id") + .HasDatabaseName("ix_link_library_show_show_id"); + + b.ToTable("link_library_show"); + }); + + modelBuilder.Entity("link_show_genre", b => + { + b.Property("genre_id") + .HasColumnType("integer") + .HasColumnName("genre_id"); + + b.Property("show_id") + .HasColumnType("integer") + .HasColumnName("show_id"); + + b.HasKey("genre_id", "show_id") + .HasName("pk_link_show_genre"); + + b.HasIndex("show_id") + .HasDatabaseName("ix_link_show_genre_show_id"); + + b.ToTable("link_show_genre"); + }); + + 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.Abstractions.Models.Episode", b => + { + b.HasOne("Kyoo.Abstractions.Models.Season", "Season") + .WithMany("Episodes") + .HasForeignKey("SeasonID") + .HasConstraintName("fk_episodes_seasons_season_id") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Kyoo.Abstractions.Models.Show", "Show") + .WithMany("Episodes") + .HasForeignKey("ShowID") + .HasConstraintName("fk_episodes_shows_show_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Season"); + + b.Navigation("Show"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.PeopleRole", b => + { + b.HasOne("Kyoo.Abstractions.Models.People", "People") + .WithMany("Roles") + .HasForeignKey("PeopleID") + .HasConstraintName("fk_people_roles_people_people_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Abstractions.Models.Show", "Show") + .WithMany("People") + .HasForeignKey("ShowID") + .HasConstraintName("fk_people_roles_shows_show_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("People"); + + b.Navigation("Show"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.Season", b => + { + b.HasOne("Kyoo.Abstractions.Models.Show", "Show") + .WithMany("Seasons") + .HasForeignKey("ShowID") + .HasConstraintName("fk_seasons_shows_show_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Show"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.Show", b => + { + b.HasOne("Kyoo.Abstractions.Models.Studio", "Studio") + .WithMany("Shows") + .HasForeignKey("StudioID") + .HasConstraintName("fk_shows_studios_studio_id") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Studio"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.Track", b => + { + b.HasOne("Kyoo.Abstractions.Models.Episode", "Episode") + .WithMany("Tracks") + .HasForeignKey("EpisodeID") + .HasConstraintName("fk_tracks_episodes_episode_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Episode"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.WatchedEpisode", b => + { + b.HasOne("Kyoo.Abstractions.Models.Episode", "Episode") + .WithMany() + .HasForeignKey("EpisodeID") + .HasConstraintName("fk_watched_episodes_episodes_episode_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Abstractions.Models.User", null) + .WithMany("CurrentlyWatching") + .HasForeignKey("UserID") + .HasConstraintName("fk_watched_episodes_users_user_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Episode"); + }); + + modelBuilder.Entity("ShowUser", b => + { + b.HasOne("Kyoo.Abstractions.Models.User", null) + .WithMany() + .HasForeignKey("UsersID") + .HasConstraintName("fk_link_user_show_users_users_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Abstractions.Models.Show", null) + .WithMany() + .HasForeignKey("WatchedID") + .HasConstraintName("fk_link_user_show_shows_watched_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("collection_metadata_id", b => + { + b.HasOne("Kyoo.Abstractions.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_collection_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Abstractions.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.Abstractions.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_episode_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Abstractions.Models.Episode", null) + .WithMany("ExternalIDs") + .HasForeignKey("ResourceID") + .HasConstraintName("fk_episode_metadata_id_episodes_episode_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Provider"); + }); + + modelBuilder.Entity("link_collection_show", b => + { + b.HasOne("Kyoo.Abstractions.Models.Collection", null) + .WithMany() + .HasForeignKey("collection_id") + .HasConstraintName("fk_link_collection_show_collections_collection_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Abstractions.Models.Show", null) + .WithMany() + .HasForeignKey("show_id") + .HasConstraintName("fk_link_collection_show_shows_show_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("link_library_collection", b => + { + b.HasOne("Kyoo.Abstractions.Models.Collection", null) + .WithMany() + .HasForeignKey("collection_id") + .HasConstraintName("fk_link_library_collection_collections_collection_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Abstractions.Models.Library", null) + .WithMany() + .HasForeignKey("library_id") + .HasConstraintName("fk_link_library_collection_libraries_library_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("link_library_provider", b => + { + b.HasOne("Kyoo.Abstractions.Models.Library", null) + .WithMany() + .HasForeignKey("library_id") + .HasConstraintName("fk_link_library_provider_libraries_library_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Abstractions.Models.Provider", null) + .WithMany() + .HasForeignKey("provider_id") + .HasConstraintName("fk_link_library_provider_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("link_library_show", b => + { + b.HasOne("Kyoo.Abstractions.Models.Library", null) + .WithMany() + .HasForeignKey("library_id") + .HasConstraintName("fk_link_library_show_libraries_library_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Abstractions.Models.Show", null) + .WithMany() + .HasForeignKey("show_id") + .HasConstraintName("fk_link_library_show_shows_show_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("link_show_genre", b => + { + b.HasOne("Kyoo.Abstractions.Models.Genre", null) + .WithMany() + .HasForeignKey("genre_id") + .HasConstraintName("fk_link_show_genre_genres_genre_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Abstractions.Models.Show", null) + .WithMany() + .HasForeignKey("show_id") + .HasConstraintName("fk_link_show_genre_shows_show_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("people_metadata_id", b => + { + b.HasOne("Kyoo.Abstractions.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_people_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Abstractions.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.Abstractions.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_season_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Abstractions.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.Abstractions.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_show_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Abstractions.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.Abstractions.Models.Provider", "Provider") + .WithMany() + .HasForeignKey("ProviderID") + .HasConstraintName("fk_studio_metadata_id_providers_provider_id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Kyoo.Abstractions.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.Abstractions.Models.Collection", b => + { + b.Navigation("ExternalIDs"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.Episode", b => + { + b.Navigation("ExternalIDs"); + + b.Navigation("Tracks"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.People", b => + { + b.Navigation("ExternalIDs"); + + b.Navigation("Roles"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.Season", b => + { + b.Navigation("Episodes"); + + b.Navigation("ExternalIDs"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.Show", b => + { + b.Navigation("Episodes"); + + b.Navigation("ExternalIDs"); + + b.Navigation("People"); + + b.Navigation("Seasons"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.Studio", b => + { + b.Navigation("ExternalIDs"); + + b.Navigation("Shows"); + }); + + modelBuilder.Entity("Kyoo.Abstractions.Models.User", b => + { + b.Navigation("CurrentlyWatching"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/back/src/Kyoo.Postgresql/Migrations/20230621074246_RemoveTrigers.cs b/back/src/Kyoo.Postgresql/Migrations/20230621074246_RemoveTrigers.cs new file mode 100644 index 00000000..69275171 --- /dev/null +++ b/back/src/Kyoo.Postgresql/Migrations/20230621074246_RemoveTrigers.cs @@ -0,0 +1,50 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Kyoo.Postgresql.Migrations +{ + public partial class RemoveTrigers : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterDatabase() + .Annotation("Npgsql:Enum:item_type", "show,movie,collection") + .Annotation("Npgsql:Enum:status", "unknown,finished,airing,planned") + .Annotation("Npgsql:Enum:stream_type", "unknown,video,audio,subtitle") + .OldAnnotation("Npgsql:Enum:item_type", "show,movie,collection") + .OldAnnotation("Npgsql:Enum:status", "unknown,finished,airing,planned") + .OldAnnotation("Npgsql:Enum:stream_type", "unknown,video,audio,subtitle,attachment"); + + // language=PostgreSQL + migrationBuilder.Sql("DROP TRIGGER show_slug_trigger ON shows;"); + // language=PostgreSQL + migrationBuilder.Sql(@"DROP FUNCTION show_slug_update;"); + // language=PostgreSQL + migrationBuilder.Sql(@"DROP TRIGGER season_slug_trigger ON seasons;"); + // language=PostgreSQL + migrationBuilder.Sql(@"DROP FUNCTION season_slug_update;"); + // language=PostgreSQL + migrationBuilder.Sql("DROP TRIGGER episode_slug_trigger ON episodes;"); + // language=PostgreSQL + migrationBuilder.Sql(@"DROP FUNCTION episode_slug_update;"); + // language=PostgreSQL + migrationBuilder.Sql("DROP TRIGGER track_slug_trigger ON tracks;"); + // language=PostgreSQL + migrationBuilder.Sql(@"DROP FUNCTION track_slug_update;"); + // language=PostgreSQL + migrationBuilder.Sql("DROP TRIGGER episode_track_slug_trigger ON episodes;"); + // language=PostgreSQL + migrationBuilder.Sql(@"DROP FUNCTION episode_update_tracks_slug;"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterDatabase() + .Annotation("Npgsql:Enum:item_type", "show,movie,collection") + .Annotation("Npgsql:Enum:status", "unknown,finished,airing,planned") + .Annotation("Npgsql:Enum:stream_type", "unknown,video,audio,subtitle,attachment") + .OldAnnotation("Npgsql:Enum:item_type", "show,movie,collection") + .OldAnnotation("Npgsql:Enum:status", "unknown,finished,airing,planned") + .OldAnnotation("Npgsql:Enum:stream_type", "unknown,video,audio,subtitle"); + } + } +} diff --git a/back/src/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs b/back/src/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs index 94f265f1..2345f84d 100644 --- a/back/src/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs +++ b/back/src/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs @@ -1,4 +1,4 @@ -// +// using System; using System.Collections.Generic; using Kyoo.Abstractions.Models; @@ -19,12 +19,12 @@ namespace Kyoo.Postgresql.Migrations modelBuilder .HasPostgresEnum(null, "item_type", new[] { "show", "movie", "collection" }) .HasPostgresEnum(null, "status", new[] { "unknown", "finished", "airing", "planned" }) - .HasPostgresEnum(null, "stream_type", new[] { "unknown", "video", "audio", "subtitle", "attachment" }) + .HasPostgresEnum(null, "stream_type", new[] { "unknown", "video", "audio", "subtitle" }) .HasAnnotation("Relational:MaxIdentifierLength", 63) - .HasAnnotation("ProductVersion", "5.0.8") + .HasAnnotation("ProductVersion", "5.0.7") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - modelBuilder.Entity("Kyoo.Models.Collection", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.Collection", b => { b.Property("ID") .ValueGeneratedOnAdd() @@ -59,7 +59,7 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("collections"); }); - modelBuilder.Entity("Kyoo.Models.Episode", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.Episode", b => { b.Property("ID") .ValueGeneratedOnAdd() @@ -129,7 +129,7 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("episodes"); }); - modelBuilder.Entity("Kyoo.Models.Genre", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.Genre", b => { b.Property("ID") .ValueGeneratedOnAdd() @@ -156,7 +156,7 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("genres"); }); - modelBuilder.Entity("Kyoo.Models.Library", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.Library", b => { b.Property("ID") .ValueGeneratedOnAdd() @@ -187,7 +187,7 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("libraries"); }); - modelBuilder.Entity("Kyoo.Models.LibraryItem", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.LibraryItem", b => { b.Property("ID") .HasColumnType("integer") @@ -232,7 +232,7 @@ namespace Kyoo.Postgresql.Migrations b.ToView("library_items"); }); - modelBuilder.Entity("Kyoo.Models.People", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.People", b => { b.Property("ID") .ValueGeneratedOnAdd() @@ -263,7 +263,7 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("people"); }); - modelBuilder.Entity("Kyoo.Models.PeopleRole", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.PeopleRole", b => { b.Property("ID") .ValueGeneratedOnAdd() @@ -299,7 +299,7 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("people_roles"); }); - modelBuilder.Entity("Kyoo.Models.Provider", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.Provider", b => { b.Property("ID") .ValueGeneratedOnAdd() @@ -330,7 +330,7 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("providers"); }); - modelBuilder.Entity("Kyoo.Models.Season", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.Season", b => { b.Property("ID") .ValueGeneratedOnAdd() @@ -385,7 +385,7 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("seasons"); }); - modelBuilder.Entity("Kyoo.Models.Show", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.Show", b => { b.Property("ID") .ValueGeneratedOnAdd() @@ -451,7 +451,7 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("shows"); }); - modelBuilder.Entity("Kyoo.Models.Studio", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.Studio", b => { b.Property("ID") .ValueGeneratedOnAdd() @@ -478,7 +478,7 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("studios"); }); - modelBuilder.Entity("Kyoo.Models.Track", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.Track", b => { b.Property("ID") .ValueGeneratedOnAdd() @@ -545,7 +545,7 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("tracks"); }); - modelBuilder.Entity("Kyoo.Models.User", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.User", b => { b.Property("ID") .ValueGeneratedOnAdd() @@ -592,7 +592,7 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("users"); }); - modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.WatchedEpisode", b => { b.Property("UserID") .HasColumnType("integer") @@ -891,15 +891,15 @@ namespace Kyoo.Postgresql.Migrations b.ToTable("studio_metadata_id"); }); - modelBuilder.Entity("Kyoo.Models.Episode", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.Episode", b => { - b.HasOne("Kyoo.Models.Season", "Season") + b.HasOne("Kyoo.Abstractions.Models.Season", "Season") .WithMany("Episodes") .HasForeignKey("SeasonID") .HasConstraintName("fk_episodes_seasons_season_id") .OnDelete(DeleteBehavior.Cascade); - b.HasOne("Kyoo.Models.Show", "Show") + b.HasOne("Kyoo.Abstractions.Models.Show", "Show") .WithMany("Episodes") .HasForeignKey("ShowID") .HasConstraintName("fk_episodes_shows_show_id") @@ -911,16 +911,16 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Show"); }); - modelBuilder.Entity("Kyoo.Models.PeopleRole", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.PeopleRole", b => { - b.HasOne("Kyoo.Models.People", "People") + b.HasOne("Kyoo.Abstractions.Models.People", "People") .WithMany("Roles") .HasForeignKey("PeopleID") .HasConstraintName("fk_people_roles_people_people_id") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Kyoo.Models.Show", "Show") + b.HasOne("Kyoo.Abstractions.Models.Show", "Show") .WithMany("People") .HasForeignKey("ShowID") .HasConstraintName("fk_people_roles_shows_show_id") @@ -932,9 +932,9 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Show"); }); - modelBuilder.Entity("Kyoo.Models.Season", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.Season", b => { - b.HasOne("Kyoo.Models.Show", "Show") + b.HasOne("Kyoo.Abstractions.Models.Show", "Show") .WithMany("Seasons") .HasForeignKey("ShowID") .HasConstraintName("fk_seasons_shows_show_id") @@ -944,9 +944,9 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Show"); }); - modelBuilder.Entity("Kyoo.Models.Show", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.Show", b => { - b.HasOne("Kyoo.Models.Studio", "Studio") + b.HasOne("Kyoo.Abstractions.Models.Studio", "Studio") .WithMany("Shows") .HasForeignKey("StudioID") .HasConstraintName("fk_shows_studios_studio_id") @@ -955,9 +955,9 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Studio"); }); - modelBuilder.Entity("Kyoo.Models.Track", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.Track", b => { - b.HasOne("Kyoo.Models.Episode", "Episode") + b.HasOne("Kyoo.Abstractions.Models.Episode", "Episode") .WithMany("Tracks") .HasForeignKey("EpisodeID") .HasConstraintName("fk_tracks_episodes_episode_id") @@ -967,16 +967,16 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Episode"); }); - modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.WatchedEpisode", b => { - b.HasOne("Kyoo.Models.Episode", "Episode") + b.HasOne("Kyoo.Abstractions.Models.Episode", "Episode") .WithMany() .HasForeignKey("EpisodeID") .HasConstraintName("fk_watched_episodes_episodes_episode_id") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Kyoo.Models.User", null) + b.HasOne("Kyoo.Abstractions.Models.User", null) .WithMany("CurrentlyWatching") .HasForeignKey("UserID") .HasConstraintName("fk_watched_episodes_users_user_id") @@ -988,14 +988,14 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("ShowUser", b => { - b.HasOne("Kyoo.Models.User", null) + b.HasOne("Kyoo.Abstractions.Models.User", null) .WithMany() .HasForeignKey("UsersID") .HasConstraintName("fk_link_user_show_users_users_id") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Kyoo.Models.Show", null) + b.HasOne("Kyoo.Abstractions.Models.Show", null) .WithMany() .HasForeignKey("WatchedID") .HasConstraintName("fk_link_user_show_shows_watched_id") @@ -1005,14 +1005,14 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("collection_metadata_id", b => { - b.HasOne("Kyoo.Models.Provider", "Provider") + b.HasOne("Kyoo.Abstractions.Models.Provider", "Provider") .WithMany() .HasForeignKey("ProviderID") .HasConstraintName("fk_collection_metadata_id_providers_provider_id") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Kyoo.Models.Collection", null) + b.HasOne("Kyoo.Abstractions.Models.Collection", null) .WithMany("ExternalIDs") .HasForeignKey("ResourceID") .HasConstraintName("fk_collection_metadata_id_collections_collection_id") @@ -1024,14 +1024,14 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("episode_metadata_id", b => { - b.HasOne("Kyoo.Models.Provider", "Provider") + b.HasOne("Kyoo.Abstractions.Models.Provider", "Provider") .WithMany() .HasForeignKey("ProviderID") .HasConstraintName("fk_episode_metadata_id_providers_provider_id") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Kyoo.Models.Episode", null) + b.HasOne("Kyoo.Abstractions.Models.Episode", null) .WithMany("ExternalIDs") .HasForeignKey("ResourceID") .HasConstraintName("fk_episode_metadata_id_episodes_episode_id") @@ -1043,14 +1043,14 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("link_collection_show", b => { - b.HasOne("Kyoo.Models.Collection", null) + b.HasOne("Kyoo.Abstractions.Models.Collection", null) .WithMany() .HasForeignKey("collection_id") .HasConstraintName("fk_link_collection_show_collections_collection_id") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Kyoo.Models.Show", null) + b.HasOne("Kyoo.Abstractions.Models.Show", null) .WithMany() .HasForeignKey("show_id") .HasConstraintName("fk_link_collection_show_shows_show_id") @@ -1060,14 +1060,14 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("link_library_collection", b => { - b.HasOne("Kyoo.Models.Collection", null) + b.HasOne("Kyoo.Abstractions.Models.Collection", null) .WithMany() .HasForeignKey("collection_id") .HasConstraintName("fk_link_library_collection_collections_collection_id") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Kyoo.Models.Library", null) + b.HasOne("Kyoo.Abstractions.Models.Library", null) .WithMany() .HasForeignKey("library_id") .HasConstraintName("fk_link_library_collection_libraries_library_id") @@ -1077,14 +1077,14 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("link_library_provider", b => { - b.HasOne("Kyoo.Models.Library", null) + b.HasOne("Kyoo.Abstractions.Models.Library", null) .WithMany() .HasForeignKey("library_id") .HasConstraintName("fk_link_library_provider_libraries_library_id") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Kyoo.Models.Provider", null) + b.HasOne("Kyoo.Abstractions.Models.Provider", null) .WithMany() .HasForeignKey("provider_id") .HasConstraintName("fk_link_library_provider_providers_provider_id") @@ -1094,14 +1094,14 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("link_library_show", b => { - b.HasOne("Kyoo.Models.Library", null) + b.HasOne("Kyoo.Abstractions.Models.Library", null) .WithMany() .HasForeignKey("library_id") .HasConstraintName("fk_link_library_show_libraries_library_id") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Kyoo.Models.Show", null) + b.HasOne("Kyoo.Abstractions.Models.Show", null) .WithMany() .HasForeignKey("show_id") .HasConstraintName("fk_link_library_show_shows_show_id") @@ -1111,14 +1111,14 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("link_show_genre", b => { - b.HasOne("Kyoo.Models.Genre", null) + b.HasOne("Kyoo.Abstractions.Models.Genre", null) .WithMany() .HasForeignKey("genre_id") .HasConstraintName("fk_link_show_genre_genres_genre_id") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Kyoo.Models.Show", null) + b.HasOne("Kyoo.Abstractions.Models.Show", null) .WithMany() .HasForeignKey("show_id") .HasConstraintName("fk_link_show_genre_shows_show_id") @@ -1128,14 +1128,14 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("people_metadata_id", b => { - b.HasOne("Kyoo.Models.Provider", "Provider") + b.HasOne("Kyoo.Abstractions.Models.Provider", "Provider") .WithMany() .HasForeignKey("ProviderID") .HasConstraintName("fk_people_metadata_id_providers_provider_id") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Kyoo.Models.People", null) + b.HasOne("Kyoo.Abstractions.Models.People", null) .WithMany("ExternalIDs") .HasForeignKey("ResourceID") .HasConstraintName("fk_people_metadata_id_people_people_id") @@ -1147,14 +1147,14 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("season_metadata_id", b => { - b.HasOne("Kyoo.Models.Provider", "Provider") + b.HasOne("Kyoo.Abstractions.Models.Provider", "Provider") .WithMany() .HasForeignKey("ProviderID") .HasConstraintName("fk_season_metadata_id_providers_provider_id") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Kyoo.Models.Season", null) + b.HasOne("Kyoo.Abstractions.Models.Season", null) .WithMany("ExternalIDs") .HasForeignKey("ResourceID") .HasConstraintName("fk_season_metadata_id_seasons_season_id") @@ -1166,14 +1166,14 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("show_metadata_id", b => { - b.HasOne("Kyoo.Models.Provider", "Provider") + b.HasOne("Kyoo.Abstractions.Models.Provider", "Provider") .WithMany() .HasForeignKey("ProviderID") .HasConstraintName("fk_show_metadata_id_providers_provider_id") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Kyoo.Models.Show", null) + b.HasOne("Kyoo.Abstractions.Models.Show", null) .WithMany("ExternalIDs") .HasForeignKey("ResourceID") .HasConstraintName("fk_show_metadata_id_shows_show_id") @@ -1185,14 +1185,14 @@ namespace Kyoo.Postgresql.Migrations modelBuilder.Entity("studio_metadata_id", b => { - b.HasOne("Kyoo.Models.Provider", "Provider") + b.HasOne("Kyoo.Abstractions.Models.Provider", "Provider") .WithMany() .HasForeignKey("ProviderID") .HasConstraintName("fk_studio_metadata_id_providers_provider_id") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); - b.HasOne("Kyoo.Models.Studio", null) + b.HasOne("Kyoo.Abstractions.Models.Studio", null) .WithMany("ExternalIDs") .HasForeignKey("ResourceID") .HasConstraintName("fk_studio_metadata_id_studios_studio_id") @@ -1202,33 +1202,33 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Provider"); }); - modelBuilder.Entity("Kyoo.Models.Collection", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.Collection", b => { b.Navigation("ExternalIDs"); }); - modelBuilder.Entity("Kyoo.Models.Episode", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.Episode", b => { b.Navigation("ExternalIDs"); b.Navigation("Tracks"); }); - modelBuilder.Entity("Kyoo.Models.People", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.People", b => { b.Navigation("ExternalIDs"); b.Navigation("Roles"); }); - modelBuilder.Entity("Kyoo.Models.Season", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.Season", b => { b.Navigation("Episodes"); b.Navigation("ExternalIDs"); }); - modelBuilder.Entity("Kyoo.Models.Show", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.Show", b => { b.Navigation("Episodes"); @@ -1239,14 +1239,14 @@ namespace Kyoo.Postgresql.Migrations b.Navigation("Seasons"); }); - modelBuilder.Entity("Kyoo.Models.Studio", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.Studio", b => { b.Navigation("ExternalIDs"); b.Navigation("Shows"); }); - modelBuilder.Entity("Kyoo.Models.User", b => + modelBuilder.Entity("Kyoo.Abstractions.Models.User", b => { b.Navigation("CurrentlyWatching"); });