From 6f871398155371dbc0ef723ec74eeddb34be5145 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sun, 27 Jun 2021 20:21:03 +0200 Subject: [PATCH] Fixing SQLite episode triggers --- Kyoo.Common/Models/Resources/Episode.cs | 4 ++-- Kyoo.Common/Models/Resources/Season.cs | 2 +- Kyoo.Common/Models/Resources/Show.cs | 2 +- Kyoo.Common/Models/Resources/Track.cs | 2 +- Kyoo.Common/Utility/Merger.cs | 8 ++------ Kyoo.CommonAPI/DatabaseContext.cs | 8 -------- ...er.cs => 20210627141933_Initial.Designer.cs} | 8 ++++---- ...924_Initial.cs => 20210627141933_Initial.cs} | 6 +++--- ...r.cs => 20210627141941_Triggers.Designer.cs} | 8 ++++---- ...2_Triggers.cs => 20210627141941_Triggers.cs} | 17 +++++++++++------ .../Migrations/PostgresContextModelSnapshot.cs | 6 +++--- .../Migrations/20210626141347_Triggers.cs | 12 ++++++------ .../Repositories/EpisodeRepository.cs | 6 +++++- Kyoo/Startup.cs | 4 ++-- 14 files changed, 45 insertions(+), 48 deletions(-) rename Kyoo.Postgresql/Migrations/{20210623174924_Initial.Designer.cs => 20210627141933_Initial.Designer.cs} (99%) rename Kyoo.Postgresql/Migrations/{20210623174924_Initial.cs => 20210627141933_Initial.cs} (99%) rename Kyoo.Postgresql/Migrations/{20210623174932_Triggers.Designer.cs => 20210627141941_Triggers.Designer.cs} (99%) rename Kyoo.Postgresql/Migrations/{20210623174932_Triggers.cs => 20210627141941_Triggers.cs} (80%) diff --git a/Kyoo.Common/Models/Resources/Episode.cs b/Kyoo.Common/Models/Resources/Episode.cs index aa947836..594763be 100644 --- a/Kyoo.Common/Models/Resources/Episode.cs +++ b/Kyoo.Common/Models/Resources/Episode.cs @@ -60,7 +60,7 @@ namespace Kyoo.Models [SerializeIgnore] public string ShowSlug { private get; set; } /// - /// The ID of the Show containing this episode. This value is only set when the has been loaded. + /// The ID of the Show containing this episode. /// [SerializeIgnore] public int ShowID { get; set; } /// @@ -69,7 +69,7 @@ namespace Kyoo.Models [LoadableRelation(nameof(ShowID))] public Show Show { get; set; } /// - /// The ID of the Season containing this episode. This value is only set when the has been loaded. + /// The ID of the Season containing this episode. /// [SerializeIgnore] public int? SeasonID { get; set; } /// diff --git a/Kyoo.Common/Models/Resources/Season.cs b/Kyoo.Common/Models/Resources/Season.cs index 07411cf3..9b292020 100644 --- a/Kyoo.Common/Models/Resources/Season.cs +++ b/Kyoo.Common/Models/Resources/Season.cs @@ -41,7 +41,7 @@ namespace Kyoo.Models [SerializeIgnore] public string ShowSlug { private get; set; } /// - /// The ID of the Show containing this season. This value is only set when the has been loaded. + /// The ID of the Show containing this season. /// [SerializeIgnore] public int ShowID { get; set; } /// diff --git a/Kyoo.Common/Models/Resources/Show.cs b/Kyoo.Common/Models/Resources/Show.cs index 5232dee2..ffb2ae49 100644 --- a/Kyoo.Common/Models/Resources/Show.cs +++ b/Kyoo.Common/Models/Resources/Show.cs @@ -94,7 +94,7 @@ namespace Kyoo.Models [EditableRelation] [LoadableRelation] public ICollection> ExternalIDs { get; set; } /// - /// The ID of the Studio that made this show. This value is only set when the has been loaded. + /// The ID of the Studio that made this show. /// [SerializeIgnore] public int? StudioID { get; set; } /// diff --git a/Kyoo.Common/Models/Resources/Track.cs b/Kyoo.Common/Models/Resources/Track.cs index 38006392..00ae745c 100644 --- a/Kyoo.Common/Models/Resources/Track.cs +++ b/Kyoo.Common/Models/Resources/Track.cs @@ -119,7 +119,7 @@ namespace Kyoo.Models [SerializeIgnore] public StreamType Type { get; set; } /// - /// The ID of the episode that uses this track. This value is only set when the has been loaded. + /// The ID of the episode that uses this track. /// [SerializeIgnore] public int EpisodeID { get; set; } /// diff --git a/Kyoo.Common/Utility/Merger.cs b/Kyoo.Common/Utility/Merger.cs index 417ea944..55cc17e3 100644 --- a/Kyoo.Common/Utility/Merger.cs +++ b/Kyoo.Common/Utility/Merger.cs @@ -163,13 +163,9 @@ namespace Kyoo Type type = typeof(T); foreach (PropertyInfo property in type.GetProperties()) { - if (!property.CanWrite) + if (!property.CanWrite || property.GetCustomAttribute() != null) continue; - - object defaultValue = property.PropertyType.IsValueType - ? Activator.CreateInstance(property.PropertyType) - : null; - property.SetValue(obj, defaultValue); + property.SetValue(obj, property.PropertyType.GetClrDefault()); } return obj; diff --git a/Kyoo.CommonAPI/DatabaseContext.cs b/Kyoo.CommonAPI/DatabaseContext.cs index a2b7eeb2..afca55b5 100644 --- a/Kyoo.CommonAPI/DatabaseContext.cs +++ b/Kyoo.CommonAPI/DatabaseContext.cs @@ -132,14 +132,6 @@ namespace Kyoo { base.OnModelCreating(modelBuilder); - modelBuilder.Entity() - .Property(t => t.IsDefault) - .ValueGeneratedNever(); - - modelBuilder.Entity() - .Property(t => t.IsForced) - .ValueGeneratedNever(); - modelBuilder.Entity() .HasMany(x => x.Seasons) .WithOne(x => x.Show) diff --git a/Kyoo.Postgresql/Migrations/20210623174924_Initial.Designer.cs b/Kyoo.Postgresql/Migrations/20210627141933_Initial.Designer.cs similarity index 99% rename from Kyoo.Postgresql/Migrations/20210623174924_Initial.Designer.cs rename to Kyoo.Postgresql/Migrations/20210627141933_Initial.Designer.cs index c6943ac2..f1733a77 100644 --- a/Kyoo.Postgresql/Migrations/20210623174924_Initial.Designer.cs +++ b/Kyoo.Postgresql/Migrations/20210627141933_Initial.Designer.cs @@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace Kyoo.Postgresql.Migrations { [DbContext(typeof(PostgresContext))] - [Migration("20210623174924_Initial")] + [Migration("20210627141933_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -69,11 +69,11 @@ namespace Kyoo.Postgresql.Migrations .HasColumnName("id") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - b.Property("AbsoluteNumber") + b.Property("AbsoluteNumber") .HasColumnType("integer") .HasColumnName("absolute_number"); - b.Property("EpisodeNumber") + b.Property("EpisodeNumber") .HasColumnType("integer") .HasColumnName("episode_number"); @@ -93,7 +93,7 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("integer") .HasColumnName("season_id"); - b.Property("SeasonNumber") + b.Property("SeasonNumber") .HasColumnType("integer") .HasColumnName("season_number"); diff --git a/Kyoo.Postgresql/Migrations/20210623174924_Initial.cs b/Kyoo.Postgresql/Migrations/20210627141933_Initial.cs similarity index 99% rename from Kyoo.Postgresql/Migrations/20210623174924_Initial.cs rename to Kyoo.Postgresql/Migrations/20210627141933_Initial.cs index 45c8e00d..50bed8f7 100644 --- a/Kyoo.Postgresql/Migrations/20210623174924_Initial.cs +++ b/Kyoo.Postgresql/Migrations/20210627141933_Initial.cs @@ -415,9 +415,9 @@ namespace Kyoo.Postgresql.Migrations slug = table.Column(type: "text", nullable: true), show_id = table.Column(type: "integer", nullable: false), season_id = table.Column(type: "integer", nullable: true), - season_number = table.Column(type: "integer", nullable: false), - episode_number = table.Column(type: "integer", nullable: false), - absolute_number = table.Column(type: "integer", nullable: false), + season_number = table.Column(type: "integer", nullable: true), + episode_number = table.Column(type: "integer", nullable: true), + absolute_number = table.Column(type: "integer", nullable: true), path = table.Column(type: "text", nullable: true), thumb = table.Column(type: "text", nullable: true), title = table.Column(type: "text", nullable: true), diff --git a/Kyoo.Postgresql/Migrations/20210623174932_Triggers.Designer.cs b/Kyoo.Postgresql/Migrations/20210627141941_Triggers.Designer.cs similarity index 99% rename from Kyoo.Postgresql/Migrations/20210623174932_Triggers.Designer.cs rename to Kyoo.Postgresql/Migrations/20210627141941_Triggers.Designer.cs index ebd1669f..fc019baf 100644 --- a/Kyoo.Postgresql/Migrations/20210623174932_Triggers.Designer.cs +++ b/Kyoo.Postgresql/Migrations/20210627141941_Triggers.Designer.cs @@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace Kyoo.Postgresql.Migrations { [DbContext(typeof(PostgresContext))] - [Migration("20210623174932_Triggers")] + [Migration("20210627141941_Triggers")] partial class Triggers { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -69,11 +69,11 @@ namespace Kyoo.Postgresql.Migrations .HasColumnName("id") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - b.Property("AbsoluteNumber") + b.Property("AbsoluteNumber") .HasColumnType("integer") .HasColumnName("absolute_number"); - b.Property("EpisodeNumber") + b.Property("EpisodeNumber") .HasColumnType("integer") .HasColumnName("episode_number"); @@ -93,7 +93,7 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("integer") .HasColumnName("season_id"); - b.Property("SeasonNumber") + b.Property("SeasonNumber") .HasColumnType("integer") .HasColumnName("season_number"); diff --git a/Kyoo.Postgresql/Migrations/20210623174932_Triggers.cs b/Kyoo.Postgresql/Migrations/20210627141941_Triggers.cs similarity index 80% rename from Kyoo.Postgresql/Migrations/20210623174932_Triggers.cs rename to Kyoo.Postgresql/Migrations/20210627141941_Triggers.cs index 4ab90659..bfa66554 100644 --- a/Kyoo.Postgresql/Migrations/20210623174932_Triggers.cs +++ b/Kyoo.Postgresql/Migrations/20210627141941_Triggers.cs @@ -37,10 +37,10 @@ namespace Kyoo.Postgresql.Migrations BEGIN NEW.slug := CONCAT( (SELECT slug FROM shows WHERE id = NEW.show_id), - '-s', - NEW.season_number, - 'e', - NEW.episode_number + CASE + WHEN NEW.season_number IS NULL THEN CONCAT('-', NEW.absolute_number) + ELSE CONCAT('-s', NEW.season_number, 'e', NEW.episode_number) + END ); RETURN NEW; END @@ -48,7 +48,8 @@ namespace Kyoo.Postgresql.Migrations // language=PostgreSQL migrationBuilder.Sql(@" - CREATE TRIGGER episode_slug_trigger BEFORE INSERT OR UPDATE OF episode_number, season_number, show_id ON episodes + CREATE TRIGGER episode_slug_trigger + BEFORE INSERT OR UPDATE OF absolute_number, episode_number, season_number, show_id ON episodes FOR EACH ROW EXECUTE PROCEDURE episode_slug_update();"); @@ -60,7 +61,11 @@ namespace Kyoo.Postgresql.Migrations AS $$ BEGIN UPDATE seasons SET slug = CONCAT(NEW.slug, '-s', season_number) WHERE show_id = NEW.id; - UPDATE episodes SET slug = CONCAT(NEW.slug, '-s', season_number, 'e', episode_number) WHERE show_id = NEW.id; + UPDATE episodes SET slug = CASE + WHEN season_number IS NULL THEN CONCAT(NEW.slug, '-', absolute_number) + ELSE CONCAT(NEW.slug, '-s', season_number, 'e', episode_number) + END + WHERE show_id = NEW.id; RETURN NEW; END $$;"); diff --git a/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs b/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs index 554ef95f..e5044c60 100644 --- a/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs +++ b/Kyoo.Postgresql/Migrations/PostgresContextModelSnapshot.cs @@ -67,11 +67,11 @@ namespace Kyoo.Postgresql.Migrations .HasColumnName("id") .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn); - b.Property("AbsoluteNumber") + b.Property("AbsoluteNumber") .HasColumnType("integer") .HasColumnName("absolute_number"); - b.Property("EpisodeNumber") + b.Property("EpisodeNumber") .HasColumnType("integer") .HasColumnName("episode_number"); @@ -91,7 +91,7 @@ namespace Kyoo.Postgresql.Migrations .HasColumnType("integer") .HasColumnName("season_id"); - b.Property("SeasonNumber") + b.Property("SeasonNumber") .HasColumnType("integer") .HasColumnName("season_number"); diff --git a/Kyoo.SqLite/Migrations/20210626141347_Triggers.cs b/Kyoo.SqLite/Migrations/20210626141347_Triggers.cs index 0f0596dd..d6d3ca22 100644 --- a/Kyoo.SqLite/Migrations/20210626141347_Triggers.cs +++ b/Kyoo.SqLite/Migrations/20210626141347_Triggers.cs @@ -27,8 +27,8 @@ namespace Kyoo.SqLite.Migrations BEGIN UPDATE Episodes SET Slug = (SELECT Slug from Shows WHERE ID = ShowID) || - CASE (SeasonNumber) - WHEN NULL THEN '-' || AbsoluteNumber + CASE + WHEN SeasonNumber IS NULL THEN '-' || AbsoluteNumber ELSE '-s' || SeasonNumber || 'e' || EpisodeNumber END WHERE ID == new.ID; @@ -40,8 +40,8 @@ namespace Kyoo.SqLite.Migrations BEGIN UPDATE Episodes SET Slug = (SELECT Slug from Shows WHERE ID = ShowID) || - CASE (SeasonNumber) - WHEN NULL THEN '-' || AbsoluteNumber + CASE + WHEN SeasonNumber IS NULL THEN '-' || AbsoluteNumber ELSE '-s' || SeasonNumber || 'e' || EpisodeNumber END WHERE ID == new.ID; @@ -55,8 +55,8 @@ namespace Kyoo.SqLite.Migrations UPDATE Seasons SET Slug = new.Slug || '-s' || SeasonNumber WHERE ShowID = new.ID; UPDATE Episodes SET Slug = new.Slug || - CASE (SeasonNumber) - WHEN NULL THEN '-' || AbsoluteNumber + CASE + WHEN SeasonNumber IS NULL THEN '-' || AbsoluteNumber ELSE '-s' || SeasonNumber || 'e' || EpisodeNumber END WHERE ShowID = new.ID; diff --git a/Kyoo/Controllers/Repositories/EpisodeRepository.cs b/Kyoo/Controllers/Repositories/EpisodeRepository.cs index 6f555571..2ffa3f1d 100644 --- a/Kyoo/Controllers/Repositories/EpisodeRepository.cs +++ b/Kyoo/Controllers/Repositories/EpisodeRepository.cs @@ -114,6 +114,9 @@ namespace Kyoo.Controllers obj.ExternalIDs.ForEach(x => _database.Entry(x).State = EntityState.Added); await _database.SaveChangesAsync($"Trying to insert a duplicated episode (slug {obj.Slug} already exists)."); return await ValidateTracks(obj); + // TODO check if this is needed + // obj.Slug = await _database.Entry(obj).Property(x => x.Slug). + // return obj; } /// @@ -148,7 +151,8 @@ namespace Kyoo.Controllers resource.Tracks = await TaskUtils.DefaultIfNull(resource.Tracks?.MapAsync((x, i) => { x.Episode = resource; - x.TrackIndex = resource.Tracks.Take(i).Count(y => x.Language == y.Language + // TODO use a trigger for the next line. + x.TrackIndex = resource.Tracks.Take(i).Count(y => x.Language == y.Language && x.IsForced == y.IsForced && x.Codec == y.Codec && x.Type == y.Type); diff --git a/Kyoo/Startup.cs b/Kyoo/Startup.cs index 27c05c56..983d1d6c 100644 --- a/Kyoo/Startup.cs +++ b/Kyoo/Startup.cs @@ -47,8 +47,8 @@ namespace Kyoo // TODO remove postgres from here and load it like a normal plugin. _plugins.LoadPlugins(new IPlugin[] { new CoreModule(configuration), - // new PostgresModule(configuration, host), - new SqLiteModule(configuration, host), + new PostgresModule(configuration, host), + // new SqLiteModule(configuration, host), new AuthenticationModule(configuration, loggerFactory, host) }); }