refactor(server/api): migrate library/media handlers to writeErr(err) (T3b)
This commit is contained in:
+21
-20
@@ -8,6 +8,7 @@ import (
|
||||
|
||||
"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"
|
||||
)
|
||||
@@ -34,19 +35,19 @@ type okResponse struct {
|
||||
func (h *handlers) handleEvents(w http.ResponseWriter, r *http.Request) {
|
||||
user, ok := auth.UserFromContext(r.Context())
|
||||
if !ok {
|
||||
writeErr(w, http.StatusUnauthorized, "unauthorized", "authentication required")
|
||||
writeErr(w, apierror.ErrUnauthorized)
|
||||
return
|
||||
}
|
||||
var req eventRequest
|
||||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||
writeErr(w, http.StatusBadRequest, "bad_request", "invalid JSON body")
|
||||
writeErr(w, apierror.BadRequest("bad_request", "invalid JSON body"))
|
||||
return
|
||||
}
|
||||
at := time.Now().UTC()
|
||||
if req.At != nil && *req.At != "" {
|
||||
parsed, err := time.Parse(time.RFC3339, *req.At)
|
||||
if err != nil {
|
||||
writeErr(w, http.StatusBadRequest, "bad_request", "invalid `at` timestamp")
|
||||
writeErr(w, apierror.BadRequest("bad_request", "invalid `at` timestamp"))
|
||||
return
|
||||
}
|
||||
at = parsed
|
||||
@@ -63,7 +64,7 @@ func (h *handlers) handleEvents(w http.ResponseWriter, r *http.Request) {
|
||||
case "play_skipped":
|
||||
h.handleEventPlaySkipped(w, r, user, req, at)
|
||||
default:
|
||||
writeErr(w, http.StatusBadRequest, "bad_request", "unknown event type")
|
||||
writeErr(w, apierror.BadRequest("bad_request", "unknown event type"))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,22 +74,22 @@ func (h *handlers) handleEventPlayStarted(
|
||||
) {
|
||||
trackID, ok := parseUUID(req.TrackID)
|
||||
if !ok {
|
||||
writeErr(w, http.StatusBadRequest, "bad_request", "invalid track_id")
|
||||
writeErr(w, apierror.BadRequest("bad_request", "invalid track_id"))
|
||||
return
|
||||
}
|
||||
if _, err := dbq.New(h.pool).GetTrackByID(r.Context(), trackID); err != nil {
|
||||
if errors.Is(err, pgx.ErrNoRows) {
|
||||
writeErr(w, http.StatusNotFound, "not_found", "track not found")
|
||||
writeErr(w, &apierror.Error{Status: 404, Code: "not_found", Message: "track not found"})
|
||||
return
|
||||
}
|
||||
h.logger.Error("api: events: lookup track", "err", err)
|
||||
writeErr(w, http.StatusInternalServerError, "server_error", "lookup failed")
|
||||
writeErr(w, apierror.InternalMsg("lookup failed", err))
|
||||
return
|
||||
}
|
||||
res, err := h.events.RecordPlayStarted(r.Context(), user.ID, trackID, clientID, at)
|
||||
if err != nil {
|
||||
h.logger.Error("api: events: play_started", "err", err)
|
||||
writeErr(w, http.StatusInternalServerError, "server_error", "record failed")
|
||||
writeErr(w, apierror.InternalMsg("record failed", err))
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, playStartedResponse{
|
||||
@@ -103,30 +104,30 @@ func (h *handlers) handleEventPlayEnded(
|
||||
) {
|
||||
playEventID, ok := parseUUID(req.PlayEventID)
|
||||
if !ok {
|
||||
writeErr(w, http.StatusBadRequest, "bad_request", "invalid play_event_id")
|
||||
writeErr(w, apierror.BadRequest("bad_request", "invalid play_event_id"))
|
||||
return
|
||||
}
|
||||
if req.DurationPlayedMs == nil || *req.DurationPlayedMs < 0 {
|
||||
writeErr(w, http.StatusBadRequest, "bad_request", "duration_played_ms required and must be >= 0")
|
||||
writeErr(w, apierror.BadRequest("bad_request", "duration_played_ms required and must be >= 0"))
|
||||
return
|
||||
}
|
||||
ev, err := dbq.New(h.pool).GetPlayEventByID(r.Context(), playEventID)
|
||||
if err != nil {
|
||||
if errors.Is(err, pgx.ErrNoRows) {
|
||||
writeErr(w, http.StatusNotFound, "not_found", "play_event not found")
|
||||
writeErr(w, &apierror.Error{Status: 404, Code: "not_found", Message: "play_event not found"})
|
||||
return
|
||||
}
|
||||
h.logger.Error("api: events: lookup play_event", "err", err)
|
||||
writeErr(w, http.StatusInternalServerError, "server_error", "lookup failed")
|
||||
writeErr(w, apierror.InternalMsg("lookup failed", err))
|
||||
return
|
||||
}
|
||||
if ev.UserID != user.ID {
|
||||
writeErr(w, http.StatusForbidden, "forbidden", "play_event belongs to a different user")
|
||||
writeErr(w, apierror.Forbidden("forbidden", "play_event belongs to a different user"))
|
||||
return
|
||||
}
|
||||
if err := h.events.RecordPlayEnded(r.Context(), playEventID, *req.DurationPlayedMs, at); err != nil {
|
||||
h.logger.Error("api: events: play_ended", "err", err)
|
||||
writeErr(w, http.StatusInternalServerError, "server_error", "record failed")
|
||||
writeErr(w, apierror.InternalMsg("record failed", err))
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, okResponse{OK: true})
|
||||
@@ -138,30 +139,30 @@ func (h *handlers) handleEventPlaySkipped(
|
||||
) {
|
||||
playEventID, ok := parseUUID(req.PlayEventID)
|
||||
if !ok {
|
||||
writeErr(w, http.StatusBadRequest, "bad_request", "invalid play_event_id")
|
||||
writeErr(w, apierror.BadRequest("bad_request", "invalid play_event_id"))
|
||||
return
|
||||
}
|
||||
if req.PositionMs == nil || *req.PositionMs < 0 {
|
||||
writeErr(w, http.StatusBadRequest, "bad_request", "position_ms required and must be >= 0")
|
||||
writeErr(w, apierror.BadRequest("bad_request", "position_ms required and must be >= 0"))
|
||||
return
|
||||
}
|
||||
ev, err := dbq.New(h.pool).GetPlayEventByID(r.Context(), playEventID)
|
||||
if err != nil {
|
||||
if errors.Is(err, pgx.ErrNoRows) {
|
||||
writeErr(w, http.StatusNotFound, "not_found", "play_event not found")
|
||||
writeErr(w, &apierror.Error{Status: 404, Code: "not_found", Message: "play_event not found"})
|
||||
return
|
||||
}
|
||||
h.logger.Error("api: events: lookup play_event", "err", err)
|
||||
writeErr(w, http.StatusInternalServerError, "server_error", "lookup failed")
|
||||
writeErr(w, apierror.InternalMsg("lookup failed", err))
|
||||
return
|
||||
}
|
||||
if ev.UserID != user.ID {
|
||||
writeErr(w, http.StatusForbidden, "forbidden", "play_event belongs to a different user")
|
||||
writeErr(w, apierror.Forbidden("forbidden", "play_event belongs to a different user"))
|
||||
return
|
||||
}
|
||||
if err := h.events.RecordPlaySkipped(r.Context(), playEventID, *req.PositionMs, at); err != nil {
|
||||
h.logger.Error("api: events: play_skipped", "err", err)
|
||||
writeErr(w, http.StatusInternalServerError, "server_error", "record failed")
|
||||
writeErr(w, apierror.InternalMsg("record failed", err))
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, okResponse{OK: true})
|
||||
|
||||
Reference in New Issue
Block a user