diff --git a/Kyoo.SqLite/Kyoo.SqLite.csproj b/Kyoo.SqLite/Kyoo.SqLite.csproj
index ba87fa11..74665497 100644
--- a/Kyoo.SqLite/Kyoo.SqLite.csproj
+++ b/Kyoo.SqLite/Kyoo.SqLite.csproj
@@ -28,14 +28,14 @@
- all
- false
- runtime
+
+
+
- all
- false
- runtime
+
+
+
diff --git a/Kyoo.SqLite/Migrations/20210607202259_Initial.Designer.cs b/Kyoo.SqLite/Migrations/20210613135157_Initial.Designer.cs
similarity index 98%
rename from Kyoo.SqLite/Migrations/20210607202259_Initial.Designer.cs
rename to Kyoo.SqLite/Migrations/20210613135157_Initial.Designer.cs
index c0f57c7f..188c7b25 100644
--- a/Kyoo.SqLite/Migrations/20210607202259_Initial.Designer.cs
+++ b/Kyoo.SqLite/Migrations/20210613135157_Initial.Designer.cs
@@ -9,14 +9,14 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace Kyoo.SqLite.Migrations
{
[DbContext(typeof(SqLiteContext))]
- [Migration("20210607202259_Initial")]
+ [Migration("20210613135157_Initial")]
partial class Initial
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
- .HasAnnotation("ProductVersion", "5.0.6");
+ .HasAnnotation("ProductVersion", "5.0.7");
modelBuilder.Entity("Kyoo.Models.Collection", b =>
{
@@ -75,6 +75,9 @@ namespace Kyoo.SqLite.Migrations
b.Property("ShowID")
.HasColumnType("INTEGER");
+ b.Property("Slug")
+ .HasColumnType("TEXT");
+
b.Property("Thumb")
.HasColumnType("TEXT");
@@ -412,6 +415,9 @@ namespace Kyoo.SqLite.Migrations
b.Property("ShowID")
.HasColumnType("INTEGER");
+ b.Property("Slug")
+ .HasColumnType("TEXT");
+
b.Property("StartDate")
.HasColumnType("TEXT");
@@ -533,6 +539,9 @@ namespace Kyoo.SqLite.Migrations
b.Property("Path")
.HasColumnType("TEXT");
+ b.Property("Slug")
+ .HasColumnType("TEXT");
+
b.Property("Title")
.HasColumnType("TEXT");
diff --git a/Kyoo.SqLite/Migrations/20210607202259_Initial.cs b/Kyoo.SqLite/Migrations/20210613135157_Initial.cs
similarity index 99%
rename from Kyoo.SqLite/Migrations/20210607202259_Initial.cs
rename to Kyoo.SqLite/Migrations/20210613135157_Initial.cs
index a75d0b03..bece453b 100644
--- a/Kyoo.SqLite/Migrations/20210607202259_Initial.cs
+++ b/Kyoo.SqLite/Migrations/20210613135157_Initial.cs
@@ -378,6 +378,7 @@ namespace Kyoo.SqLite.Migrations
{
ID = table.Column(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
+ Slug = table.Column(type: "TEXT", nullable: true),
ShowID = table.Column(type: "INTEGER", nullable: false),
SeasonNumber = table.Column(type: "INTEGER", nullable: false),
Title = table.Column(type: "TEXT", nullable: true),
@@ -403,6 +404,7 @@ namespace Kyoo.SqLite.Migrations
{
ID = table.Column(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
+ Slug = table.Column(type: "TEXT", nullable: true),
ShowID = table.Column(type: "INTEGER", nullable: false),
SeasonID = table.Column(type: "INTEGER", nullable: true),
SeasonNumber = table.Column(type: "INTEGER", nullable: false),
@@ -489,6 +491,7 @@ namespace Kyoo.SqLite.Migrations
{
ID = table.Column(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
+ Slug = table.Column(type: "TEXT", nullable: true),
Title = table.Column(type: "TEXT", nullable: true),
Language = table.Column(type: "TEXT", nullable: true),
Codec = table.Column(type: "TEXT", nullable: true),
diff --git a/Kyoo.SqLite/Migrations/SqLiteContextModelSnapshot.cs b/Kyoo.SqLite/Migrations/SqLiteContextModelSnapshot.cs
index 086c55a5..16c6105a 100644
--- a/Kyoo.SqLite/Migrations/SqLiteContextModelSnapshot.cs
+++ b/Kyoo.SqLite/Migrations/SqLiteContextModelSnapshot.cs
@@ -14,7 +14,7 @@ namespace Kyoo.SqLite.Migrations
{
#pragma warning disable 612, 618
modelBuilder
- .HasAnnotation("ProductVersion", "5.0.6");
+ .HasAnnotation("ProductVersion", "5.0.7");
modelBuilder.Entity("Kyoo.Models.Collection", b =>
{
@@ -73,6 +73,9 @@ namespace Kyoo.SqLite.Migrations
b.Property("ShowID")
.HasColumnType("INTEGER");
+ b.Property("Slug")
+ .HasColumnType("TEXT");
+
b.Property("Thumb")
.HasColumnType("TEXT");
@@ -410,6 +413,9 @@ namespace Kyoo.SqLite.Migrations
b.Property("ShowID")
.HasColumnType("INTEGER");
+ b.Property("Slug")
+ .HasColumnType("TEXT");
+
b.Property("StartDate")
.HasColumnType("TEXT");
@@ -531,6 +537,9 @@ namespace Kyoo.SqLite.Migrations
b.Property("Path")
.HasColumnType("TEXT");
+ b.Property("Slug")
+ .HasColumnType("TEXT");
+
b.Property("Title")
.HasColumnType("TEXT");
diff --git a/Kyoo.SqLite/Triggers/TriggersMigrations.Designer.cs b/Kyoo.SqLite/Triggers/TriggersMigrations.Designer.cs
new file mode 100644
index 00000000..83bbdcd1
--- /dev/null
+++ b/Kyoo.SqLite/Triggers/TriggersMigrations.Designer.cs
@@ -0,0 +1,967 @@
+//
+using System;
+using Kyoo.SqLite;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+namespace Kyoo.SqLite.Migrations
+{
+ [DbContext(typeof(SqLiteContext))]
+ [Migration("20210613135215_Triggers")]
+ partial class Triggers
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "5.0.7");
+
+ modelBuilder.Entity("Kyoo.Models.Collection", b =>
+ {
+ b.Property("ID")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("Overview")
+ .HasColumnType("TEXT");
+
+ b.Property("Poster")
+ .HasColumnType("TEXT");
+
+ b.Property("Slug")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.HasKey("ID");
+
+ b.HasIndex("Slug")
+ .IsUnique();
+
+ b.ToTable("Collections");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Episode", b =>
+ {
+ b.Property("ID")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("AbsoluteNumber")
+ .HasColumnType("INTEGER");
+
+ b.Property("EpisodeNumber")
+ .HasColumnType("INTEGER");
+
+ b.Property("Overview")
+ .HasColumnType("TEXT");
+
+ b.Property("Path")
+ .HasColumnType("TEXT");
+
+ b.Property("ReleaseDate")
+ .HasColumnType("TEXT");
+
+ b.Property("SeasonID")
+ .HasColumnType("INTEGER");
+
+ b.Property("SeasonNumber")
+ .HasColumnType("INTEGER");
+
+ b.Property("ShowID")
+ .HasColumnType("INTEGER");
+
+ b.Property("Slug")
+ .HasColumnType("TEXT");
+
+ b.Property("Thumb")
+ .HasColumnType("TEXT");
+
+ b.Property("Title")
+ .HasColumnType("TEXT");
+
+ b.HasKey("ID");
+
+ b.HasIndex("SeasonID");
+
+ b.HasIndex("ShowID", "SeasonNumber", "EpisodeNumber", "AbsoluteNumber")
+ .IsUnique();
+
+ b.ToTable("Episodes");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Genre", b =>
+ {
+ b.Property("ID")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("Slug")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.HasKey("ID");
+
+ b.HasIndex("Slug")
+ .IsUnique();
+
+ b.ToTable("Genres");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Library", b =>
+ {
+ b.Property("ID")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("Paths")
+ .HasColumnType("TEXT");
+
+ b.Property("Slug")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.HasKey("ID");
+
+ b.HasIndex("Slug")
+ .IsUnique();
+
+ b.ToTable("Libraries");
+ });
+
+ 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.MetadataID", b =>
+ {
+ b.Property("FirstID")
+ .HasColumnType("INTEGER");
+
+ b.Property("SecondID")
+ .HasColumnType("INTEGER");
+
+ b.Property("DataID")
+ .HasColumnType("TEXT");
+
+ b.Property("Link")
+ .HasColumnType("TEXT");
+
+ b.HasKey("FirstID", "SecondID");
+
+ b.HasIndex("SecondID");
+
+ b.ToTable("MetadataID");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.MetadataID", b =>
+ {
+ b.Property("FirstID")
+ .HasColumnType("INTEGER");
+
+ b.Property("SecondID")
+ .HasColumnType("INTEGER");
+
+ b.Property("DataID")
+ .HasColumnType("TEXT");
+
+ b.Property("Link")
+ .HasColumnType("TEXT");
+
+ b.HasKey("FirstID", "SecondID");
+
+ b.HasIndex("SecondID");
+
+ b.ToTable("MetadataID");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.MetadataID", b =>
+ {
+ b.Property("FirstID")
+ .HasColumnType("INTEGER");
+
+ b.Property("SecondID")
+ .HasColumnType("INTEGER");
+
+ b.Property("DataID")
+ .HasColumnType("TEXT");
+
+ b.Property("Link")
+ .HasColumnType("TEXT");
+
+ b.HasKey("FirstID", "SecondID");
+
+ b.HasIndex("SecondID");
+
+ b.ToTable("MetadataID");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.MetadataID", b =>
+ {
+ b.Property("FirstID")
+ .HasColumnType("INTEGER");
+
+ b.Property("SecondID")
+ .HasColumnType("INTEGER");
+
+ b.Property("DataID")
+ .HasColumnType("TEXT");
+
+ b.Property("Link")
+ .HasColumnType("TEXT");
+
+ b.HasKey("FirstID", "SecondID");
+
+ b.HasIndex("SecondID");
+
+ b.ToTable("MetadataID");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.People", b =>
+ {
+ b.Property("ID")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("Poster")
+ .HasColumnType("TEXT");
+
+ b.Property("Slug")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.HasKey("ID");
+
+ b.HasIndex("Slug")
+ .IsUnique();
+
+ b.ToTable("People");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.PeopleRole", b =>
+ {
+ b.Property("ID")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("ForPeople")
+ .HasColumnType("INTEGER");
+
+ b.Property("PeopleID")
+ .HasColumnType("INTEGER");
+
+ b.Property("Role")
+ .HasColumnType("TEXT");
+
+ b.Property("ShowID")
+ .HasColumnType("INTEGER");
+
+ b.Property("Type")
+ .HasColumnType("TEXT");
+
+ b.HasKey("ID");
+
+ b.HasIndex("PeopleID");
+
+ b.HasIndex("ShowID");
+
+ b.ToTable("PeopleRoles");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Provider", b =>
+ {
+ b.Property("ID")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Logo")
+ .HasColumnType("TEXT");
+
+ b.Property("LogoExtension")
+ .HasColumnType("TEXT");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("Slug")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.HasKey("ID");
+
+ b.HasIndex("Slug")
+ .IsUnique();
+
+ b.ToTable("Providers");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Season", b =>
+ {
+ b.Property("ID")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("EndDate")
+ .HasColumnType("TEXT");
+
+ b.Property("Overview")
+ .HasColumnType("TEXT");
+
+ b.Property("Poster")
+ .HasColumnType("TEXT");
+
+ b.Property("SeasonNumber")
+ .HasColumnType("INTEGER");
+
+ b.Property("ShowID")
+ .HasColumnType("INTEGER");
+
+ b.Property("Slug")
+ .HasColumnType("TEXT");
+
+ b.Property("StartDate")
+ .HasColumnType("TEXT");
+
+ b.Property("Title")
+ .HasColumnType("TEXT");
+
+ b.HasKey("ID");
+
+ b.HasIndex("ShowID", "SeasonNumber")
+ .IsUnique();
+
+ b.ToTable("Seasons");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Show", b =>
+ {
+ b.Property("ID")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Aliases")
+ .HasColumnType("TEXT");
+
+ b.Property("Backdrop")
+ .HasColumnType("TEXT");
+
+ b.Property("EndAir")
+ .HasColumnType("TEXT");
+
+ b.Property("IsMovie")
+ .HasColumnType("INTEGER");
+
+ b.Property("Logo")
+ .HasColumnType("TEXT");
+
+ b.Property("Overview")
+ .HasColumnType("TEXT");
+
+ b.Property("Path")
+ .HasColumnType("TEXT");
+
+ b.Property("Poster")
+ .HasColumnType("TEXT");
+
+ b.Property("Slug")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("StartAir")
+ .HasColumnType("TEXT");
+
+ b.Property("Status")
+ .HasColumnType("INTEGER");
+
+ b.Property("StudioID")
+ .HasColumnType("INTEGER");
+
+ b.Property("Title")
+ .HasColumnType("TEXT");
+
+ b.Property("TrailerUrl")
+ .HasColumnType("TEXT");
+
+ b.HasKey("ID");
+
+ b.HasIndex("Slug")
+ .IsUnique();
+
+ b.HasIndex("StudioID");
+
+ b.ToTable("Shows");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Studio", b =>
+ {
+ b.Property("ID")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("Slug")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.HasKey("ID");
+
+ b.HasIndex("Slug")
+ .IsUnique();
+
+ b.ToTable("Studios");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Track", b =>
+ {
+ b.Property("ID")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Codec")
+ .HasColumnType("TEXT");
+
+ b.Property("EpisodeID")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsDefault")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsExternal")
+ .HasColumnType("INTEGER");
+
+ b.Property("IsForced")
+ .HasColumnType("INTEGER");
+
+ b.Property("Language")
+ .HasColumnType("TEXT");
+
+ b.Property("Path")
+ .HasColumnType("TEXT");
+
+ b.Property("Slug")
+ .HasColumnType("TEXT");
+
+ b.Property("Title")
+ .HasColumnType("TEXT");
+
+ b.Property("TrackIndex")
+ .HasColumnType("INTEGER");
+
+ b.Property("Type")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("ID");
+
+ b.HasIndex("EpisodeID", "Type", "Language", "TrackIndex", "IsForced")
+ .IsUnique();
+
+ b.ToTable("Tracks");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.User", b =>
+ {
+ b.Property("ID")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("INTEGER");
+
+ b.Property("Email")
+ .HasColumnType("TEXT");
+
+ b.Property("ExtraData")
+ .HasColumnType("TEXT");
+
+ b.Property("Password")
+ .HasColumnType("TEXT");
+
+ b.Property("Permissions")
+ .HasColumnType("TEXT");
+
+ b.Property("Slug")
+ .IsRequired()
+ .HasColumnType("TEXT");
+
+ b.Property("Username")
+ .HasColumnType("TEXT");
+
+ b.HasKey("ID");
+
+ b.HasIndex("Slug")
+ .IsUnique();
+
+ b.ToTable("Users");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b =>
+ {
+ b.Property("FirstID")
+ .HasColumnType("INTEGER");
+
+ b.Property("SecondID")
+ .HasColumnType("INTEGER");
+
+ b.Property("WatchedPercentage")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("FirstID", "SecondID");
+
+ b.HasIndex("SecondID");
+
+ b.ToTable("WatchedEpisodes");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Episode", b =>
+ {
+ b.HasOne("Kyoo.Models.Season", "Season")
+ .WithMany("Episodes")
+ .HasForeignKey("SeasonID");
+
+ b.HasOne("Kyoo.Models.Show", "Show")
+ .WithMany("Episodes")
+ .HasForeignKey("ShowID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Season");
+
+ b.Navigation("Show");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Link", b =>
+ {
+ b.HasOne("Kyoo.Models.Collection", "First")
+ .WithMany("ShowLinks")
+ .HasForeignKey("FirstID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Show", "Second")
+ .WithMany("CollectionLinks")
+ .HasForeignKey("SecondID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("First");
+
+ b.Navigation("Second");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Link", b =>
+ {
+ b.HasOne("Kyoo.Models.Library", "First")
+ .WithMany("CollectionLinks")
+ .HasForeignKey("FirstID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Collection", "Second")
+ .WithMany("LibraryLinks")
+ .HasForeignKey("SecondID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("First");
+
+ b.Navigation("Second");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Link", b =>
+ {
+ b.HasOne("Kyoo.Models.Library", "First")
+ .WithMany("ProviderLinks")
+ .HasForeignKey("FirstID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Provider", "Second")
+ .WithMany("LibraryLinks")
+ .HasForeignKey("SecondID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("First");
+
+ b.Navigation("Second");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Link", b =>
+ {
+ b.HasOne("Kyoo.Models.Library", "First")
+ .WithMany("ShowLinks")
+ .HasForeignKey("FirstID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Show", "Second")
+ .WithMany("LibraryLinks")
+ .HasForeignKey("SecondID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("First");
+
+ b.Navigation("Second");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Link", b =>
+ {
+ b.HasOne("Kyoo.Models.Show", "First")
+ .WithMany("GenreLinks")
+ .HasForeignKey("FirstID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Genre", "Second")
+ .WithMany("ShowLinks")
+ .HasForeignKey("SecondID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("First");
+
+ b.Navigation("Second");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Link", b =>
+ {
+ b.HasOne("Kyoo.Models.User", "First")
+ .WithMany("ShowLinks")
+ .HasForeignKey("FirstID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Show", "Second")
+ .WithMany()
+ .HasForeignKey("SecondID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("First");
+
+ b.Navigation("Second");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.MetadataID", b =>
+ {
+ b.HasOne("Kyoo.Models.Episode", "First")
+ .WithMany("ExternalIDs")
+ .HasForeignKey("FirstID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Provider", "Second")
+ .WithMany()
+ .HasForeignKey("SecondID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("First");
+
+ b.Navigation("Second");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.MetadataID", b =>
+ {
+ b.HasOne("Kyoo.Models.People", "First")
+ .WithMany("ExternalIDs")
+ .HasForeignKey("FirstID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Provider", "Second")
+ .WithMany()
+ .HasForeignKey("SecondID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("First");
+
+ b.Navigation("Second");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.MetadataID", b =>
+ {
+ b.HasOne("Kyoo.Models.Season", "First")
+ .WithMany("ExternalIDs")
+ .HasForeignKey("FirstID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Provider", "Second")
+ .WithMany()
+ .HasForeignKey("SecondID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("First");
+
+ b.Navigation("Second");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.MetadataID", b =>
+ {
+ b.HasOne("Kyoo.Models.Show", "First")
+ .WithMany("ExternalIDs")
+ .HasForeignKey("FirstID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Provider", "Second")
+ .WithMany()
+ .HasForeignKey("SecondID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("First");
+
+ b.Navigation("Second");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.PeopleRole", b =>
+ {
+ b.HasOne("Kyoo.Models.People", "People")
+ .WithMany("Roles")
+ .HasForeignKey("PeopleID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Show", "Show")
+ .WithMany("People")
+ .HasForeignKey("ShowID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("People");
+
+ b.Navigation("Show");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Season", b =>
+ {
+ b.HasOne("Kyoo.Models.Show", "Show")
+ .WithMany("Seasons")
+ .HasForeignKey("ShowID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Show");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Show", b =>
+ {
+ b.HasOne("Kyoo.Models.Studio", "Studio")
+ .WithMany("Shows")
+ .HasForeignKey("StudioID");
+
+ b.Navigation("Studio");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Track", b =>
+ {
+ b.HasOne("Kyoo.Models.Episode", "Episode")
+ .WithMany("Tracks")
+ .HasForeignKey("EpisodeID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("Episode");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.WatchedEpisode", b =>
+ {
+ b.HasOne("Kyoo.Models.User", "First")
+ .WithMany("CurrentlyWatching")
+ .HasForeignKey("FirstID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.HasOne("Kyoo.Models.Episode", "Second")
+ .WithMany()
+ .HasForeignKey("SecondID")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+
+ b.Navigation("First");
+
+ b.Navigation("Second");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Collection", b =>
+ {
+ b.Navigation("LibraryLinks");
+
+ b.Navigation("ShowLinks");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Episode", b =>
+ {
+ b.Navigation("ExternalIDs");
+
+ 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");
+
+ b.Navigation("Roles");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Provider", b =>
+ {
+ b.Navigation("LibraryLinks");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Season", b =>
+ {
+ b.Navigation("Episodes");
+
+ b.Navigation("ExternalIDs");
+ });
+
+ 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");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.Studio", b =>
+ {
+ b.Navigation("Shows");
+ });
+
+ modelBuilder.Entity("Kyoo.Models.User", b =>
+ {
+ b.Navigation("CurrentlyWatching");
+
+ b.Navigation("ShowLinks");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/Kyoo.SqLite/Triggers/TriggersMigrations.cs b/Kyoo.SqLite/Triggers/TriggersMigrations.cs
new file mode 100644
index 00000000..242cb4a1
--- /dev/null
+++ b/Kyoo.SqLite/Triggers/TriggersMigrations.cs
@@ -0,0 +1,35 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace Kyoo.SqLite.Migrations
+{
+ public partial class Triggers : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.Sql(@"
+ CREATE TRIGGER SeasonSlugInsert AFTER INSERT ON Seasons FOR EACH ROW
+ BEGIN
+ UPDATE Seasons SET Slug = (SELECT Slug from Shows WHERE ID = ShowID) || '-s' || SeasonNumber
+ WHERE ID == new.ID;
+ END");
+ migrationBuilder.Sql(@"
+ CREATE TRIGGER SeasonSlugUpdate AFTER UPDATE OF SeasonNumber, ShowID ON Seasons FOR EACH ROW
+ BEGIN
+ UPDATE Seasons SET Slug = (SELECT Slug from Shows WHERE ID = ShowID) || '-s' || SeasonNumber
+ WHERE ID == new.ID;
+ END");
+ migrationBuilder.Sql(@"
+ CREATE TRIGGER ShowSlugUpdate AFTER UPDATE OF Slug ON Shows FOR EACH ROW
+ BEGIN
+ UPDATE Seasons SET Slug = new.Slug || '-s' || SeasonNumber WHERE ShowID = new.ID;
+ END;");
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.Sql("DROP TRIGGER SeasonSlugInsert;");
+ migrationBuilder.Sql("DROP TRIGGER SeasonSlugUpdate;");
+ migrationBuilder.Sql("DROP TRIGGER ShowSlugUpdate;");
+ }
+ }
+}