clear cart cookies
This commit is contained in:
237
cart-grain.go
237
cart-grain.go
@@ -243,191 +243,192 @@ func (c *CartGrain) HandleMessage(message *Message, isReplay bool) (*FrameWithPa
|
|||||||
if !ok {
|
if !ok {
|
||||||
err = fmt.Errorf("expected SetCartItems")
|
err = fmt.Errorf("expected SetCartItems")
|
||||||
} else {
|
} else {
|
||||||
if !c.PaymentInProgress {
|
|
||||||
c.mu.Lock()
|
c.mu.Lock()
|
||||||
c.Items = make([]*CartItem, 0, len(msg.Items))
|
c.Items = make([]*CartItem, 0, len(msg.Items))
|
||||||
c.mu.Unlock()
|
c.mu.Unlock()
|
||||||
for _, item := range msg.Items {
|
for _, item := range msg.Items {
|
||||||
c.AddItem(item.Sku, int(item.Quantity))
|
c.AddItem(item.Sku, int(item.Quantity))
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
case AddRequestType:
|
case AddRequestType:
|
||||||
msg, ok := message.Content.(*messages.AddRequest)
|
msg, ok := message.Content.(*messages.AddRequest)
|
||||||
if !ok {
|
if !ok {
|
||||||
err = fmt.Errorf("expected AddRequest")
|
err = fmt.Errorf("expected AddRequest")
|
||||||
} else {
|
} else {
|
||||||
if !c.PaymentInProgress {
|
|
||||||
existingItem, found := c.FindItemWithSku(msg.Sku)
|
existingItem, found := c.FindItemWithSku(msg.Sku)
|
||||||
if found {
|
if found {
|
||||||
existingItem.Quantity += int(msg.Quantity)
|
existingItem.Quantity += int(msg.Quantity)
|
||||||
c.TotalPrice += existingItem.Price * int64(msg.Quantity)
|
c.TotalPrice += existingItem.Price * int64(msg.Quantity)
|
||||||
} else {
|
} else {
|
||||||
return c.AddItem(msg.Sku, int(msg.Quantity)) // extent AddRequest to include quantity
|
return c.AddItem(msg.Sku, int(msg.Quantity)) // extent AddRequest to include quantity
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
case AddItemType:
|
case AddItemType:
|
||||||
msg, ok := message.Content.(*messages.AddItem)
|
msg, ok := message.Content.(*messages.AddItem)
|
||||||
if !ok {
|
if !ok {
|
||||||
err = fmt.Errorf("expected AddItem")
|
err = fmt.Errorf("expected AddItem")
|
||||||
} else {
|
} else {
|
||||||
if !c.PaymentInProgress {
|
|
||||||
if msg.Quantity < 1 {
|
if msg.Quantity < 1 {
|
||||||
return nil, fmt.Errorf("invalid quantity")
|
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()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
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:
|
case ChangeQuantityType:
|
||||||
msg, ok := message.Content.(*messages.ChangeQuantity)
|
msg, ok := message.Content.(*messages.ChangeQuantity)
|
||||||
if !ok {
|
if !ok {
|
||||||
err = fmt.Errorf("expected ChangeQuantity")
|
err = fmt.Errorf("expected ChangeQuantity")
|
||||||
} else {
|
} 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:
|
case RemoveItemType:
|
||||||
msg, ok := message.Content.(*messages.RemoveItem)
|
msg, ok := message.Content.(*messages.RemoveItem)
|
||||||
if !ok {
|
if !ok {
|
||||||
err = fmt.Errorf("expected RemoveItem")
|
err = fmt.Errorf("expected RemoveItem")
|
||||||
} else {
|
} else {
|
||||||
if !c.PaymentInProgress {
|
|
||||||
items := make([]*CartItem, 0, len(c.Items))
|
items := make([]*CartItem, 0, len(c.Items))
|
||||||
for _, item := range c.Items {
|
for _, item := range c.Items {
|
||||||
if item.Id == int(msg.Id) {
|
if item.Id == int(msg.Id) {
|
||||||
c.TotalPrice -= item.Price * int64(item.Quantity)
|
c.TotalPrice -= item.Price * int64(item.Quantity)
|
||||||
} else {
|
} else {
|
||||||
items = append(items, item)
|
items = append(items, item)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
c.Items = items
|
|
||||||
}
|
}
|
||||||
|
c.Items = items
|
||||||
|
|
||||||
}
|
}
|
||||||
case SetDeliveryType:
|
case SetDeliveryType:
|
||||||
msg, ok := message.Content.(*messages.SetDelivery)
|
msg, ok := message.Content.(*messages.SetDelivery)
|
||||||
if !ok {
|
if !ok {
|
||||||
err = fmt.Errorf("expected SetDelivery")
|
err = fmt.Errorf("expected SetDelivery")
|
||||||
} else {
|
} else {
|
||||||
if !c.PaymentInProgress {
|
|
||||||
c.lastDeliveryId++
|
c.lastDeliveryId++
|
||||||
items := make([]int, 0)
|
items := make([]int, 0)
|
||||||
withDelivery := c.ItemsWithDelivery()
|
withDelivery := c.ItemsWithDelivery()
|
||||||
if len(msg.Items) == 0 {
|
if len(msg.Items) == 0 {
|
||||||
items = append(items, c.ItemsWithoutDelivery()...)
|
items = append(items, c.ItemsWithoutDelivery()...)
|
||||||
} else {
|
} else {
|
||||||
for _, id := range msg.Items {
|
for _, id := range msg.Items {
|
||||||
for _, item := range c.Items {
|
for _, item := range c.Items {
|
||||||
if item.Id == int(id) {
|
if item.Id == int(id) {
|
||||||
if slices.Contains(withDelivery, item.Id) {
|
if slices.Contains(withDelivery, item.Id) {
|
||||||
return nil, fmt.Errorf("item already has delivery")
|
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 {
|
|
||||||
|
|
||||||
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:
|
case RemoveDeliveryType:
|
||||||
msg, ok := message.Content.(*messages.RemoveDelivery)
|
msg, ok := message.Content.(*messages.RemoveDelivery)
|
||||||
if !ok {
|
if !ok {
|
||||||
err = fmt.Errorf("expected RemoveDelivery")
|
err = fmt.Errorf("expected RemoveDelivery")
|
||||||
} else {
|
} else {
|
||||||
if !c.PaymentInProgress {
|
|
||||||
deliveries := make([]*CartDelivery, 0, len(c.Deliveries))
|
deliveries := make([]*CartDelivery, 0, len(c.Deliveries))
|
||||||
for _, delivery := range c.Deliveries {
|
for _, delivery := range c.Deliveries {
|
||||||
if delivery.Id == int(msg.Id) {
|
if delivery.Id == int(msg.Id) {
|
||||||
c.TotalPrice -= delivery.Price
|
c.TotalPrice -= delivery.Price
|
||||||
} else {
|
} else {
|
||||||
deliveries = append(deliveries, delivery)
|
deliveries = append(deliveries, delivery)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
c.Deliveries = deliveries
|
|
||||||
}
|
}
|
||||||
|
c.Deliveries = deliveries
|
||||||
|
|
||||||
}
|
}
|
||||||
case SetPickupPointType:
|
case SetPickupPointType:
|
||||||
msg, ok := message.Content.(*messages.SetPickupPoint)
|
msg, ok := message.Content.(*messages.SetPickupPoint)
|
||||||
if !ok {
|
if !ok {
|
||||||
err = fmt.Errorf("expected SetPickupPoint")
|
err = fmt.Errorf("expected SetPickupPoint")
|
||||||
} else {
|
} else {
|
||||||
if !c.PaymentInProgress {
|
|
||||||
for _, delivery := range c.Deliveries {
|
for _, delivery := range c.Deliveries {
|
||||||
if delivery.Id == int(msg.DeliveryId) {
|
if delivery.Id == int(msg.DeliveryId) {
|
||||||
delivery.PickupPoint = &messages.PickupPoint{
|
delivery.PickupPoint = &messages.PickupPoint{
|
||||||
Id: msg.Id,
|
Id: msg.Id,
|
||||||
Address: msg.Address,
|
Address: msg.Address,
|
||||||
City: msg.City,
|
City: msg.City,
|
||||||
Zip: msg.Zip,
|
Zip: msg.Zip,
|
||||||
Country: msg.Country,
|
Country: msg.Country,
|
||||||
Name: msg.Name,
|
Name: msg.Name,
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
case CreateCheckoutOrderType:
|
case CreateCheckoutOrderType:
|
||||||
msg, ok := message.Content.(*messages.CreateCheckoutOrder)
|
msg, ok := message.Content.(*messages.CreateCheckoutOrder)
|
||||||
if !ok {
|
if !ok {
|
||||||
err = fmt.Errorf("expected CreateCheckoutOrder")
|
err = fmt.Errorf("expected CreateCheckoutOrder")
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
orderLines := make([]*klarna.Line, 0, len(c.Items))
|
orderLines := make([]*klarna.Line, 0, len(c.Items))
|
||||||
totalTax := 0
|
totalTax := 0
|
||||||
c.PaymentInProgress = true
|
c.PaymentInProgress = true
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ func (s *PoolServer) HandleGet(w http.ResponseWriter, r *http.Request, id CartId
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return s.WriteResult(w, data)
|
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 {
|
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 {
|
return func(w http.ResponseWriter, r *http.Request) error {
|
||||||
cartId := ToCartId(r.PathValue("id"))
|
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("POST /set", ErrorHandler(CookieCartIdHandler(s.HandleSetCartItems)))
|
||||||
mux.HandleFunc("DELETE /{itemId}", ErrorHandler(CookieCartIdHandler(s.HandleDeleteItem)))
|
mux.HandleFunc("DELETE /{itemId}", ErrorHandler(CookieCartIdHandler(s.HandleDeleteItem)))
|
||||||
mux.HandleFunc("PUT /", ErrorHandler(CookieCartIdHandler(s.HandleQuantityChange)))
|
mux.HandleFunc("PUT /", ErrorHandler(CookieCartIdHandler(s.HandleQuantityChange)))
|
||||||
|
mux.HandleFunc("DELETE /", ErrorHandler(CookieCartIdHandler(s.RemoveCartCookie)))
|
||||||
mux.HandleFunc("POST /delivery", ErrorHandler(CookieCartIdHandler(s.HandleSetDelivery)))
|
mux.HandleFunc("POST /delivery", ErrorHandler(CookieCartIdHandler(s.HandleSetDelivery)))
|
||||||
mux.HandleFunc("DELETE /delivery/{deliveryId}", ErrorHandler(CookieCartIdHandler(s.HandleRemoveDelivery)))
|
mux.HandleFunc("DELETE /delivery/{deliveryId}", ErrorHandler(CookieCartIdHandler(s.HandleRemoveDelivery)))
|
||||||
mux.HandleFunc("PUT /delivery/{deliveryId}/pickupPoint", ErrorHandler(CookieCartIdHandler(s.HandleSetPickupPoint)))
|
mux.HandleFunc("PUT /delivery/{deliveryId}/pickupPoint", ErrorHandler(CookieCartIdHandler(s.HandleSetPickupPoint)))
|
||||||
|
|||||||
Reference in New Issue
Block a user