fix: address code review findings

- Fix pagination to not trust MusicBrainz count for cutoff (prevents
  silent discography truncation / hidden missing releases)
- Add idx_external_releases_artist_id index for hot per-artist queries
- Dedupe cached_at layout constant in external_releases.go
This commit is contained in:
2026-07-19 21:13:24 +03:00
parent ab2af62cb0
commit e2de91c5d3
4 changed files with 21 additions and 13 deletions

View File

@@ -121,6 +121,10 @@ func (db *DB) migrate() error {
name: "006_add_secondary_types_to_external_releases",
sql: `ALTER TABLE external_releases ADD COLUMN secondary_types TEXT;`,
},
{
name: "007_index_external_releases_artist_id",
sql: `CREATE INDEX IF NOT EXISTS idx_external_releases_artist_id ON external_releases(artist_id);`,
},
}
for _, m := range migrations {

View File

@@ -205,9 +205,10 @@ func TestMigrationTracking(t *testing.T) {
t.Fatalf("query migrations count: %v", err)
}
// We have 6 recorded migrations: artist_settings, external_releases,
// local_albums, notifications_sent, cached_at column, secondary_types column.
if count != 6 {
t.Errorf("expected 6 applied migrations, got %d", count)
// We have 7 recorded migrations: artist_settings, external_releases,
// local_albums, notifications_sent, cached_at column, secondary_types
// column, and the external_releases.artist_id index.
if count != 7 {
t.Errorf("expected 7 applied migrations, got %d", count)
}
}

View File

@@ -175,11 +175,10 @@ func GetExternalReleasesByArtistWithCache(db *DB, artistID string, ttl time.Dura
if ttl <= 0 {
return nil, nil
}
// cached_at is stored in the "2006-01-02 15:04:05" UTC layout via
// FormatCachedAt. Compare against an explicitly formatted cutoff string in
// the same layout so the lexicographic comparison is a valid time ordering.
const layout = "2006-01-02 15:04:05"
cutoff := time.Now().UTC().Add(-ttl).Format(layout)
// cached_at is stored in utcLayout via FormatCachedAt. Compare against an
// explicitly formatted cutoff string in the same layout so the
// lexicographic comparison is a valid time ordering.
cutoff := time.Now().UTC().Add(-ttl).Format(utcLayout)
rows, err := db.Conn().Query(
"SELECT rgid, artist_id, title, type, release_date, is_ignored, cached_at, secondary_types FROM external_releases WHERE artist_id = ? AND cached_at >= ?",
artistID, cutoff,