initial boilerplate
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/go-chi/chi/v5"
|
||||
|
||||
"github.com/yourname/deflated/internal/db"
|
||||
)
|
||||
|
||||
// ItemHandler handles routes that return price and inflation data.
|
||||
type ItemHandler struct {
|
||||
queries *db.Queries
|
||||
}
|
||||
|
||||
func NewItemHandler(queries *db.Queries) *ItemHandler {
|
||||
return &ItemHandler{queries: queries}
|
||||
}
|
||||
|
||||
// List handles GET /api/items
|
||||
func (h *ItemHandler) List(w http.ResponseWriter, r *http.Request) {
|
||||
items, err := h.queries.ListCanonicalItems(r.Context())
|
||||
if err != nil {
|
||||
slog.Error("list items", "error", err)
|
||||
writeError(w, http.StatusInternalServerError, "database error")
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, items)
|
||||
}
|
||||
|
||||
// PriceHistory handles GET /api/items/{name}/history
|
||||
func (h *ItemHandler) PriceHistory(w http.ResponseWriter, r *http.Request) {
|
||||
name := chi.URLParam(r, "name")
|
||||
history, err := h.queries.GetPriceHistory(r.Context(), name)
|
||||
if err != nil {
|
||||
slog.Error("get price history", "error", err, "name", name)
|
||||
writeError(w, http.StatusInternalServerError, "database error")
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, history)
|
||||
}
|
||||
|
||||
// TopMovers handles GET /api/items/top-movers?months=12&limit=10
|
||||
func (h *ItemHandler) TopMovers(w http.ResponseWriter, r *http.Request) {
|
||||
months, _ := strconv.Atoi(r.URL.Query().Get("months"))
|
||||
if months <= 0 {
|
||||
months = 12
|
||||
}
|
||||
limit, _ := strconv.Atoi(r.URL.Query().Get("limit"))
|
||||
if limit <= 0 {
|
||||
limit = 10
|
||||
}
|
||||
|
||||
movers, err := h.queries.GetTopMovers(r.Context(), months, limit)
|
||||
if err != nil {
|
||||
slog.Error("get top movers", "error", err)
|
||||
writeError(w, http.StatusInternalServerError, "database error")
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, movers)
|
||||
}
|
||||
|
||||
// InflationSummary handles GET /api/inflation/summary?base_year=2009
|
||||
func (h *ItemHandler) InflationSummary(w http.ResponseWriter, r *http.Request) {
|
||||
baseYear, _ := strconv.Atoi(r.URL.Query().Get("base_year"))
|
||||
if baseYear <= 0 {
|
||||
baseYear = 2009
|
||||
}
|
||||
|
||||
summary, err := h.queries.GetInflationSummary(r.Context(), baseYear)
|
||||
if err != nil {
|
||||
slog.Error("get inflation summary", "error", err)
|
||||
writeError(w, http.StatusInternalServerError, "database error")
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, summary)
|
||||
}
|
||||
Reference in New Issue
Block a user