package main import ( "encoding/json" "errors" "io" "net/http" "git.k6n.net/mats/go-cart-actor/pkg/promotions" ) // newPromotionEvaluateHandler serves POST /promotions/evaluate: it takes a // (possibly partial) evaluation context and returns the totals plus the // applied/pending promotion effects, without creating or mutating a real cart. // An empty body is treated as an empty context (evaluates against no items). func newPromotionEvaluateHandler(store *promotions.Store, svc *promotions.PromotionService) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var req promotions.EvaluateRequest if err := json.NewDecoder(r.Body).Decode(&req); err != nil && !errors.Is(err, io.EOF) { http.Error(w, "invalid JSON body: "+err.Error(), http.StatusBadRequest) return } resp := svc.Evaluate(store.Snapshot(), req) w.Header().Set("Content-Type", "application/json") if err := json.NewEncoder(w).Encode(resp); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } }