refactor(server/api): migrate library/suggestions/radio/home preludes (A2 4/N)

This commit is contained in:
2026-05-08 08:43:36 -04:00
parent dde3dd2804
commit 79c3ec3659
4 changed files with 5 additions and 14 deletions
+1 -3
View File
@@ -4,7 +4,6 @@ import (
"net/http"
"git.fabledsword.com/bvandeusen/minstrel/internal/apierror"
"git.fabledsword.com/bvandeusen/minstrel/internal/auth"
"git.fabledsword.com/bvandeusen/minstrel/internal/db/dbq"
"git.fabledsword.com/bvandeusen/minstrel/internal/recommendation"
)
@@ -14,9 +13,8 @@ import (
// DB failure — the SPA should render either empty states or full content,
// not a half-broken page.
func (h *handlers) handleGetHome(w http.ResponseWriter, r *http.Request) {
user, ok := auth.UserFromContext(r.Context())
user, ok := requireUser(w, r)
if !ok {
writeErr(w, apierror.ErrUnauthorized)
return
}
data, err := recommendation.HomeData(r.Context(), h.pool, user.ID)
+2 -5
View File
@@ -4,7 +4,6 @@ import (
"errors"
"net/http"
"github.com/go-chi/chi/v5"
"github.com/jackc/pgx/v5"
"github.com/jackc/pgx/v5/pgtype"
@@ -119,14 +118,12 @@ func (h *handlers) handleGetArtist(w http.ResponseWriter, r *http.Request) {
// as a flat list. Used by ArtistCard's play affordance, which shuffles
// client-side. 404 when the artist doesn't exist.
func (h *handlers) handleGetArtistTracks(w http.ResponseWriter, r *http.Request) {
id, ok := parseUUID(chi.URLParam(r, "id"))
id, ok := requireURLUUID(w, r, "id")
if !ok {
writeErr(w, apierror.BadRequest("bad_request", "invalid artist id"))
return
}
user, ok := auth.UserFromContext(r.Context())
user, ok := requireUser(w, r)
if !ok {
writeErr(w, apierror.ErrUnauthorized)
return
}
q := dbq.New(h.pool)
+1 -3
View File
@@ -13,7 +13,6 @@ import (
"github.com/jackc/pgx/v5/pgtype"
"git.fabledsword.com/bvandeusen/minstrel/internal/apierror"
"git.fabledsword.com/bvandeusen/minstrel/internal/auth"
"git.fabledsword.com/bvandeusen/minstrel/internal/db/dbq"
"git.fabledsword.com/bvandeusen/minstrel/internal/recommendation"
)
@@ -30,9 +29,8 @@ type RadioResponse struct {
// scoring formula folds in contextual_match_score using the user's current
// session vector (read from the most recent open play_event).
func (h *handlers) handleRadio(w http.ResponseWriter, r *http.Request) {
user, ok := auth.UserFromContext(r.Context())
user, ok := requireUser(w, r)
if !ok {
writeErr(w, apierror.ErrUnauthorized)
return
}
raw := strings.TrimSpace(r.URL.Query().Get("seed_track"))
+1 -3
View File
@@ -7,7 +7,6 @@ import (
"github.com/jackc/pgx/v5/pgtype"
"git.fabledsword.com/bvandeusen/minstrel/internal/apierror"
"git.fabledsword.com/bvandeusen/minstrel/internal/auth"
"git.fabledsword.com/bvandeusen/minstrel/internal/recommendation"
)
@@ -35,9 +34,8 @@ type seedContributionView struct {
//
// Returns 200 with a JSON array (possibly empty). Read-only; no admin gate.
func (h *handlers) handleListSuggestions(w http.ResponseWriter, r *http.Request) {
user, ok := auth.UserFromContext(r.Context())
user, ok := requireUser(w, r)
if !ok {
writeErr(w, apierror.ErrUnauthorized)
return
}
limit := 12