package handler import ( "encoding/json" "net/http" "strconv" "strings" "Engine/internal/model" "Engine/internal/service" ) type BudgetHandler struct { svc *service.BudgetService } func NewBudgetHandler(svc *service.BudgetService) *BudgetHandler { return &BudgetHandler{svc: svc} } func (h *BudgetHandler) Create(w http.ResponseWriter, r *http.Request) { var req model.CreateBudgetRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { writeError(w, http.StatusBadRequest, "invalid request body") return } errs := req.Valid() if len(errs) > 0 { writeError(w, http.StatusBadRequest, strings.Join(errs, "; ")) return } budget, err := h.svc.Create(r.Context(), req) if err != nil { writeError(w, http.StatusInternalServerError, err.Error()) return } writeJSON(w, http.StatusCreated, budget) } func (h *BudgetHandler) Update(w http.ResponseWriter, r *http.Request) { id, err := strconv.Atoi(r.PathValue("id")) if err != nil { writeError(w, http.StatusBadRequest, "invalid id") return } var req model.UpdateBudgetRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil { writeError(w, http.StatusBadRequest, "invalid request body") return } errs := req.Valid() if len(errs) > 0 { writeError(w, http.StatusBadRequest, strings.Join(errs, "; ")) return } budget, err := h.svc.Update(r.Context(), id, req) if err != nil { writeError(w, http.StatusInternalServerError, err.Error()) return } writeJSON(w, http.StatusOK, budget) } func (h *BudgetHandler) Delete(w http.ResponseWriter, r *http.Request) { id, err := strconv.Atoi(r.PathValue("id")) if err != nil { writeError(w, http.StatusBadRequest, "invalid id") return } if err := h.svc.Delete(r.Context(), id); err != nil { writeError(w, http.StatusInternalServerError, err.Error()) return } w.WriteHeader(http.StatusNoContent) }