From ee292b30cb37506d1ab34e3409547ae928abb6df Mon Sep 17 00:00:00 2001 From: matst80 Date: Fri, 18 Apr 2025 17:36:09 +0200 Subject: [PATCH] better handling of payment in progress --- cart-grain.go | 228 +++++++++++++++++++++++++++----------------------- main.go | 2 +- 2 files changed, 126 insertions(+), 104 deletions(-) diff --git a/cart-grain.go b/cart-grain.go index 0062c4b..3c11cfd 100644 --- a/cart-grain.go +++ b/cart-grain.go @@ -243,25 +243,28 @@ func (c *CartGrain) HandleMessage(message *Message, isReplay bool) (*FrameWithPa if !ok { err = fmt.Errorf("expected SetCartItems") } else { - c.mu.Lock() - c.Items = make([]*CartItem, 0, len(msg.Items)) - c.mu.Unlock() - for _, item := range msg.Items { - c.AddItem(item.Sku, int(item.Quantity)) + if !c.PaymentInProgress { + c.mu.Lock() + c.Items = make([]*CartItem, 0, len(msg.Items)) + c.mu.Unlock() + for _, item := range msg.Items { + c.AddItem(item.Sku, int(item.Quantity)) + } } - } case AddRequestType: msg, ok := message.Content.(*messages.AddRequest) if !ok { err = fmt.Errorf("expected AddRequest") } else { - existingItem, found := c.FindItemWithSku(msg.Sku) - if found { - existingItem.Quantity += int(msg.Quantity) - c.TotalPrice += existingItem.Price * int64(msg.Quantity) - } else { - return c.AddItem(msg.Sku, int(msg.Quantity)) // extent AddRequest to include quantity + if !c.PaymentInProgress { + existingItem, found := c.FindItemWithSku(msg.Sku) + if found { + existingItem.Quantity += int(msg.Quantity) + c.TotalPrice += existingItem.Price * int64(msg.Quantity) + } else { + return c.AddItem(msg.Sku, int(msg.Quantity)) // extent AddRequest to include quantity + } } } case AddItemType: @@ -269,37 +272,38 @@ func (c *CartGrain) HandleMessage(message *Message, isReplay bool) (*FrameWithPa if !ok { err = fmt.Errorf("expected AddItem") } else { - - if msg.Quantity < 1 { - return nil, fmt.Errorf("invalid quantity") - } - existingItem, found := c.FindItemWithSku(msg.Sku) - if found { - existingItem.Quantity += int(msg.Quantity) - c.TotalPrice += existingItem.Price * int64(msg.Quantity) - } else { - c.mu.Lock() - c.lastItemId++ - tax := 2500 - if msg.Tax > 0 { - tax = int(msg.Tax) + if !c.PaymentInProgress { + if msg.Quantity < 1 { + return nil, fmt.Errorf("invalid quantity") + } + existingItem, found := c.FindItemWithSku(msg.Sku) + if found { + existingItem.Quantity += int(msg.Quantity) + c.TotalPrice += existingItem.Price * int64(msg.Quantity) + } else { + c.mu.Lock() + c.lastItemId++ + tax := 2500 + if msg.Tax > 0 { + tax = int(msg.Tax) + } + c.Items = append(c.Items, &CartItem{ + Id: c.lastItemId, + Quantity: int(msg.Quantity), + Sku: msg.Sku, + Name: msg.Name, + Price: msg.Price, + Image: msg.Image, + Stock: StockStatus(msg.Stock), + Disclaimer: msg.Disclaimer, + OrgPrice: msg.OrgPrice, + ArticleType: msg.ArticleType, + Outlet: msg.Outlet, + Tax: tax, + }) + c.TotalPrice += msg.Price * int64(msg.Quantity) + c.mu.Unlock() } - c.Items = append(c.Items, &CartItem{ - Id: c.lastItemId, - Quantity: int(msg.Quantity), - Sku: msg.Sku, - Name: msg.Name, - Price: msg.Price, - Image: msg.Image, - Stock: StockStatus(msg.Stock), - Disclaimer: msg.Disclaimer, - OrgPrice: msg.OrgPrice, - ArticleType: msg.ArticleType, - Outlet: msg.Outlet, - Tax: tax, - }) - c.TotalPrice += msg.Price * int64(msg.Quantity) - c.mu.Unlock() } } case ChangeQuantityType: @@ -307,18 +311,20 @@ func (c *CartGrain) HandleMessage(message *Message, isReplay bool) (*FrameWithPa if !ok { err = fmt.Errorf("expected ChangeQuantity") } else { - for i, item := range c.Items { - if item.Id == int(msg.Id) { - if msg.Quantity <= 0 { - c.TotalPrice -= item.Price * int64(item.Quantity) - c.Items = append(c.Items[:i], c.Items[i+1:]...) - } else { - diff := int(msg.Quantity) - item.Quantity - item.Quantity = int(msg.Quantity) - c.TotalPrice += item.Price * int64(diff) - } + if !c.PaymentInProgress { + for i, item := range c.Items { + if item.Id == int(msg.Id) { + if msg.Quantity <= 0 { + c.TotalPrice -= item.Price * int64(item.Quantity) + c.Items = append(c.Items[:i], c.Items[i+1:]...) + } else { + diff := int(msg.Quantity) - item.Quantity + item.Quantity = int(msg.Quantity) + c.TotalPrice += item.Price * int64(diff) + } - break + break + } } } } @@ -327,52 +333,56 @@ func (c *CartGrain) HandleMessage(message *Message, isReplay bool) (*FrameWithPa if !ok { err = fmt.Errorf("expected RemoveItem") } else { - items := make([]*CartItem, 0, len(c.Items)) - for _, item := range c.Items { - if item.Id == int(msg.Id) { - c.TotalPrice -= item.Price * int64(item.Quantity) - } else { - items = append(items, item) + if !c.PaymentInProgress { + items := make([]*CartItem, 0, len(c.Items)) + for _, item := range c.Items { + if item.Id == int(msg.Id) { + c.TotalPrice -= item.Price * int64(item.Quantity) + } else { + items = append(items, item) + } } + c.Items = items } - c.Items = items } case SetDeliveryType: msg, ok := message.Content.(*messages.SetDelivery) if !ok { err = fmt.Errorf("expected SetDelivery") } else { - c.lastDeliveryId++ - items := make([]int, 0) - withDelivery := c.ItemsWithDelivery() - if len(msg.Items) == 0 { - items = append(items, c.ItemsWithoutDelivery()...) - } else { - for _, id := range msg.Items { - for _, item := range c.Items { - if item.Id == int(id) { - if slices.Contains(withDelivery, item.Id) { - return nil, fmt.Errorf("item already has delivery") + if !c.PaymentInProgress { + c.lastDeliveryId++ + items := make([]int, 0) + withDelivery := c.ItemsWithDelivery() + if len(msg.Items) == 0 { + items = append(items, c.ItemsWithoutDelivery()...) + } else { + for _, id := range msg.Items { + for _, item := range c.Items { + if item.Id == int(id) { + if slices.Contains(withDelivery, item.Id) { + return nil, fmt.Errorf("item already has delivery") + } + items = append(items, int(item.Id)) + break } - items = append(items, int(item.Id)) - break } } } - } - if len(items) > 0 { + if len(items) > 0 { - c.Deliveries = append(c.Deliveries, &CartDelivery{ - Id: c.lastDeliveryId, - Provider: msg.Provider, - Price: 49, - Items: items, - }) - c.Processing = true - go func() { - time.Sleep(5 * time.Second) - c.Processing = false - }() + c.Deliveries = append(c.Deliveries, &CartDelivery{ + Id: c.lastDeliveryId, + Provider: msg.Provider, + Price: 49, + Items: items, + }) + c.Processing = true + go func() { + time.Sleep(5 * time.Second) + c.Processing = false + }() + } } } case RemoveDeliveryType: @@ -380,32 +390,36 @@ func (c *CartGrain) HandleMessage(message *Message, isReplay bool) (*FrameWithPa if !ok { err = fmt.Errorf("expected RemoveDelivery") } else { - deliveries := make([]*CartDelivery, 0, len(c.Deliveries)) - for _, delivery := range c.Deliveries { - if delivery.Id == int(msg.Id) { - c.TotalPrice -= delivery.Price - } else { - deliveries = append(deliveries, delivery) + if !c.PaymentInProgress { + deliveries := make([]*CartDelivery, 0, len(c.Deliveries)) + for _, delivery := range c.Deliveries { + if delivery.Id == int(msg.Id) { + c.TotalPrice -= delivery.Price + } else { + deliveries = append(deliveries, delivery) + } } + c.Deliveries = deliveries } - c.Deliveries = deliveries } case SetPickupPointType: msg, ok := message.Content.(*messages.SetPickupPoint) if !ok { err = fmt.Errorf("expected SetPickupPoint") } else { - for _, delivery := range c.Deliveries { - if delivery.Id == int(msg.DeliveryId) { - delivery.PickupPoint = &messages.PickupPoint{ - Id: msg.Id, - Address: msg.Address, - City: msg.City, - Zip: msg.Zip, - Country: msg.Country, - Name: msg.Name, + if !c.PaymentInProgress { + for _, delivery := range c.Deliveries { + if delivery.Id == int(msg.DeliveryId) { + delivery.PickupPoint = &messages.PickupPoint{ + Id: msg.Id, + Address: msg.Address, + City: msg.City, + Zip: msg.Zip, + Country: msg.Country, + Name: msg.Name, + } + break } - break } } } @@ -457,6 +471,14 @@ func (c *CartGrain) HandleMessage(message *Message, isReplay bool) (*FrameWithPa result := MakeFrameWithPayload(RemoteCreateOrderReply, 200, orderPayload) return &result, nil } + case OrderCompletedType: + msg, ok := message.Content.(*messages.OrderCreated) + if !ok { + err = fmt.Errorf("expected OrderCompleted") + } else { + c.OrderReference = msg.OrderId + c.PaymentReference = msg.Status + } default: err = fmt.Errorf("unknown message type %d", message.Type) } diff --git a/main.go b/main.go index f8b69ff..5e81e5d 100644 --- a/main.go +++ b/main.go @@ -224,7 +224,7 @@ func main() { Status: klarnaOrderResponse.Status}, }) if err != nil { - log.Printf("Error processing message: %v\n", err) + log.Printf("Error processing cart message: %v\n", err) w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(err.Error())) return