From 1e2c486356dc815b4045f50b4baf4db16a177d40 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Fri, 15 May 2026 23:39:21 -0400 Subject: [PATCH] fix(playlists): allow the 5 discovery-mix variants in DB constraints MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit HOTFIX for v2026.05.15.0. R3 added deep_cuts/rediscover/new_for_you/ on_this_day/first_listens producers + registry entries but not their system_variant values to the playlists_kind_variant_consistent / playlists_seed_consistent CHECK constraints (0021's whitelist). insertSystemPlaylist for any new mix → SQLSTATE 23514, and since BuildSystemPlaylists is one all-or-nothing txn that aborts the ENTIRE build — For-You/Discover refresh 500s and the daily lazy build fails too. System playlists are fully broken in prod. Migration 0028 drops + re-adds both constraints with all five new seedless variants (mirrors the 0021 drop-and-readd pattern). CHECK-only — sqlc/dbq unaffected (regen produced no drift). Bumps to 2026.5.15+7 for the v2026.05.15.1 patch release. Co-Authored-By: Claude Opus 4.7 (1M context) --- flutter_client/pubspec.yaml | 2 +- .../0028_discovery_mix_variants.down.sql | 24 ++++++++++ .../0028_discovery_mix_variants.up.sql | 47 +++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 internal/db/migrations/0028_discovery_mix_variants.down.sql create mode 100644 internal/db/migrations/0028_discovery_mix_variants.up.sql diff --git a/flutter_client/pubspec.yaml b/flutter_client/pubspec.yaml index 03c19c18..6b5ba3d2 100644 --- a/flutter_client/pubspec.yaml +++ b/flutter_client/pubspec.yaml @@ -1,7 +1,7 @@ name: minstrel description: Minstrel mobile client publish_to: 'none' -version: 2026.5.15+6 +version: 2026.5.15+7 environment: sdk: '>=3.5.0 <4.0.0' diff --git a/internal/db/migrations/0028_discovery_mix_variants.down.sql b/internal/db/migrations/0028_discovery_mix_variants.down.sql new file mode 100644 index 00000000..e16f7ecf --- /dev/null +++ b/internal/db/migrations/0028_discovery_mix_variants.down.sql @@ -0,0 +1,24 @@ +-- Reverts to the 0021 constraint set (for_you, songs_like_artist, +-- discover only). Fails if any playlists row still has one of the +-- five new system_variant values — delete/rebuild system playlists +-- first if rolling back. + +ALTER TABLE playlists DROP CONSTRAINT IF EXISTS playlists_kind_variant_consistent; +ALTER TABLE playlists + ADD CONSTRAINT playlists_kind_variant_consistent CHECK ( + (kind = 'user' AND system_variant IS NULL) + OR + (kind = 'system' AND system_variant IN ('for_you', 'songs_like_artist', 'discover')) + ); + +ALTER TABLE playlists DROP CONSTRAINT IF EXISTS playlists_seed_consistent; +ALTER TABLE playlists + ADD CONSTRAINT playlists_seed_consistent CHECK ( + (system_variant IS NULL AND seed_artist_id IS NULL) + OR + (system_variant = 'for_you' AND seed_artist_id IS NULL) + OR + (system_variant = 'discover' AND seed_artist_id IS NULL) + OR + (system_variant = 'songs_like_artist' AND seed_artist_id IS NOT NULL) + ); diff --git a/internal/db/migrations/0028_discovery_mix_variants.up.sql b/internal/db/migrations/0028_discovery_mix_variants.up.sql new file mode 100644 index 00000000..b50d92fb --- /dev/null +++ b/internal/db/migrations/0028_discovery_mix_variants.up.sql @@ -0,0 +1,47 @@ +-- #411 R3 bugfix: the five discovery mixes (deep_cuts, rediscover, +-- new_for_you, on_this_day, first_listens) were added as producers + +-- registry entries but their system_variant values were never added +-- to the two playlists CHECK constraints. Result: insertSystemPlaylist +-- for any new mix fails with playlists_kind_variant_consistent +-- (SQLSTATE 23514), which — because BuildSystemPlaylists is one +-- all-or-nothing transaction — aborts the WHOLE build, so For-You / +-- Discover refresh 500s and the lazy daily build fails too. +-- +-- All five are seedless (like for_you/discover): seed_artist_id IS +-- NULL. Drop + re-add both constraints with the expanded set, same +-- pattern as 0021_discover_variant (Postgres has no ALTER CONSTRAINT +-- for CHECK). + +ALTER TABLE playlists DROP CONSTRAINT IF EXISTS playlists_kind_variant_consistent; +ALTER TABLE playlists + ADD CONSTRAINT playlists_kind_variant_consistent CHECK ( + (kind = 'user' AND system_variant IS NULL) + OR + (kind = 'system' AND system_variant IN ( + 'for_you', 'songs_like_artist', 'discover', + 'deep_cuts', 'rediscover', 'new_for_you', + 'on_this_day', 'first_listens' + )) + ); + +ALTER TABLE playlists DROP CONSTRAINT IF EXISTS playlists_seed_consistent; +ALTER TABLE playlists + ADD CONSTRAINT playlists_seed_consistent CHECK ( + (system_variant IS NULL AND seed_artist_id IS NULL) + OR + (system_variant = 'for_you' AND seed_artist_id IS NULL) + OR + (system_variant = 'discover' AND seed_artist_id IS NULL) + OR + (system_variant = 'deep_cuts' AND seed_artist_id IS NULL) + OR + (system_variant = 'rediscover' AND seed_artist_id IS NULL) + OR + (system_variant = 'new_for_you' AND seed_artist_id IS NULL) + OR + (system_variant = 'on_this_day' AND seed_artist_id IS NULL) + OR + (system_variant = 'first_listens' AND seed_artist_id IS NULL) + OR + (system_variant = 'songs_like_artist' AND seed_artist_id IS NOT NULL) + );