refactor handler

This commit is contained in:
mzfarshad 2026-05-04 22:40:09 +03:30
parent f5a2a31dd0
commit 7df63bd36f
4 changed files with 72 additions and 34 deletions

View File

@ -34,3 +34,8 @@ type UpdateQuantityRequest struct {
ItemID types.ID `json:"item_id"` ItemID types.ID `json:"item_id"`
Quantity int `json:"quantity"` Quantity int `json:"quantity"`
} }
type UpdateCartStatusRequest struct {
CartID types.ID `json:"cart_id"`
Status entity.CartStatus `json:"status"`
}

View File

@ -106,11 +106,11 @@ func (s Service) ClearCart(ctx context.Context, cartID, userID types.ID) error {
return s.repo.DeleteCart(ctx, cartID, userID) 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" const op = "shoppingbaskerapp.service.ClearCart"
if !status.IsValid() { if !req.Status.IsValid() {
return richerror.New(op).WithKind(richerror.KindInvalid).WithMessage("invalid status") 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)
} }

View File

@ -52,7 +52,21 @@ func (h Handler) GetCart(c echo.Context) error {
func (h Handler) RemoveCart(c echo.Context) error { func (h Handler) RemoveCart(c echo.Context) error {
claims := claim.GetClaimsFromEchoContext(c) 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) msg, code := httpmsg.Error(err)
return c.JSON(code, msg) 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 { func (h Handler) RemoveItem(c echo.Context) error {
claims := claim.GetClaimsFromEchoContext(c) cartIDStr := c.Param("cart_id")
p := c.Param("productID") 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 { if err != nil {
return c.JSON(http.StatusBadRequest, map[string]string{ return c.JSON(http.StatusBadRequest, map[string]string{
"error": "invalid product id", "error": "invalid product id",
@ -73,8 +105,8 @@ func (h Handler) RemoveItem(c echo.Context) error {
var req service.RemoveFromCartRequest var req service.RemoveFromCartRequest
req.UserID = types.ID(claims.UserID) req.CartID = types.ID(cID)
req.ProductID = types.ID(pID) req.ItemID = types.ID(iID)
if err := h.svc.RemoveFromCart(c.Request().Context(), req); err != nil { if err := h.svc.RemoveFromCart(c.Request().Context(), req); err != nil {
msg, code := httpmsg.Error(err) 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 { 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 var req service.UpdateQuantityRequest
req.UserID = types.ID(claims.UserID) if err := c.Bind(&req); err != nil {
req.ProductID = types.ID(pID) return c.JSON(http.StatusBadRequest, map[string]string{
req.Quantity = q "error": "invalid request body",
})
}
if err := h.svc.UpdateQuantity(c.Request().Context(), req); err != nil { if err := h.svc.UpdateQuantity(c.Request().Context(), req); err != nil {
msg, code := httpmsg.Error(err) msg, code := httpmsg.Error(err)
@ -115,3 +131,19 @@ func (h Handler) UpdateQuantity(c echo.Context) error {
return c.NoContent(http.StatusNoContent) 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)
}

View File

@ -33,12 +33,13 @@ func (s Server) registerRoutes() {
router.GET("shoppingbasket/health-check", s.healthCheck) 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.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.POST("/items", s.handler.AddToBasket)
r.DELETE("/items/:productID", s.handler.RemoveItem) r.DELETE("/items/:cart_id/:item_id", s.handler.RemoveItem)
r.PUT("/items/:productID/:quantity", s.handler.UpdateQuantity) r.PUT("/items/item-quantity", s.handler.UpdateQuantity)
} }