try to reserve when entering checkout
Some checks failed
Build and Publish / BuildAndDeployAmd64 (push) Failing after 23s
Build and Publish / BuildAndDeployArm64 (push) Failing after 2m54s

This commit is contained in:
matst80
2025-11-27 13:47:48 +01:00
parent aea168160e
commit fd29300314
4 changed files with 249 additions and 210 deletions

View File

@@ -4,8 +4,10 @@ import (
"context"
"fmt"
"log"
"time"
messages "git.k6n.net/go-cart-actor/pkg/messages"
"google.golang.org/protobuf/types/known/timestamppb"
)
// mutation_add_item.go
@@ -69,9 +71,20 @@ func (c *CartMutationContext) AddItem(g *CartGrain, m *messages.AddItem) error {
}
pricePerItem := NewPriceFromIncVat(m.Price, taxRate)
endTime, err := c.ReserveItem(ctx, g.Id, m.Sku, m.StoreId, uint16(m.Quantity))
if err != nil {
return err
needsReservation := true
if m.ReservationEndTime != nil {
needsReservation = m.ReservationEndTime.AsTime().Before(time.Now())
}
if needsReservation {
endTime, err := c.ReserveItem(ctx, g.Id, m.Sku, m.StoreId, uint16(m.Quantity))
if err != nil {
return err
}
if endTime != nil {
m.ReservationEndTime = timestamppb.New(*endTime)
}
}
cartItem := &CartItem{
@@ -106,10 +119,12 @@ func (c *CartMutationContext) AddItem(g *CartGrain, m *messages.AddItem) error {
OrgPrice: getOrgPrice(m.OrgPrice, taxRate),
ArticleType: m.ArticleType,
StoreId: m.StoreId,
ReservationEndTime: endTime,
StoreId: m.StoreId,
}
if m.ReservationEndTime != nil {
t := m.ReservationEndTime.AsTime()
cartItem.ReservationEndTime = &t
}
g.Items = append(g.Items, cartItem)
g.UpdateTotals()
return nil

View File

@@ -1,6 +1,7 @@
package cart
import (
"context"
"fmt"
"time"
@@ -30,18 +31,23 @@ import (
// (e.g. reject if PaymentInProgress already true unless reusing
// the same OrderReference).
func InitializeCheckout(g *CartGrain, m *messages.InitializeCheckout) error {
func (c *CartMutationContext) InitializeCheckout(g *CartGrain, m *messages.InitializeCheckout) error {
if m == nil {
return fmt.Errorf("InitializeCheckout: nil payload")
}
if m.OrderId == "" {
return fmt.Errorf("InitializeCheckout: missing orderId")
}
ctx := context.Background()
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)
endTime, err := c.ReserveItem(ctx, g.Id, item.Sku, item.StoreId, item.Quantity)
if err != nil {
return err
}
item.ReservationEndTime = endTime
}
}
}