From 9a705d0ba4a20d380b2e9b51868c7f11305fee9f Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Thu, 7 May 2026 07:39:02 -0400 Subject: [PATCH] feat(db/m7-art-providers): migration 0020 + provider-hash queries Relaxes the artists/albums art_source CHECK constraints to allow the new 'deezer' and 'lastfm' source values alongside the existing accepted set. Adds cover_art_sources_meta.last_registered_providers_hash for the boot-time auto-bump detection: when the registered-provider set changes between deploys, we bump current_version once so 'none' rows become eligible for retry against the new chain. Two sqlc queries added: GetCoverArtProvidersHash reads the stored hash; BumpVersionAndSetProvidersHash atomically increments the version and stores a new hash, returning the new version. Both used by the boot logic in a later task. --- internal/db/dbq/coverart_settings.sql.go | 32 +++++++++++++++++++ internal/db/dbq/models.go | 5 +-- .../0020_relax_art_source_checks.down.sql | 18 +++++++++++ .../0020_relax_art_source_checks.up.sql | 22 +++++++++++++ internal/db/queries/coverart_settings.sql | 16 ++++++++++ 5 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 internal/db/migrations/0020_relax_art_source_checks.down.sql create mode 100644 internal/db/migrations/0020_relax_art_source_checks.up.sql diff --git a/internal/db/dbq/coverart_settings.sql.go b/internal/db/dbq/coverart_settings.sql.go index 4ef1bb98..c87455b4 100644 --- a/internal/db/dbq/coverart_settings.sql.go +++ b/internal/db/dbq/coverart_settings.sql.go @@ -27,6 +27,38 @@ func (q *Queries) BumpSourcesVersion(ctx context.Context) (int32, error) { return current_version, err } +const bumpVersionAndSetProvidersHash = `-- name: BumpVersionAndSetProvidersHash :one +UPDATE cover_art_sources_meta + SET current_version = current_version + 1, + last_registered_providers_hash = $1 + WHERE id = true +RETURNING current_version +` + +// Atomically increments the version and stores the new provider-set +// hash. Called at boot when the registered-provider set has changed +// since the last start, so 'none' rows become eligible for retry. +// RETURNING gives the new version without a follow-up SELECT. +func (q *Queries) BumpVersionAndSetProvidersHash(ctx context.Context, lastRegisteredProvidersHash string) (int32, error) { + row := q.db.QueryRow(ctx, bumpVersionAndSetProvidersHash, lastRegisteredProvidersHash) + var current_version int32 + err := row.Scan(¤t_version) + return current_version, err +} + +const getCoverArtProvidersHash = `-- name: GetCoverArtProvidersHash :one +SELECT last_registered_providers_hash + FROM cover_art_sources_meta + WHERE id = true +` + +func (q *Queries) GetCoverArtProvidersHash(ctx context.Context) (string, error) { + row := q.db.QueryRow(ctx, getCoverArtProvidersHash) + var last_registered_providers_hash string + err := row.Scan(&last_registered_providers_hash) + return last_registered_providers_hash, err +} + const getCurrentSourcesVersion = `-- name: GetCurrentSourcesVersion :one SELECT current_version FROM cover_art_sources_meta WHERE id = true ` diff --git a/internal/db/dbq/models.go b/internal/db/dbq/models.go index bae3c661..42b5232a 100644 --- a/internal/db/dbq/models.go +++ b/internal/db/dbq/models.go @@ -251,8 +251,9 @@ type CoverArtProviderSetting struct { } type CoverArtSourcesMetum struct { - ID bool - CurrentVersion int32 + ID bool + CurrentVersion int32 + LastRegisteredProvidersHash string } type GeneralLike struct { diff --git a/internal/db/migrations/0020_relax_art_source_checks.down.sql b/internal/db/migrations/0020_relax_art_source_checks.down.sql new file mode 100644 index 00000000..59166599 --- /dev/null +++ b/internal/db/migrations/0020_relax_art_source_checks.down.sql @@ -0,0 +1,18 @@ +-- Restore the prior tighter CHECK constraints (pre-Deezer/Last.fm). +-- This will fail if any rows currently have artist_art_source = +-- 'deezer' or 'lastfm' (likewise album); operator must clear those +-- rows manually before rolling back. + +ALTER TABLE artists DROP CONSTRAINT IF EXISTS artists_artist_art_source_check; +ALTER TABLE artists + ADD CONSTRAINT artists_artist_art_source_check + CHECK (artist_art_source IS NULL + OR artist_art_source IN ('theaudiodb','none')); + +ALTER TABLE albums DROP CONSTRAINT IF EXISTS albums_cover_art_source_check; +ALTER TABLE albums + ADD CONSTRAINT albums_cover_art_source_check + CHECK (cover_art_source IS NULL + OR cover_art_source IN ('embedded','sidecar','mbcaa','theaudiodb','none')); + +ALTER TABLE cover_art_sources_meta DROP COLUMN IF EXISTS last_registered_providers_hash; diff --git a/internal/db/migrations/0020_relax_art_source_checks.up.sql b/internal/db/migrations/0020_relax_art_source_checks.up.sql new file mode 100644 index 00000000..272dfcc5 --- /dev/null +++ b/internal/db/migrations/0020_relax_art_source_checks.up.sql @@ -0,0 +1,22 @@ +-- Relax cover-art and artist-art source CHECK constraints so the new +-- Deezer and Last.fm providers (next slice) can persist their IDs as +-- accepted source values. Also add the +-- last_registered_providers_hash column to cover_art_sources_meta for +-- boot-time auto-bump detection (when the registered-provider set +-- changes, we bump current_version once so 'none' rows get +-- re-eligibled). + +ALTER TABLE artists DROP CONSTRAINT IF EXISTS artists_artist_art_source_check; +ALTER TABLE artists + ADD CONSTRAINT artists_artist_art_source_check + CHECK (artist_art_source IS NULL + OR artist_art_source IN ('theaudiodb','deezer','lastfm','none')); + +ALTER TABLE albums DROP CONSTRAINT IF EXISTS albums_cover_art_source_check; +ALTER TABLE albums + ADD CONSTRAINT albums_cover_art_source_check + CHECK (cover_art_source IS NULL + OR cover_art_source IN ('embedded','sidecar','mbcaa','theaudiodb','deezer','lastfm','none')); + +ALTER TABLE cover_art_sources_meta + ADD COLUMN IF NOT EXISTS last_registered_providers_hash text NOT NULL DEFAULT ''; diff --git a/internal/db/queries/coverart_settings.sql b/internal/db/queries/coverart_settings.sql index edb6b54b..aa3b898a 100644 --- a/internal/db/queries/coverart_settings.sql +++ b/internal/db/queries/coverart_settings.sql @@ -44,3 +44,19 @@ UPDATE cover_art_sources_meta SET current_version = current_version + 1 WHERE id = true RETURNING current_version; + +-- name: GetCoverArtProvidersHash :one +SELECT last_registered_providers_hash + FROM cover_art_sources_meta + WHERE id = true; + +-- name: BumpVersionAndSetProvidersHash :one +-- Atomically increments the version and stores the new provider-set +-- hash. Called at boot when the registered-provider set has changed +-- since the last start, so 'none' rows become eligible for retry. +-- RETURNING gives the new version without a follow-up SELECT. +UPDATE cover_art_sources_meta + SET current_version = current_version + 1, + last_registered_providers_hash = $1 + WHERE id = true +RETURNING current_version;