package api import ( "net/http" "git.fabledsword.com/bvandeusen/minstrel/internal/apierror" "git.fabledsword.com/bvandeusen/minstrel/internal/db/dbq" ) // coverageRollupResp is the wire shape for GET /api/admin/library/coverage. // All fields are non-negative counts. with_art + pending + settled = total; // pending_no_mbid is a subset of pending. type coverageRollupResp struct { Total int64 `json:"total"` WithArt int64 `json:"with_art"` Pending int64 `json:"pending"` Settled int64 `json:"settled"` PendingNoMbid int64 `json:"pending_no_mbid"` } // handleGetLibraryCoverage implements GET /api/admin/library/coverage. // Surfaces a library-wide rollup of albums.cover_art_source for the admin // dashboard gauge. Always 200; zeros on an empty library. func (h *handlers) handleGetLibraryCoverage(w http.ResponseWriter, r *http.Request) { q := dbq.New(h.pool) row, err := q.GetAlbumCoverageRollup(r.Context()) if err != nil { writeErrWithLog(w, h.logger, "admin: get coverage rollup", apierror.InternalMsg("lookup failed", err)) return } writeJSON(w, http.StatusOK, coverageRollupResp{ Total: row.Total, WithArt: row.WithArt, Pending: row.Pending, Settled: row.Settled, PendingNoMbid: row.PendingNoMbid, }) }