refactor(server/sql): unify *ForUser track queries via nullable user_id (A1)

This commit is contained in:
2026-05-08 08:15:19 -04:00
parent b1ef3c3688
commit bffa397250
7 changed files with 49 additions and 163 deletions
+6 -6
View File
@@ -6,6 +6,7 @@ import (
"github.com/go-chi/chi/v5"
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgtype"
"git.fabledsword.com/bvandeusen/minstrel/internal/apierror"
"git.fabledsword.com/bvandeusen/minstrel/internal/auth"
@@ -53,14 +54,13 @@ func (h *handlers) handleGetAlbum(w http.ResponseWriter, r *http.Request) {
writeErr(w, apierror.InternalMsg("lookup failed", err))
return
}
var tracks []dbq.Track
var userID pgtype.UUID
if user, ok := auth.UserFromContext(r.Context()); ok {
tracks, err = q.ListTracksByAlbumForUser(r.Context(), dbq.ListTracksByAlbumForUserParams{
AlbumID: album.ID, UserID: user.ID,
})
} else {
tracks, err = q.ListTracksByAlbum(r.Context(), album.ID)
userID = user.ID
}
tracks, err := q.ListTracksByAlbum(r.Context(), dbq.ListTracksByAlbumParams{
AlbumID: album.ID, UserID: userID,
})
if err != nil {
h.logger.Error("api: list tracks failed", "err", err)
writeErr(w, apierror.InternalMsg("lookup failed", err))
+1 -1
View File
@@ -28,7 +28,7 @@ func resolveAlbumCoverPath(ctx context.Context, q *dbq.Queries, album dbq.Album)
return *album.CoverArtPath
}
}
tracks, err := q.ListTracksByAlbum(ctx, album.ID)
tracks, err := q.ListTracksByAlbum(ctx, dbq.ListTracksByAlbumParams{AlbumID: album.ID})
if err != nil || len(tracks) == 0 {
return ""
}
+10 -16
View File
@@ -76,29 +76,23 @@ func (h *handlers) handleSearch(w http.ResponseWriter, r *http.Request) {
return
}
var tracks []dbq.Track
// userID is NULL for unauthenticated callers; the unified queries
// skip the quarantine filter when user_id IS NULL.
var userID pgtype.UUID
if user, ok := auth.UserFromContext(r.Context()); ok {
tracks, err = dbQ.SearchTracksForUser(r.Context(), dbq.SearchTracksForUserParams{
Column1: needle, UserID: user.ID, Limit: int32(limit), Offset: int32(offset),
})
} else {
tracks, err = dbQ.SearchTracks(r.Context(), dbq.SearchTracksParams{
Column1: needle, Limit: int32(limit), Offset: int32(offset),
})
userID = user.ID
}
tracks, err := dbQ.SearchTracks(r.Context(), dbq.SearchTracksParams{
Column1: needle, UserID: userID, Limit: int32(limit), Offset: int32(offset),
})
if err != nil {
h.logger.Error("api: search tracks failed", "err", err)
writeErr(w, apierror.InternalMsg("search failed", err))
return
}
var trackTotal int64
if user, ok := auth.UserFromContext(r.Context()); ok {
trackTotal, err = dbQ.CountTracksMatchingForUser(r.Context(), dbq.CountTracksMatchingForUserParams{
Column1: q, UserID: user.ID,
})
} else {
trackTotal, err = dbQ.CountTracksMatching(r.Context(), q)
}
trackTotal, err := dbQ.CountTracksMatching(r.Context(), dbq.CountTracksMatchingParams{
Column1: q, UserID: userID,
})
if err != nil {
h.logger.Error("api: count tracks matching failed", "err", err)
writeErr(w, apierror.InternalMsg("search failed", err))