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(), ) }