From afa79e7b56cea0651559f1afd7fc6d40404f55bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mats=20T=C3=B6rnberg?= Date: Wed, 26 Nov 2025 21:35:40 +0100 Subject: [PATCH] handle limited quantity --- pkg/cart/mutation_add_item.go | 18 +++++++++++++----- pkg/cart/mutation_change_quantity.go | 13 ++++++++++--- pkg/cart/mutation_initialize_checkout.go | 9 +++++++++ 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/pkg/cart/mutation_add_item.go b/pkg/cart/mutation_add_item.go index 9b36436..0e188e3 100644 --- a/pkg/cart/mutation_add_item.go +++ b/pkg/cart/mutation_add_item.go @@ -38,16 +38,24 @@ func AddItem(g *CartGrain, m *messages.AddItem) error { if !sameStore { continue } - existing.Quantity += int(m.Quantity) + if m.ReservationEndTime != nil { + t := m.ReservationEndTime.AsTime() + if existing.ReservationEndTime == nil || existing.ReservationEndTime.Before(m.ReservationEndTime.AsTime()) { + existing.ReservationEndTime = &t + existing.Quantity = int(m.Quantity) + } else { + existing.ReservationEndTime = &t + } + + } else { + existing.Quantity += int(m.Quantity) + } existing.Stock = uint16(m.Stock) // If existing had nil store but new has one, adopt it. if existing.StoreId == nil && m.StoreId != nil { existing.StoreId = m.StoreId } - if m.ReservationEndTime != nil { - t := m.ReservationEndTime.AsTime() - existing.ReservationEndTime = &t - } + return nil } diff --git a/pkg/cart/mutation_change_quantity.go b/pkg/cart/mutation_change_quantity.go index de627ae..70e7efa 100644 --- a/pkg/cart/mutation_change_quantity.go +++ b/pkg/cart/mutation_change_quantity.go @@ -48,8 +48,15 @@ func ChangeQuantity(g *CartGrain, m *messages.ChangeQuantity) error { g.UpdateTotals() return nil } - - g.Items[foundIndex].Quantity = int(m.Quantity) - g.UpdateTotals() + item := g.Items[foundIndex] + if item == nil { + return fmt.Errorf("ChangeQuantity: item id %d not found", m.Id) + } + if item.ReservationEndTime != nil { + return fmt.Errorf("ChangeQuantity: cannot change quantity of reserved item id %d", m.Id) + } else { + item.Quantity = int(m.Quantity) + g.UpdateTotals() + } return nil } diff --git a/pkg/cart/mutation_initialize_checkout.go b/pkg/cart/mutation_initialize_checkout.go index 0e3a14f..83ebff7 100644 --- a/pkg/cart/mutation_initialize_checkout.go +++ b/pkg/cart/mutation_initialize_checkout.go @@ -2,6 +2,7 @@ package cart import ( "fmt" + "time" messages "git.k6n.net/go-cart-actor/pkg/messages" ) @@ -36,6 +37,14 @@ func InitializeCheckout(g *CartGrain, m *messages.InitializeCheckout) error { if m.OrderId == "" { return fmt.Errorf("InitializeCheckout: missing orderId") } + now := time.Now() + for _, item := range g.Items { + if item.ReservationEndTime != nil { + if now.After(*item.ReservationEndTime) { + return fmt.Errorf("InitializeCheckout: item id %d reservation has expired", item.Id) + } + } + } g.OrderReference = m.OrderId g.PaymentStatus = m.Status