refactor(server/api): resolveByID helper for parseUUID->fetch->404 (T4)

This commit is contained in:
2026-05-07 21:28:20 -04:00
parent 754a7955cc
commit 49218e5231
6 changed files with 168 additions and 102 deletions
+6 -31
View File
@@ -8,15 +8,11 @@ package api
import (
"context"
"errors"
"net/http"
"os"
"path/filepath"
"strings"
"github.com/go-chi/chi/v5"
"github.com/jackc/pgx/v5"
"git.fabledsword.com/bvandeusen/minstrel/internal/apierror"
"git.fabledsword.com/bvandeusen/minstrel/internal/coverart"
"git.fabledsword.com/bvandeusen/minstrel/internal/db/dbq"
@@ -88,20 +84,10 @@ func imageContentType(path string) string {
// byte-serving to http.ServeContent so clients get Range / If-Modified-Since
// / ETag for free.
func (h *handlers) handleGetCover(w http.ResponseWriter, r *http.Request) {
id, ok := parseUUID(chi.URLParam(r, "id"))
if !ok {
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, &apierror.Error{Status: 404, Code: "not_found", Message: "album not found"})
return
}
h.logger.Error("api: get album for cover failed", "err", err)
writeErr(w, apierror.InternalMsg("server error", err))
album, apiErr := resolveByID(r, "id", q.GetAlbumByID, "album")
if apiErr != nil {
writeErr(w, apiErr)
return
}
path := resolveAlbumCoverPath(r.Context(), q, album)
@@ -133,20 +119,9 @@ func (h *handlers) handleGetCover(w http.ResponseWriter, r *http.Request) {
// disk and delegates byte-serving to http.ServeContent, which handles Range,
// If-Modified-Since, and ETag based on the file's mod time.
func (h *handlers) handleGetStream(w http.ResponseWriter, r *http.Request) {
id, ok := parseUUID(chi.URLParam(r, "id"))
if !ok {
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, &apierror.Error{Status: 404, Code: "not_found", Message: "track not found"})
return
}
h.logger.Error("api: get track for stream failed", "err", err)
writeErr(w, apierror.InternalMsg("server error", err))
track, apiErr := resolveByID(r, "id", dbq.New(h.pool).GetTrackByID, "track")
if apiErr != nil {
writeErr(w, apiErr)
return
}
f, err := os.Open(track.FilePath)