Files
carvalho-finances/apps/api/internal/handler/settings.go
T
Mlcavalho1andClaude Sonnet 4.6 1d59cb2a0e feat: #45 meta de poupança configurável + conquistas genéricas
- Nova tabela user_settings com savings_goal_pct (default 40%)
- API GET /api/settings, PUT /api/settings
- DashboardService inclui savings_goal_pct no payload
- DashboardHandler dispara savings_checked com goal configurado
- GameService.NotifyAction: checa pct >= goal (sem hardcode de 40%)
- SettingsView: painel META DE POUPANÇA com input configurável
- HomeView: widget mostra meta dinâmica (META: X%) e usa savingsGoal
- stores/settings.ts: store com fetch e update

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-05-28 22:32:08 -03:00

45 lines
1.1 KiB
Go

package handler
import (
"encoding/json"
"net/http"
"financeiro-carvalho/internal/model"
"financeiro-carvalho/internal/service"
)
type SettingsHandler struct {
svc *service.SettingsService
}
func NewSettingsHandler(svc *service.SettingsService) *SettingsHandler {
return &SettingsHandler{svc: svc}
}
func (h *SettingsHandler) Get(w http.ResponseWriter, r *http.Request) {
s, err := h.svc.Get(r.Context())
if err != nil {
respondError(w, http.StatusInternalServerError, "failed to get settings")
return
}
respondJSON(w, http.StatusOK, s)
}
func (h *SettingsHandler) Update(w http.ResponseWriter, r *http.Request) {
var in model.UserSettings
if err := json.NewDecoder(r.Body).Decode(&in); err != nil {
respondError(w, http.StatusBadRequest, "invalid JSON")
return
}
out, err := h.svc.Update(r.Context(), in)
if err != nil {
if err == service.ErrInvalidSavingsGoal {
respondError(w, http.StatusUnprocessableEntity, err.Error())
return
}
respondError(w, http.StatusInternalServerError, "failed to update settings")
return
}
respondJSON(w, http.StatusOK, out)
}