fix(catalog): reject conflicting tmdb backfills

This commit is contained in:
Silo Server Migration
2026-05-24 22:38:44 -04:00
parent b52c4a3d4e
commit 71aaecc8e8
3 changed files with 38 additions and 6 deletions
+3 -3
View File
@@ -1389,9 +1389,9 @@ func lookupExternalIDsSQL() string {
JOIN media_items mi
ON mi.type = $5
AND (
(r.provider = 'tmdb' AND mi.tmdb_id = r.provider_id)
OR (r.provider = 'tvdb' AND mi.tvdb_id = r.provider_id)
OR (r.provider = 'imdb' AND mi.imdb_id = r.provider_id)
(r.provider = 'tmdb' AND mi.tmdb_id <> '' AND mi.tmdb_id = r.provider_id)
OR (r.provider = 'tvdb' AND mi.tvdb_id <> '' AND mi.tvdb_id = r.provider_id)
OR (r.provider = 'imdb' AND mi.imdb_id <> '' AND mi.imdb_id = r.provider_id)
)
JOIN media_item_libraries mil ON mil.content_id = mi.content_id
JOIN media_folders mf ON mf.id = mil.media_folder_id
+5 -3
View File
@@ -199,9 +199,11 @@ func TestLookupExternalIDsSQLChecksProviderTableAndDirectColumns(t *testing.T) {
"JOIN media_item_provider_ids mip",
"mip.provider = r.provider",
"mip.provider_id = r.provider_id",
"mi.tmdb_id = r.provider_id",
"mi.tvdb_id = r.provider_id",
"mi.imdb_id = r.provider_id",
"mip.item_type = $5",
"mi.type = $5",
"mi.tmdb_id <> '' AND mi.tmdb_id = r.provider_id",
"mi.tvdb_id <> '' AND mi.tvdb_id = r.provider_id",
"mi.imdb_id <> '' AND mi.imdb_id = r.provider_id",
"JOIN media_folders mf ON mf.id = mil.media_folder_id",
"mf.enabled = true",
} {
+30
View File
@@ -70,6 +70,36 @@ func (r *ProviderIDRepository) AttachTMDBID(ctx context.Context, contentID, item
return fmt.Errorf("media item tmdb id conflict: got %q, want %q", existingTMDBID, tmdbText)
}
var existingProviderTMDBID string
err = tx.QueryRow(ctx, `
SELECT provider_id
FROM media_item_provider_ids
WHERE content_id = $1 AND provider = 'tmdb'
FOR UPDATE
`, contentID).Scan(&existingProviderTMDBID)
if err != nil && !errors.Is(err, pgx.ErrNoRows) {
return fmt.Errorf("loading media item tmdb provider id: %w", err)
}
if existingProviderTMDBID != "" && existingProviderTMDBID != tmdbText {
return fmt.Errorf("media item tmdb provider id conflict: got %q, want %q", existingProviderTMDBID, tmdbText)
}
var existingOwnerContentID string
err = tx.QueryRow(ctx, `
SELECT content_id
FROM media_items
WHERE type = $1
AND tmdb_id = $2
AND content_id <> $3
LIMIT 1
`, itemType, tmdbText, contentID).Scan(&existingOwnerContentID)
if err != nil && !errors.Is(err, pgx.ErrNoRows) {
return fmt.Errorf("checking tmdb id owner: %w", err)
}
if existingOwnerContentID != "" {
return fmt.Errorf("tmdb id %q already belongs to content_id %q", tmdbText, existingOwnerContentID)
}
if _, err := tx.Exec(ctx, `
UPDATE media_items
SET tmdb_id = $1,