refactor(server/api): migrate library/media handlers to writeErr(err) (T3b)

This commit is contained in:
2026-05-07 20:48:20 -04:00
parent e382b0d718
commit 91f4f5c18a
7 changed files with 85 additions and 78 deletions
+28 -27
View File
@@ -7,6 +7,7 @@ import (
"github.com/go-chi/chi/v5"
"github.com/jackc/pgx/v5"
"git.fabledsword.com/bvandeusen/minstrel/internal/apierror"
"git.fabledsword.com/bvandeusen/minstrel/internal/auth"
"git.fabledsword.com/bvandeusen/minstrel/internal/db/dbq"
)
@@ -17,30 +18,30 @@ import (
func (h *handlers) handleGetTrack(w http.ResponseWriter, r *http.Request) {
id, ok := parseUUID(chi.URLParam(r, "id"))
if !ok {
writeErr(w, http.StatusBadRequest, "bad_request", "invalid track id")
writeErr(w, apierror.BadRequest("bad_request", "invalid track id"))
return
}
q := dbq.New(h.pool)
track, err := q.GetTrackByID(r.Context(), id)
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
writeErr(w, http.StatusNotFound, "not_found", "track not found")
writeErr(w, apierror.NotFound("track"))
return
}
h.logger.Error("api: get track failed", "err", err)
writeErr(w, http.StatusInternalServerError, "server_error", "lookup failed")
writeErr(w, apierror.InternalMsg("lookup failed", err))
return
}
album, err := q.GetAlbumByID(r.Context(), track.AlbumID)
if err != nil {
h.logger.Error("api: get track album failed", "err", err)
writeErr(w, http.StatusInternalServerError, "server_error", "lookup failed")
writeErr(w, apierror.InternalMsg("lookup failed", err))
return
}
artist, err := q.GetArtistByID(r.Context(), track.ArtistID)
if err != nil {
h.logger.Error("api: get track artist failed", "err", err)
writeErr(w, http.StatusInternalServerError, "server_error", "lookup failed")
writeErr(w, apierror.InternalMsg("lookup failed", err))
return
}
writeJSON(w, http.StatusOK, trackRefFrom(track, album.Title, artist.Name))
@@ -52,24 +53,24 @@ func (h *handlers) handleGetTrack(w http.ResponseWriter, r *http.Request) {
func (h *handlers) handleGetAlbum(w http.ResponseWriter, r *http.Request) {
id, ok := parseUUID(chi.URLParam(r, "id"))
if !ok {
writeErr(w, http.StatusBadRequest, "bad_request", "invalid album id")
writeErr(w, apierror.BadRequest("bad_request", "invalid album id"))
return
}
q := dbq.New(h.pool)
album, err := q.GetAlbumByID(r.Context(), id)
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
writeErr(w, http.StatusNotFound, "not_found", "album not found")
writeErr(w, apierror.NotFound("album"))
return
}
h.logger.Error("api: get album failed", "err", err)
writeErr(w, http.StatusInternalServerError, "server_error", "lookup failed")
writeErr(w, apierror.InternalMsg("lookup failed", err))
return
}
artist, err := q.GetArtistByID(r.Context(), album.ArtistID)
if err != nil {
h.logger.Error("api: get album artist failed", "err", err)
writeErr(w, http.StatusInternalServerError, "server_error", "lookup failed")
writeErr(w, apierror.InternalMsg("lookup failed", err))
return
}
var tracks []dbq.Track
@@ -82,7 +83,7 @@ func (h *handlers) handleGetAlbum(w http.ResponseWriter, r *http.Request) {
}
if err != nil {
h.logger.Error("api: list tracks failed", "err", err)
writeErr(w, http.StatusInternalServerError, "server_error", "lookup failed")
writeErr(w, apierror.InternalMsg("lookup failed", err))
return
}
refs := make([]TrackRef, 0, len(tracks))
@@ -105,24 +106,24 @@ func (h *handlers) handleGetAlbum(w http.ResponseWriter, r *http.Request) {
func (h *handlers) handleGetArtist(w http.ResponseWriter, r *http.Request) {
id, ok := parseUUID(chi.URLParam(r, "id"))
if !ok {
writeErr(w, http.StatusBadRequest, "bad_request", "invalid artist id")
writeErr(w, apierror.BadRequest("bad_request", "invalid artist id"))
return
}
q := dbq.New(h.pool)
artist, err := q.GetArtistByID(r.Context(), id)
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
writeErr(w, http.StatusNotFound, "not_found", "artist not found")
writeErr(w, apierror.NotFound("artist"))
return
}
h.logger.Error("api: get artist failed", "err", err)
writeErr(w, http.StatusInternalServerError, "server_error", "lookup failed")
writeErr(w, apierror.InternalMsg("lookup failed", err))
return
}
albums, err := q.ListAlbumsByArtist(r.Context(), id)
if err != nil {
h.logger.Error("api: list albums by artist failed", "err", err)
writeErr(w, http.StatusInternalServerError, "server_error", "lookup failed")
writeErr(w, apierror.InternalMsg("lookup failed", err))
return
}
refs := make([]AlbumRef, 0, len(albums))
@@ -130,7 +131,7 @@ func (h *handlers) handleGetArtist(w http.ResponseWriter, r *http.Request) {
count, cerr := q.CountTracksByAlbum(r.Context(), a.ID)
if cerr != nil {
h.logger.Error("api: count tracks failed", "err", cerr)
writeErr(w, http.StatusInternalServerError, "server_error", "lookup failed")
writeErr(w, apierror.InternalMsg("lookup failed", cerr))
return
}
// durationSec=0: not aggregated for nested album lists per spec data flow.
@@ -150,22 +151,22 @@ func (h *handlers) handleGetArtist(w http.ResponseWriter, r *http.Request) {
func (h *handlers) handleGetArtistTracks(w http.ResponseWriter, r *http.Request) {
id, ok := parseUUID(chi.URLParam(r, "id"))
if !ok {
writeErr(w, http.StatusBadRequest, "bad_request", "invalid artist id")
writeErr(w, apierror.BadRequest("bad_request", "invalid artist id"))
return
}
user, ok := auth.UserFromContext(r.Context())
if !ok {
writeErr(w, http.StatusUnauthorized, "unauthorized", "authentication required")
writeErr(w, apierror.ErrUnauthorized)
return
}
q := dbq.New(h.pool)
if _, err := q.GetArtistByID(r.Context(), id); err != nil {
if errors.Is(err, pgx.ErrNoRows) {
writeErr(w, http.StatusNotFound, "not_found", "artist not found")
writeErr(w, apierror.NotFound("artist"))
return
}
h.logger.Error("api: get artist for tracks", "err", err)
writeErr(w, http.StatusInternalServerError, "server_error", "lookup failed")
writeErr(w, apierror.InternalMsg("lookup failed", err))
return
}
rows, err := q.ListArtistTracksForUser(r.Context(), dbq.ListArtistTracksForUserParams{
@@ -173,7 +174,7 @@ func (h *handlers) handleGetArtistTracks(w http.ResponseWriter, r *http.Request)
})
if err != nil {
h.logger.Error("api: list artist tracks", "err", err)
writeErr(w, http.StatusInternalServerError, "server_error", "lookup failed")
writeErr(w, apierror.InternalMsg("lookup failed", err))
return
}
out := make([]TrackRef, 0, len(rows))
@@ -194,12 +195,12 @@ func (h *handlers) handleListArtists(w http.ResponseWriter, r *http.Request) {
sort = "alpha"
}
if sort != "alpha" && sort != "newest" {
writeErr(w, http.StatusBadRequest, "bad_request", "sort must be alpha or newest")
writeErr(w, apierror.BadRequest("bad_request", "sort must be alpha or newest"))
return
}
limit, offset, err := parsePaging(r.URL.Query())
if err != nil {
writeErr(w, http.StatusBadRequest, "bad_request", err.Error())
writeErr(w, apierror.BadRequest("bad_request", err.Error()))
return
}
q := dbq.New(h.pool)
@@ -211,13 +212,13 @@ func (h *handlers) handleListArtists(w http.ResponseWriter, r *http.Request) {
})
if err != nil {
h.logger.Error("api: list artists newest", "err", err)
writeErr(w, http.StatusInternalServerError, "server_error", "lookup failed")
writeErr(w, apierror.InternalMsg("lookup failed", err))
return
}
total, terr := q.CountArtists(r.Context())
if terr != nil {
h.logger.Error("api: count artists", "err", terr)
writeErr(w, http.StatusInternalServerError, "server_error", "count failed")
writeErr(w, apierror.InternalMsg("count failed", terr))
return
}
items := make([]ArtistRef, 0, len(artists))
@@ -225,7 +226,7 @@ func (h *handlers) handleListArtists(w http.ResponseWriter, r *http.Request) {
albums, aerr := q.ListAlbumsByArtist(r.Context(), a.ID)
if aerr != nil {
h.logger.Error("api: list albums for artist", "err", aerr)
writeErr(w, http.StatusInternalServerError, "server_error", "lookup failed")
writeErr(w, apierror.InternalMsg("lookup failed", aerr))
return
}
items = append(items, artistRefFrom(a, len(albums)))
@@ -241,13 +242,13 @@ func (h *handlers) handleListArtists(w http.ResponseWriter, r *http.Request) {
})
if err != nil {
h.logger.Error("api: list artists alpha", "err", err)
writeErr(w, http.StatusInternalServerError, "server_error", "lookup failed")
writeErr(w, apierror.InternalMsg("lookup failed", err))
return
}
total, terr := q.CountArtists(r.Context())
if terr != nil {
h.logger.Error("api: count artists", "err", terr)
writeErr(w, http.StatusInternalServerError, "server_error", "count failed")
writeErr(w, apierror.InternalMsg("count failed", terr))
return
}
items := make([]ArtistRef, 0, len(rows))