diff --git a/cart-grain.go b/cart-grain.go index 7d7f675..75a4a52 100644 --- a/cart-grain.go +++ b/cart-grain.go @@ -67,6 +67,7 @@ type CartGrain struct { Items []*CartItem `json:"items"` TotalPrice int64 `json:"totalPrice"` Deliveries []*CartDelivery `json:"deliveries,omitempty"` + Processing bool `json:"processing"` } type Grain interface { @@ -339,6 +340,13 @@ func (c *CartGrain) HandleMessage(message *Message, isReplay bool) (*FrameWithPa Price: 49, Items: items, }) + c.Processing = true + go func() { + time.Sleep(5 * time.Second) + c.mu.Lock() + c.Processing = false + c.mu.Unlock() + }() } case RemoveDeliveryType: msg, ok := message.Content.(*messages.RemoveDelivery) diff --git a/pool-server.go b/pool-server.go index e7f5db9..948ac75 100644 --- a/pool-server.go +++ b/pool-server.go @@ -115,11 +115,78 @@ func (s *PoolServer) HandleSetDelivery(w http.ResponseWriter, r *http.Request) e return s.WriteResult(w, data) } +func (s *PoolServer) HandleSetPickupPoint(w http.ResponseWriter, r *http.Request) error { + id := r.PathValue("id") + deliveryIdString := r.PathValue("deliveryId") + deliveryId, err := strconv.Atoi(deliveryIdString) + if err != nil { + return err + } + pickupPoint := messages.PickupPoint{} + err = json.NewDecoder(r.Body).Decode(&pickupPoint) + if err != nil { + return err + } + reply, err := s.pool.Process(ToCartId(id), Message{ + Type: SetPickupPointType, + Content: &messages.SetPickupPoint{ + DeliveryId: int64(deliveryId), + Id: pickupPoint.Id, + Name: pickupPoint.Name, + Address: pickupPoint.Address, + City: pickupPoint.City, + Zip: pickupPoint.Zip, + Country: pickupPoint.Country, + }, + }) + if err != nil { + return err + } + return s.WriteResult(w, reply) +} + +func (s *PoolServer) HandleRemoveDelivery(w http.ResponseWriter, r *http.Request) error { + id := r.PathValue("id") + deliveryIdString := r.PathValue("deliveryId") + deliveryId, err := strconv.Atoi(deliveryIdString) + if err != nil { + return err + } + reply, err := s.pool.Process(ToCartId(id), Message{ + Type: RemoveDeliveryType, + Content: &messages.RemoveDelivery{Id: int64(deliveryId)}, + }) + if err != nil { + return err + } + return s.WriteResult(w, reply) +} + +func (s *PoolServer) HandleQuantityChange(w http.ResponseWriter, r *http.Request) error { + id := r.PathValue("id") + itemIdString := r.PathValue("itemId") + itemId, err := strconv.Atoi(itemIdString) + if err != nil { + return err + } + reply, err := s.pool.Process(ToCartId(id), Message{ + Type: ChangeQuantityType, + Content: &messages.ChangeQuantity{Id: int64(itemId)}, + }) + if err != nil { + return err + } + return s.WriteResult(w, reply) +} + func (s *PoolServer) Serve() *http.ServeMux { mux := http.NewServeMux() mux.HandleFunc("GET /{id}", ErrorHandler(s.HandleGet)) mux.HandleFunc("GET /{id}/add/{sku}", ErrorHandler(s.HandleAddSku)) mux.HandleFunc("DELETE /{id}/{itemId}", ErrorHandler(s.HandleDeleteItem)) + mux.HandleFunc("PUT /{id}/{itemId}", ErrorHandler(s.HandleQuantityChange)) mux.HandleFunc("POST /{id}/delivery", ErrorHandler(s.HandleSetDelivery)) + mux.HandleFunc("DELETE /{id}/delivery/{deliveryId}", ErrorHandler(s.HandleRemoveDelivery)) + mux.HandleFunc("PUT /{id}/delivery/{deliveryId}/pickupPoint", ErrorHandler(s.HandleSetPickupPoint)) return mux }