58 lines
1.8 KiB
Go
58 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
messages "git.tornberg.me/go-cart-actor/pkg/messages"
|
|
)
|
|
|
|
// mutation_set_cart_items.go
|
|
//
|
|
// Registers the SetCartRequest mutation. This mutation replaces the entire list
|
|
// of cart items with the provided list (each entry is an AddRequest).
|
|
//
|
|
// Behavior:
|
|
// - Clears existing items (but leaves deliveries intact).
|
|
// - Iterates over each AddRequest and delegates to CartGrain.AddItem
|
|
// (which performs product lookup, creates AddItem mutation).
|
|
// - If any single addition fails, the mutation aborts with an error;
|
|
// items added prior to the failure remain (consistent with previous behavior).
|
|
// - Totals recalculated after completion via WithTotals().
|
|
//
|
|
// Notes:
|
|
// - Potential optimization: batch product lookups; currently sequential.
|
|
// - Consider adding rollback semantics if atomic replacement is desired.
|
|
// - Deliveries might reference item IDs that are now invalid—original logic
|
|
// also left deliveries untouched. If that becomes an issue, add a cleanup
|
|
// pass to remove deliveries whose item IDs no longer exist.
|
|
func init() {
|
|
RegisterMutation[messages.SetCartRequest](
|
|
"SetCartRequest",
|
|
func(g *CartGrain, m *messages.SetCartRequest) error {
|
|
if m == nil {
|
|
return fmt.Errorf("SetCartRequest: nil payload")
|
|
}
|
|
|
|
// Clear current items (keep deliveries)
|
|
g.mu.Lock()
|
|
g.Items = make([]*CartItem, 0, len(m.Items))
|
|
g.mu.Unlock()
|
|
|
|
for _, it := range m.Items {
|
|
if it == nil {
|
|
continue
|
|
}
|
|
if it.Sku == "" || it.Quantity < 1 {
|
|
return fmt.Errorf("SetCartRequest: invalid item (sku='%s' qty=%d)", it.Sku, it.Quantity)
|
|
}
|
|
_, err := g.AddItem(it.Sku, int(it.Quantity), it.Country, it.StoreId)
|
|
if err != nil {
|
|
return fmt.Errorf("SetCartRequest: add sku '%s' failed: %w", it.Sku, err)
|
|
}
|
|
}
|
|
return nil
|
|
},
|
|
WithTotals(),
|
|
)
|
|
}
|