Co-authored-by: matst80 <mats.tornberg@gmail.com> Reviewed-on: https://git.tornberg.me/mats/go-cart-actor/pulls/6 Co-authored-by: Mats Törnberg <mats@tornberg.me> Co-committed-by: Mats Törnberg <mats@tornberg.me>
63 lines
1.7 KiB
Go
63 lines
1.7 KiB
Go
package cart
|
|
|
|
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 SetPickupPoint(g *CartGrain, m *messages.SetPickupPoint) error {
|
|
if m == nil {
|
|
return fmt.Errorf("SetPickupPoint: nil payload")
|
|
}
|
|
|
|
for _, d := range g.Deliveries {
|
|
if d.Id == uint32(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)
|
|
}
|
|
|
|
func ClearCart(g *CartGrain, m *messages.ClearCartRequest) error {
|
|
if m == nil {
|
|
return fmt.Errorf("ClearCart: nil payload")
|
|
}
|
|
// maybe check if payment is done?
|
|
g.Deliveries = g.Deliveries[:0]
|
|
g.Items = g.Items[:0]
|
|
g.UpdateTotals()
|
|
return nil
|
|
}
|