57 lines
1.6 KiB
Go
57 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
messages "git.tornberg.me/go-cart-actor/proto"
|
|
)
|
|
|
|
// 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.
|
|
)
|
|
}
|