diff --git a/cmd/cart/mutation_add_voucher.go b/cmd/cart/mutation_add_voucher.go index 205438b..53b0952 100644 --- a/cmd/cart/mutation_add_voucher.go +++ b/cmd/cart/mutation_add_voucher.go @@ -4,24 +4,37 @@ import ( "fmt" "slices" + "git.tornberg.me/go-cart-actor/pkg/actor" "git.tornberg.me/go-cart-actor/pkg/messages" "git.tornberg.me/go-cart-actor/pkg/voucher" ) func (ctx *MutationContext) AddVoucher(g *CartGrain, m *messages.AddVoucher) error { if m == nil { - return fmt.Errorf("AddVoucher: nil payload") + return &actor.MutationError{ + Message: "AddVoucher: nil payload", + Code: 1001, + StatusCode: 400, + } } if slices.ContainsFunc(g.Vouchers, func(v *voucher.Voucher) bool { return v.Code == m.Code }) { - return fmt.Errorf("voucher already applied") + return &actor.MutationError{ + Message: "voucher already applied", + Code: 1002, + StatusCode: 400, + } } voucherData, err := ctx.VoucherService.GetVoucher(m.Code) if err != nil { - return fmt.Errorf("cant find voucher: %w", err) + return &actor.MutationError{ + Message: fmt.Sprintf("cant find voucher: %v", err), + Code: 1003, + StatusCode: 400, + } } if voucherData == nil { diff --git a/pkg/actor/mutation_registry.go b/pkg/actor/mutation_registry.go index 1e5f66a..8b3d59d 100644 --- a/pkg/actor/mutation_registry.go +++ b/pkg/actor/mutation_registry.go @@ -12,7 +12,7 @@ import ( type ApplyResult struct { Type string `json:"type"` Mutation proto.Message `json:"mutation"` - Error string `json:"error,omitempty"` + Error error `json:"error,omitempty"` } type MutationRegistry interface { @@ -30,9 +30,23 @@ type ProtoMutationRegistry struct { } var ( - ErrMutationNotRegistered = fmt.Errorf("mutation not registered") + ErrMutationNotRegistered = &MutationError{ + Message: "mutation not registered", + Code: 255, + StatusCode: 500, + } ) +type MutationError struct { + Message string `json:"message"` + Code uint32 `json:"code"` + StatusCode uint32 `json:"status_code"` +} + +func (m MutationError) Error() string { + return m.Message +} + // MutationOption configures additional behavior for a registered mutation. type MutationOption func(*mutationOptions) @@ -167,11 +181,11 @@ func (r *ProtoMutationRegistry) Apply(grain any, msg ...proto.Message) ([]ApplyR entry, ok := r.mutationRegistry[rt] r.mutationRegistryMu.RUnlock() if !ok { - results = append(results, ApplyResult{Error: ErrMutationNotRegistered.Error(), Type: rt.Name(), Mutation: m}) + results = append(results, ApplyResult{Error: ErrMutationNotRegistered, Type: rt.Name(), Mutation: m}) continue } err := entry.Handle(grain, m) - results = append(results, ApplyResult{Error: err.Error(), Type: rt.Name(), Mutation: m}) + results = append(results, ApplyResult{Error: err, Type: rt.Name(), Mutation: m}) } // if entry.updateTotals {