From 03123bac896a4ea2511e8001d8e7113714f07808 Mon Sep 17 00:00:00 2001 From: matst80 Date: Thu, 27 Feb 2025 20:20:21 +0100 Subject: [PATCH] update stuff --- cart-grain.go | 13 +++++++++++++ message-handler.go | 32 ++++++++++++++++++++++++++++++++ message-types.go | 1 + pool-server.go | 17 +++++++++++++++++ proto/messages.proto | 4 ++++ 5 files changed, 67 insertions(+) diff --git a/cart-grain.go b/cart-grain.go index b6c512c..fd09c16 100644 --- a/cart-grain.go +++ b/cart-grain.go @@ -235,6 +235,19 @@ func (c *CartGrain) HandleMessage(message *Message, isReplay bool) (*FrameWithPa grainMutations.Inc() var err error switch message.Type { + case SetCartItemsType: + msg, ok := message.Content.(*messages.SetCartItems) + 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)) + } + + } case AddRequestType: msg, ok := message.Content.(*messages.AddRequest) if !ok { diff --git a/message-handler.go b/message-handler.go index 41acbf6..7489479 100644 --- a/message-handler.go +++ b/message-handler.go @@ -16,6 +16,7 @@ var Handlers = map[uint16]MessageHandler{ RemoveItemType: &RemoveItemHandler{}, RemoveDeliveryType: &RemoveDeliveryHandler{}, CreateCheckoutOrderType: &CheckoutHandler{}, + SetCartItemsType: &SetCartItemsHandler{}, } func GetMessageHandler(t uint16) (MessageHandler, error) { @@ -35,6 +36,37 @@ type TypedMessageHandler struct { Type uint16 } +type SetCartItemsHandler struct { + TypedMessageHandler +} + +func (h *SetCartItemsHandler) Write(m *Message, w io.Writer) error { + messageBytes, err := proto.Marshal(m.Content.(*messages.SetCartRequest)) + if err != nil { + return err + } + w.Write(messageBytes) + return nil +} + +func (h *SetCartItemsHandler) Read(data []byte) (interface{}, error) { + msg := &messages.SetCartRequest{} + + err := proto.Unmarshal(data, msg) + if err != nil { + return nil, err + } + return msg, nil +} + +func (h *SetCartItemsHandler) Is(m *Message) bool { + if m.Type != AddRequestType { + return false + } + _, ok := m.Content.(*messages.SetCartRequest) + return ok +} + type AddRequestHandler struct { TypedMessageHandler } diff --git a/message-types.go b/message-types.go index 84a9406..b47b8eb 100644 --- a/message-types.go +++ b/message-types.go @@ -10,4 +10,5 @@ const ( SetDeliveryType = 7 SetPickupPointType = 8 CreateCheckoutOrderType = 9 + SetCartItemsType = 10 ) diff --git a/pool-server.go b/pool-server.go index 7d7761e..76b08a4 100644 --- a/pool-server.go +++ b/pool-server.go @@ -182,6 +182,22 @@ func (s *PoolServer) HandleQuantityChange(w http.ResponseWriter, r *http.Request return s.WriteResult(w, reply) } +func (s *PoolServer) HandleSetCartItems(w http.ResponseWriter, r *http.Request, id CartId) error { + setCartItems := messages.SetCartItems{} + err := json.NewDecoder(r.Body).Decode(&setCartItems) + if err != nil { + return err + } + reply, err := s.pool.Process(id, Message{ + Type: SetCartItemsType, + Content: &setCartItems, + }) + if err != nil { + return err + } + return s.WriteResult(w, reply) +} + func (s *PoolServer) HandleAddRequest(w http.ResponseWriter, r *http.Request, id CartId) error { addRequest := messages.AddRequest{} err := json.NewDecoder(r.Body).Decode(&addRequest) @@ -291,6 +307,7 @@ func (s *PoolServer) Serve() *http.ServeMux { mux.HandleFunc("GET /", ErrorHandler(CookieCartIdHandler(s.HandleGet))) mux.HandleFunc("GET /add/{sku}", ErrorHandler(CookieCartIdHandler(s.HandleAddSku))) mux.HandleFunc("POST /", ErrorHandler(CookieCartIdHandler(s.HandleAddRequest))) + 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("POST /delivery", ErrorHandler(CookieCartIdHandler(s.HandleSetDelivery))) diff --git a/proto/messages.proto b/proto/messages.proto index 6ce97e6..de5b35f 100644 --- a/proto/messages.proto +++ b/proto/messages.proto @@ -7,6 +7,10 @@ message AddRequest { string Sku = 2; } +message SetCartRequest { + repeated AddRequest Items = 1; +} + message AddItem { int32 Quantity = 2; int64 Price = 3;