diff --git a/cmd/cart/pool-server.go b/cmd/cart/pool-server.go index 047fe32..b71986f 100644 --- a/cmd/cart/pool-server.go +++ b/cmd/cart/pool-server.go @@ -164,12 +164,34 @@ func (s *PoolServer) HandleQuantityChange(w http.ResponseWriter, r *http.Request return s.WriteResult(w, reply) } +type Item struct { + Sku string `json:"sku"` + Quantity int `json:"quantity"` + StoreId *string `json:"storeId,omitempty"` +} + type SetCartItems struct { Country string `json:"country"` - Items []struct { - Sku string `json:"sku"` - Quantity int `json:"quantity"` - } `json:"items"` + Items []Item `json:"items"` +} + +func getMultipleAddMessages(items []Item, country string) []proto.Message { + wg := sync.WaitGroup{} + msgs := make([]proto.Message, 0, len(items)) + for _, itm := range items { + wg.Add(1) + go func(itm Item) { + defer wg.Done() + msg, err := GetItemAddMessage(itm.Sku, itm.Quantity, country, itm.StoreId) + if err != nil { + log.Printf("error adding item %s: %v", itm.Sku, err) + return + } + msgs = append(msgs, msg) + }(itm) + } + wg.Wait() + return msgs } func (s *PoolServer) HandleSetCartItems(w http.ResponseWriter, r *http.Request, id CartId) error { @@ -181,22 +203,7 @@ func (s *PoolServer) HandleSetCartItems(w http.ResponseWriter, r *http.Request, msgs := make([]proto.Message, 0, len(setCartItems.Items)+1) msgs = append(msgs, &messages.ClearCartRequest{}) - wg := sync.WaitGroup{} - for _, item := range setCartItems.Items { - wg.Add(1) - go func(sku string, quantity int) { - defer wg.Done() - msg, err := GetItemAddMessage(sku, quantity, setCartItems.Country, nil) - if err != nil { - log.Printf("error adding item %s: %v", sku, err) - return - } - msgs = append(msgs, msg) - - }(item.Sku, item.Quantity) - } - - wg.Wait() + msgs = append(msgs, getMultipleAddMessages(setCartItems.Items, setCartItems.Country)...) reply, err := s.ApplyLocal(id, msgs...) if err != nil { @@ -205,6 +212,20 @@ func (s *PoolServer) HandleSetCartItems(w http.ResponseWriter, r *http.Request, return s.WriteResult(w, reply) } +func (s *PoolServer) HandleAddMultiple(w http.ResponseWriter, r *http.Request, id CartId) error { + setCartItems := SetCartItems{} + err := json.NewDecoder(r.Body).Decode(&setCartItems) + if err != nil { + return err + } + + reply, err := s.ApplyLocal(id, getMultipleAddMessages(setCartItems.Items, setCartItems.Country)...) + 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) @@ -426,6 +447,7 @@ func (s *PoolServer) Serve() *http.ServeMux { mux.HandleFunc("GET /", CookieCartIdHandler(s.ProxyHandler(s.HandleGet))) mux.HandleFunc("GET /add/{sku}", CookieCartIdHandler(s.ProxyHandler(s.HandleAddSku))) + mux.HandleFunc("POST /add", CookieCartIdHandler(s.ProxyHandler(s.HandleAddMultiple))) mux.HandleFunc("POST /", CookieCartIdHandler(s.ProxyHandler(s.HandleAddRequest))) mux.HandleFunc("POST /set", CookieCartIdHandler(s.ProxyHandler(s.HandleSetCartItems))) mux.HandleFunc("DELETE /{itemId}", CookieCartIdHandler(s.ProxyHandler(s.HandleDeleteItem)))