From 8f10b58d94f3c3d807554c714936eb8910e58ade Mon Sep 17 00:00:00 2001 From: matst80 Date: Fri, 18 Apr 2025 18:14:11 +0200 Subject: [PATCH] clear cart cookies --- cart-grain.go | 237 +++++++++++++++++++++++++------------------------ pool-server.go | 14 +++ 2 files changed, 133 insertions(+), 118 deletions(-) diff --git a/cart-grain.go b/cart-grain.go index 3c11cfd..0432b07 100644 --- a/cart-grain.go +++ b/cart-grain.go @@ -243,191 +243,192 @@ func (c *CartGrain) HandleMessage(message *Message, isReplay bool) (*FrameWithPa if !ok { err = fmt.Errorf("expected SetCartItems") } else { - 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)) - } + + 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 { - 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 - } + + 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: msg, ok := message.Content.(*messages.AddItem) if !ok { err = fmt.Errorf("expected AddItem") } else { - 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() - } + + 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() + } + } case ChangeQuantityType: msg, ok := message.Content.(*messages.ChangeQuantity) if !ok { err = fmt.Errorf("expected ChangeQuantity") } else { - 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 + 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 } } + } case RemoveItemType: msg, ok := message.Content.(*messages.RemoveItem) if !ok { err = fmt.Errorf("expected RemoveItem") } else { - 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) - } + + 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 { - 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 + + 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 } } } - 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 - }() - } } + 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 + }() + } + } case RemoveDeliveryType: msg, ok := message.Content.(*messages.RemoveDelivery) if !ok { err = fmt.Errorf("expected RemoveDelivery") } else { - 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) - } + + 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 { - 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 + + 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 } } + } case CreateCheckoutOrderType: msg, ok := message.Content.(*messages.CreateCheckoutOrder) if !ok { err = fmt.Errorf("expected CreateCheckoutOrder") } else { + orderLines := make([]*klarna.Line, 0, len(c.Items)) totalTax := 0 c.PaymentInProgress = true diff --git a/pool-server.go b/pool-server.go index fb92143..3253ce6 100644 --- a/pool-server.go +++ b/pool-server.go @@ -31,6 +31,7 @@ func (s *PoolServer) HandleGet(w http.ResponseWriter, r *http.Request, id CartId if err != nil { return err } + return s.WriteResult(w, data) } @@ -316,6 +317,18 @@ func CookieCartIdHandler(fn func(w http.ResponseWriter, r *http.Request, cartId } } +func (s *PoolServer) RemoveCartCookie(w http.ResponseWriter, r *http.Request, cartId CartId) error { + cartId = NewCartId() + http.SetCookie(w, &http.Cookie{ + Name: "cartid", + Value: cartId.String(), + Path: "/", + SameSite: http.SameSiteLaxMode, + }) + w.WriteHeader(http.StatusOK) + return nil +} + func CartIdHandler(fn func(w http.ResponseWriter, r *http.Request, cartId CartId) error) func(w http.ResponseWriter, r *http.Request) error { return func(w http.ResponseWriter, r *http.Request) error { cartId := ToCartId(r.PathValue("id")) @@ -339,6 +352,7 @@ func (s *PoolServer) Serve() *http.ServeMux { mux.HandleFunc("POST /set", ErrorHandler(CookieCartIdHandler(s.HandleSetCartItems))) mux.HandleFunc("DELETE /{itemId}", ErrorHandler(CookieCartIdHandler(s.HandleDeleteItem))) mux.HandleFunc("PUT /", ErrorHandler(CookieCartIdHandler(s.HandleQuantityChange))) + mux.HandleFunc("DELETE /", ErrorHandler(CookieCartIdHandler(s.RemoveCartCookie))) mux.HandleFunc("POST /delivery", ErrorHandler(CookieCartIdHandler(s.HandleSetDelivery))) mux.HandleFunc("DELETE /delivery/{deliveryId}", ErrorHandler(CookieCartIdHandler(s.HandleRemoveDelivery))) mux.HandleFunc("PUT /delivery/{deliveryId}/pickupPoint", ErrorHandler(CookieCartIdHandler(s.HandleSetPickupPoint)))