From 7df63bd36f368bfe9306afe423664f5b7824f9f7 Mon Sep 17 00:00:00 2001 From: mzfarshad Date: Mon, 4 May 2026 22:40:09 +0330 Subject: [PATCH] refactor handler --- domain/shoppingbasket/service/param.go | 5 ++ domain/shoppingbasket/service/service.go | 6 +- .../delivery/http/cart/handler.go | 86 +++++++++++++------ shoppingbasketapp/delivery/http/server.go | 9 +- 4 files changed, 72 insertions(+), 34 deletions(-) diff --git a/domain/shoppingbasket/service/param.go b/domain/shoppingbasket/service/param.go index d4061f17..fb799b76 100644 --- a/domain/shoppingbasket/service/param.go +++ b/domain/shoppingbasket/service/param.go @@ -34,3 +34,8 @@ type UpdateQuantityRequest struct { ItemID types.ID `json:"item_id"` Quantity int `json:"quantity"` } + +type UpdateCartStatusRequest struct { + CartID types.ID `json:"cart_id"` + Status entity.CartStatus `json:"status"` +} diff --git a/domain/shoppingbasket/service/service.go b/domain/shoppingbasket/service/service.go index 5a2ea74d..89c82714 100644 --- a/domain/shoppingbasket/service/service.go +++ b/domain/shoppingbasket/service/service.go @@ -106,11 +106,11 @@ func (s Service) ClearCart(ctx context.Context, cartID, userID types.ID) error { return s.repo.DeleteCart(ctx, cartID, userID) } -func (s Service) UpdateCartStatus(ctx context.Context, cartID types.ID, status entity.CartStatus) error { +func (s Service) UpdateCartStatus(ctx context.Context, req UpdateCartStatusRequest) error { const op = "shoppingbaskerapp.service.ClearCart" - if !status.IsValid() { + if !req.Status.IsValid() { return richerror.New(op).WithKind(richerror.KindInvalid).WithMessage("invalid status") } - return s.repo.UpdateStatus(ctx, cartID, status) + return s.repo.UpdateStatus(ctx, req.CartID, req.Status) } diff --git a/shoppingbasketapp/delivery/http/cart/handler.go b/shoppingbasketapp/delivery/http/cart/handler.go index 49fcc236..8ea8878c 100644 --- a/shoppingbasketapp/delivery/http/cart/handler.go +++ b/shoppingbasketapp/delivery/http/cart/handler.go @@ -52,7 +52,21 @@ func (h Handler) GetCart(c echo.Context) error { func (h Handler) RemoveCart(c echo.Context) error { claims := claim.GetClaimsFromEchoContext(c) - if err := h.svc.ClearCart(c.Request().Context(), types.ID(claims.UserID)); err != nil { + cartIDStr := c.Param("cart_id") + if cartIDStr == "" { + return c.JSON(http.StatusBadRequest, map[string]string{ + "error": "cart id required", + }) + } + + cartID, err := strconv.Atoi(cartIDStr) + if err != nil || cartID < 1 { + return c.JSON(http.StatusBadRequest, map[string]string{ + "error": "invalid cart id", + }) + } + + if err := h.svc.ClearCart(c.Request().Context(), types.ID(cartID), types.ID(claims.UserID)); err != nil { msg, code := httpmsg.Error(err) return c.JSON(code, msg) } @@ -61,10 +75,28 @@ func (h Handler) RemoveCart(c echo.Context) error { } func (h Handler) RemoveItem(c echo.Context) error { - claims := claim.GetClaimsFromEchoContext(c) - p := c.Param("productID") + cartIDStr := c.Param("cart_id") + itemIDStr := c.Param("item_id") - pID, err := strconv.Atoi(p) + if cartIDStr == "" { + return c.JSON(http.StatusBadRequest, echo.Map{ + "error": "cart id required", + }) + } + + cID, err := strconv.Atoi(cartIDStr) + if err != nil { + return c.JSON(http.StatusBadRequest, map[string]string{ + "error": "invalid product id", + }) + } + + if itemIDStr == "" { + return c.JSON(http.StatusBadRequest, echo.Map{ + "error": "item id required", + }) + } + iID, err := strconv.Atoi(itemIDStr) if err != nil { return c.JSON(http.StatusBadRequest, map[string]string{ "error": "invalid product id", @@ -73,8 +105,8 @@ func (h Handler) RemoveItem(c echo.Context) error { var req service.RemoveFromCartRequest - req.UserID = types.ID(claims.UserID) - req.ProductID = types.ID(pID) + req.CartID = types.ID(cID) + req.ItemID = types.ID(iID) if err := h.svc.RemoveFromCart(c.Request().Context(), req); err != nil { msg, code := httpmsg.Error(err) @@ -85,28 +117,12 @@ func (h Handler) RemoveItem(c echo.Context) error { } func (h Handler) UpdateQuantity(c echo.Context) error { - claims := claim.GetClaimsFromEchoContext(c) - p := c.Param("productID") - - pID, err := strconv.Atoi(p) - if err != nil { - return c.JSON(http.StatusBadRequest, map[string]string{ - "error": "invalid product id", - }) - } - - qStr := c.Param("quantity") - q, err := strconv.Atoi(qStr) - if err != nil { - return c.JSON(http.StatusBadRequest, map[string]string{ - "error": "invalid quantity", - }) - } - var req service.UpdateQuantityRequest - req.UserID = types.ID(claims.UserID) - req.ProductID = types.ID(pID) - req.Quantity = q + if err := c.Bind(&req); err != nil { + return c.JSON(http.StatusBadRequest, map[string]string{ + "error": "invalid request body", + }) + } if err := h.svc.UpdateQuantity(c.Request().Context(), req); err != nil { msg, code := httpmsg.Error(err) @@ -115,3 +131,19 @@ func (h Handler) UpdateQuantity(c echo.Context) error { return c.NoContent(http.StatusNoContent) } + +func (h Handler) UpdateCartStatus(c echo.Context) error { + var req service.UpdateCartStatusRequest + if err := c.Bind(&req); err != nil { + return c.JSON(http.StatusBadRequest, map[string]string{ + "error": "invalid request body", + }) + } + + if err := h.svc.UpdateCartStatus(c.Request().Context(), req); err != nil { + msg, code := httpmsg.Error(err) + return c.JSON(code, msg) + } + + return c.NoContent(http.StatusNoContent) +} diff --git a/shoppingbasketapp/delivery/http/server.go b/shoppingbasketapp/delivery/http/server.go index 029d3789..29f730a9 100644 --- a/shoppingbasketapp/delivery/http/server.go +++ b/shoppingbasketapp/delivery/http/server.go @@ -33,12 +33,13 @@ func (s Server) registerRoutes() { router.GET("shoppingbasket/health-check", s.healthCheck) - r := router.Group("shoppingbasket/cart") // Authentication is required + r := router.Group("shoppingbasket/carts") // Authentication is required r.GET("/", s.handler.GetCart) - r.DELETE("/", s.handler.RemoveCart) + r.DELETE("/:cart_id", s.handler.RemoveCart) + r.PUT("/status", s.handler.UpdateCartStatus) r.POST("/items", s.handler.AddToBasket) - r.DELETE("/items/:productID", s.handler.RemoveItem) - r.PUT("/items/:productID/:quantity", s.handler.UpdateQuantity) + r.DELETE("/items/:cart_id/:item_id", s.handler.RemoveItem) + r.PUT("/items/item-quantity", s.handler.UpdateQuantity) }