package main import ( "fmt" messages "git.tornberg.me/go-cart-actor/pkg/messages" ) // mutation_set_pickup_point.go // // Registers the SetPickupPoint mutation using the generic mutation registry. // // Semantics (mirrors original switch-based implementation): // - Locate the delivery with Id == payload.DeliveryId // - Set (or overwrite) its PickupPoint with the provided data // - Does NOT alter pricing or taxes (so no totals recalculation required) // // Validation / Error Handling: // - If payload is nil -> error // - If DeliveryId not found -> error // // Concurrency: // - Relies on the existing expectation that higher-level mutation routing // serializes Apply() calls per grain; if stricter guarantees are needed, // a delivery-level lock could be introduced later. // // Future Extensions: // - Validate pickup point fields (country code, zip format, etc.) // - Track history / audit of pickup point changes // - Trigger delivery price adjustments (which would then require WithTotals()). func init() { RegisterMutation[messages.SetPickupPoint]( "SetPickupPoint", func(g *CartGrain, m *messages.SetPickupPoint) error { if m == nil { return fmt.Errorf("SetPickupPoint: nil payload") } for _, d := range g.Deliveries { if d.Id == int(m.DeliveryId) { d.PickupPoint = &messages.PickupPoint{ Id: m.Id, Name: m.Name, Address: m.Address, City: m.City, Zip: m.Zip, Country: m.Country, } return nil } } return fmt.Errorf("SetPickupPoint: delivery id %d not found", m.DeliveryId) }, // No WithTotals(): pickup point does not change pricing / tax. ) }