package handler import ( "encoding/json" "net/http" "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) } // PUT /api/v1/budgets/update func (h *BudgetHandler) Update(w http.ResponseWriter, r *http.Request) { 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(), req) if err != nil { writeError(w, http.StatusInternalServerError, err.Error()) return } writeJSON(w, http.StatusOK, budget) } // DELETE /api/v1/budgets/delete func (h *BudgetHandler) Delete(w http.ResponseWriter, r *http.Request) { var req struct { ID int `json:"id"` } if err := json.NewDecoder(r.Body).Decode(&req); err != nil { writeError(w, http.StatusBadRequest, "invalid id") return } if err := h.svc.Delete(r.Context(), req); err != nil { writeError(w, http.StatusInternalServerError, err.Error()) return } w.WriteHeader(http.StatusNoContent) }