fix(storage): retain playlist import migrations

This commit is contained in:
joshpatra committed 2026-09-09 09:59:44 -04:00
1 parent 1d11bcd35c
commit c25c5d6d29
5 files changed
+115 -1

No files matched your search

@@ -160,7 +160,13 @@ public sealed partial class AllstarrDbContext
modelBuilder.Entity<PlaylistLinkRecord>(entity =>
{
entity.ToTable("playlist_links", table => table.HasCheckConstraint("CK_playlist_links_source_hash", "length(\"SourcePlaylistIdHash\") = 64"));
entity.ToTable("playlist_links", table =>
{
table.HasCheckConstraint("CK_playlist_links_source_hash", "length(\"SourcePlaylistIdHash\") = 64");
table.HasCheckConstraint("CK_playlist_links_import_mode", "\"ImportMode\" IN ('Linked', 'OneTime')");
table.HasCheckConstraint("CK_playlist_links_track_retention", "\"TrackRetention\" IN ('OnDemand', 'KeepAll')");
table.HasCheckConstraint("CK_playlist_links_one_time_schedule", "\"ImportMode\" <> 'OneTime' OR \"ScheduleId\" IS NULL");
});
entity.HasKey(item => item.Id);
entity.HasAlternateKey(item => new { item.TenantId, item.Id });
entity.Property(item => item.Id).ValueGeneratedNever();
@@ -176,6 +182,10 @@ public sealed partial class AllstarrDbContext
entity.Property(item => item.ProjectionMode).HasConversion<string>().HasMaxLength(32)
.HasDefaultValue(PlaylistProjectionMode.Resolved);
entity.Property(item => item.MaterializationMode).HasConversion<string>().HasMaxLength(32);
entity.Property(item => item.ImportMode).HasConversion<string>().HasMaxLength(32)
.HasDefaultValue(PlaylistImportMode.Linked);
entity.Property(item => item.TrackRetention).HasConversion<string>().HasMaxLength(32)
.HasDefaultValue(PlaylistTrackRetention.OnDemand);
Required(entity.Property(item => item.RuleVersion), 100);
Required(entity.Property(item => item.PolicyVersion), 100);
entity.Property(item => item.Revision).IsConcurrencyToken();
@@ -5,6 +5,8 @@ public enum ManualOverrideDecision { Pin, Reject }
public enum PlaylistLinkMode { Virtual, Materialized, Hybrid }
public enum PlaylistProjectionMode { Resolved, Source, Target }
public enum PlaylistMaterializationMode { Reconcile, Recreate }
public enum PlaylistImportMode { Linked, OneTime }
public enum PlaylistTrackRetention { OnDemand, KeepAll }
public enum PlaylistSyncState { Pending, Running, Succeeded, PartiallySucceeded, Conflicted, Failed, Cancelled }
public enum PlaylistEntryOutcome { Matched, Reused, Added, Reordered, Skipped, Rejected, Unsupported, Failed }
public enum ScheduleOverlapPolicy { Skip, Queue }
@@ -147,6 +149,8 @@ public sealed class PlaylistLinkRecord
public PlaylistLinkMode Mode { get; set; }
public PlaylistProjectionMode ProjectionMode { get; set; } = PlaylistProjectionMode.Resolved;
public PlaylistMaterializationMode MaterializationMode { get; set; }
public PlaylistImportMode ImportMode { get; set; } = PlaylistImportMode.Linked;
public PlaylistTrackRetention TrackRetention { get; set; } = PlaylistTrackRetention.OnDemand;
public bool MirrorStaleEntries { get; set; }
public bool PreserveManualEntries { get; set; } = true;
public bool SyncName { get; set; } = true;
@@ -0,0 +1,36 @@
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace allstarr.Core.Storage.Migrations;
[DbContext(typeof(AllstarrDbContext))]
[Migration("20260825010000_AddPlaylistImportPolicies")]
public sealed class AddPlaylistImportPolicies : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "ImportMode",
table: "playlist_links",
type: "character varying(32)",
maxLength: 32,
nullable: false,
defaultValue: "Linked");
migrationBuilder.AddColumn<string>(
name: "TrackRetention",
table: "playlist_links",
type: "character varying(32)",
maxLength: 32,
nullable: false,
defaultValue: "OnDemand");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(name: "ImportMode", table: "playlist_links");
migrationBuilder.DropColumn(name: "TrackRetention", table: "playlist_links");
}
}
@@ -0,0 +1,44 @@
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace allstarr.Core.Storage.Migrations;
[DbContext(typeof(AllstarrDbContext))]
[Migration("20260825020000_EnforcePlaylistImportPolicies")]
public sealed class EnforcePlaylistImportPolicies : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddCheckConstraint(
name: "CK_playlist_links_import_mode",
table: "playlist_links",
sql: "\"ImportMode\" IN ('Linked', 'OneTime')");
migrationBuilder.AddCheckConstraint(
name: "CK_playlist_links_track_retention",
table: "playlist_links",
sql: "\"TrackRetention\" IN ('OnDemand', 'KeepAll')");
migrationBuilder.AddCheckConstraint(
name: "CK_playlist_links_one_time_schedule",
table: "playlist_links",
sql: "\"ImportMode\" <> 'OneTime' OR \"ScheduleId\" IS NULL");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropCheckConstraint(
name: "CK_playlist_links_import_mode",
table: "playlist_links");
migrationBuilder.DropCheckConstraint(
name: "CK_playlist_links_track_retention",
table: "playlist_links");
migrationBuilder.DropCheckConstraint(
name: "CK_playlist_links_one_time_schedule",
table: "playlist_links");
}
}
@@ -3303,6 +3303,13 @@ namespace allstarr.Core.Storage.Migrations
.HasColumnType("boolean")
.HasDefaultValue(true);
b.Property<string>("ImportMode")
.IsRequired()
.ValueGeneratedOnAdd()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasDefaultValue("Linked");
b.Property<string>("LibraryScopeId")
.IsRequired()
.HasMaxLength(300)
@@ -3395,6 +3402,13 @@ namespace allstarr.Core.Storage.Migrations
.HasMaxLength(32)
.HasColumnType("character varying(32)");
b.Property<string>("TrackRetention")
.IsRequired()
.ValueGeneratedOnAdd()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasDefaultValue("OnDemand");
b.Property<Guid>("TenantId")
.HasColumnType("uuid");
@@ -3413,7 +3427,13 @@ namespace allstarr.Core.Storage.Migrations
b.ToTable("playlist_links", null, t =>
{
t.HasCheckConstraint("CK_playlist_links_import_mode", "\"ImportMode\" IN ('Linked', 'OneTime')");
t.HasCheckConstraint("CK_playlist_links_one_time_schedule", "\"ImportMode\" <> 'OneTime' OR \"ScheduleId\" IS NULL");
t.HasCheckConstraint("CK_playlist_links_source_hash", "length(\"SourcePlaylistIdHash\") = 64");
t.HasCheckConstraint("CK_playlist_links_track_retention", "\"TrackRetention\" IN ('OnDemand', 'KeepAll')");
});
});