feat: overall overtime balance on history page
Backend:
- ClosedWeekStore.SumDelta: single SQL aggregate returning total delta_ms and
row count across all closed_weeks
- WeekService.Balance: thin passthrough returning BalanceResult{TotalDeltaMs, ClosedWeekCount}
- GET /api/weeks/balance handler; route registered alongside /weeks list/close/reopen
- Tests: store-level SumDelta (empty + populated), service-level Balance (empty + 2 weeks)
Frontend:
- weeks.balance() added to API client
- History page: balance card at top, fetched in parallel with existing data
- Loading state shows '—'; once loaded shows formatDelta value in green/red/gray
- Shows 'across N closed weeks' count alongside the value
This commit is contained in:
@@ -19,10 +19,21 @@ func NewWeekHandler(svc *service.WeekService) *WeekHandler {
|
||||
|
||||
func (h *WeekHandler) Routes(r chi.Router) {
|
||||
r.Get("/weeks", h.List)
|
||||
r.Get("/weeks/balance", h.Balance)
|
||||
r.Post("/weeks/{week_key}/close", h.Close)
|
||||
r.Delete("/weeks/{week_key}/close", h.Reopen)
|
||||
}
|
||||
|
||||
// Balance GET /api/weeks/balance
|
||||
func (h *WeekHandler) Balance(w http.ResponseWriter, r *http.Request) {
|
||||
bal, err := h.svc.Balance(r.Context())
|
||||
if err != nil {
|
||||
writeError(w, http.StatusInternalServerError, err.Error())
|
||||
return
|
||||
}
|
||||
writeJSON(w, http.StatusOK, bal)
|
||||
}
|
||||
|
||||
// List GET /api/weeks?from=YYYY-Www&to=YYYY-Www
|
||||
func (h *WeekHandler) List(w http.ResponseWriter, r *http.Request) {
|
||||
from := r.URL.Query().Get("from")
|
||||
|
||||
Reference in New Issue
Block a user