package api import ( "errors" "net/http" "github.com/jackc/pgx/v5" "git.fabledsword.com/bvandeusen/minstrel/internal/apierror" "git.fabledsword.com/bvandeusen/minstrel/internal/db/dbq" ) // systemPlaylistsStatusResp is the wire shape for the home page's placeholder // state lookup. Fields are nullable to distinguish "no row exists yet" (all // nulls) from "row exists with these values". type systemPlaylistsStatusResp struct { InFlight bool `json:"in_flight"` LastRunAt *string `json:"last_run_at"` LastError *string `json:"last_error"` } // handleGetSystemPlaylistsStatus implements GET /api/me/system-playlists-status. // Returns the caller's system_playlist_runs row, or zero-values when no row // exists yet (i.e. the user has never had a build attempted). func (h *handlers) handleGetSystemPlaylistsStatus(w http.ResponseWriter, r *http.Request) { caller, ok := requireUser(w, r) if !ok { return } row, err := dbq.New(h.pool).GetSystemPlaylistRun(r.Context(), caller.ID) if err != nil { if errors.Is(err, pgx.ErrNoRows) { writeJSON(w, http.StatusOK, systemPlaylistsStatusResp{}) return } h.logger.Error("api: get system playlists status", "err", err) writeErr(w, apierror.InternalMsg("lookup failed", err)) return } resp := systemPlaylistsStatusResp{InFlight: row.InFlight} if row.LastRunAt.Valid { s := row.LastRunAt.Time.Format("2006-01-02T15:04:05Z07:00") resp.LastRunAt = &s } if row.LastError != nil { resp.LastError = row.LastError } writeJSON(w, http.StatusOK, resp) }