From 54b7fedcdb6342ac8e3f6efe3d76e7b6e731f8ea Mon Sep 17 00:00:00 2001 From: Ernest Litvinenko Date: Thu, 28 Mar 2024 18:20:57 +0300 Subject: [PATCH] Fix cart --- handlers/cart/endpoints/ep.go | 7 +- handlers/cart/endpoints/item.go | 118 ++++++++++++++++++++++++++++++++ handlers/cart/routes.go | 13 ++-- handlers/order/endpoints/ep.go | 45 ++++++++---- handlers/routers.go | 4 +- storage/cart.go | 3 +- storage/catalog.go | 2 +- storage/order.go | 34 +++++++++ 8 files changed, 196 insertions(+), 30 deletions(-) create mode 100644 storage/order.go diff --git a/handlers/cart/endpoints/ep.go b/handlers/cart/endpoints/ep.go index b022b53..37e6f30 100644 --- a/handlers/cart/endpoints/ep.go +++ b/handlers/cart/endpoints/ep.go @@ -7,10 +7,9 @@ type handlers struct{} type Handlers interface { GetCartItems(c *gin.Context) CreateFUser(c *gin.Context) - // - //CreateCartItem(c *gin.Context) - //UpdateCartItem(c *gin.Context) - //DeleteCartItem(c *gin.Context) + CreateCartItem(c *gin.Context) + UpdateCartItem(c *gin.Context) + DeleteCartItem(c *gin.Context) } func GetHandlers() Handlers { diff --git a/handlers/cart/endpoints/item.go b/handlers/cart/endpoints/item.go index b28836b..6923e56 100644 --- a/handlers/cart/endpoints/item.go +++ b/handlers/cart/endpoints/item.go @@ -1,5 +1,15 @@ package endpoints +import ( + "context" + "fmt" + "github.com/gin-gonic/gin" + "relynolli-server/models" + "relynolli-server/status" + "relynolli-server/storage" + "time" +) + type createCartItemRequest struct { FuserId int `json:"fuserId"` PriceTypeId int `json:"priceTypeId,omitempty"` @@ -18,6 +28,114 @@ type deleteCartRequest struct { ProductId int `json:"productId"` } +func (h *handlers) CreateCartItem(c *gin.Context) { + meta := models.Meta{ + RequestStarted: time.Now().Unix(), + } + response := models.Response{ + Status: status.STATUS_OK, + Meta: &meta, + } + s := storage.NewStorageCart() + ctx := context.Background() + + query := new(createCartItemRequest) + + err := c.ShouldBindJSON(query) + if err != nil { + response.Status = status.STATUS_BAD_REQUEST + response.Info = fmt.Sprintf("Error: %s", err.Error()) + meta.RequestFinished = time.Now().Unix() + c.JSON(400, response) + return + } + err = s.AddItemToCart(ctx, int64(query.FuserId), int64(query.ProductId)) + if err != nil { + response.Status = status.STATUS_BAD_REQUEST + response.Info = fmt.Sprintf("Error: %s", err.Error()) + meta.RequestFinished = time.Now().Unix() + c.JSON(400, response) + return + } + + meta.RequestFinished = time.Now().Unix() + response.Info = fmt.Sprintf("Item has added to cart") + response.Status = status.STATUS_OK + c.JSON(201, response) +} + +func (h *handlers) UpdateCartItem(c *gin.Context) { + meta := models.Meta{ + RequestStarted: time.Now().Unix(), + } + response := models.Response{ + Status: status.STATUS_OK, + Meta: &meta, + } + s := storage.NewStorageCart() + ctx := context.Background() + + query := new(updateCartRequest) + + err := c.ShouldBindJSON(query) + if err != nil { + response.Status = status.STATUS_BAD_REQUEST + response.Info = fmt.Sprintf("Error: %s", err.Error()) + meta.RequestFinished = time.Now().Unix() + c.JSON(400, response) + return + } + err = s.UpdateCartItem(ctx, int64(query.FuserId), int64(query.ProductId), int64(query.Quantity)) + if err != nil { + response.Status = status.STATUS_BAD_REQUEST + response.Info = fmt.Sprintf("Error: %s", err.Error()) + meta.RequestFinished = time.Now().Unix() + c.JSON(400, response) + return + } + + meta.RequestFinished = time.Now().Unix() + response.Info = fmt.Sprintf("Item has updated in cart") + response.Status = status.STATUS_OK + c.JSON(200, response) +} + +func (h *handlers) DeleteCartItem(c *gin.Context) { + meta := models.Meta{ + RequestStarted: time.Now().Unix(), + } + response := models.Response{ + Status: status.STATUS_OK, + Meta: &meta, + } + s := storage.NewStorageCart() + ctx := context.Background() + + query := new(deleteCartRequest) + + err := c.ShouldBindJSON(query) + if err != nil { + response.Status = status.STATUS_BAD_REQUEST + response.Info = fmt.Sprintf("Error: %s", err.Error()) + meta.RequestFinished = time.Now().Unix() + c.JSON(400, response) + return + } + err = s.DeleteCartItem(ctx, int64(query.FuserId), int64(query.ProductId)) + if err != nil { + response.Status = status.STATUS_BAD_REQUEST + response.Info = fmt.Sprintf("Error: %s", err.Error()) + meta.RequestFinished = time.Now().Unix() + c.JSON(400, response) + return + } + + meta.RequestFinished = time.Now().Unix() + response.Info = fmt.Sprintf("Item has dropped from cart") + response.Status = status.STATUS_OK + c.JSON(204, response) +} + //func (h *handlers) CreateCartItem(c *gin.Context) { // req := createCartItemRequest{} // err := c.ShouldBindJSON(&req) diff --git a/handlers/cart/routes.go b/handlers/cart/routes.go index 9b1fc52..4fb5f11 100644 --- a/handlers/cart/routes.go +++ b/handlers/cart/routes.go @@ -8,15 +8,14 @@ import ( func HandleRoutes(parent *gin.RouterGroup) { h := endpoints.GetHandlers() cart := parent.Group("/cart") - //itemRouter := cart.Group("/item") + itemRouter := cart.Group("/item") { cart.GET("", h.GetCartItems) cart.POST("", h.CreateFUser) } - - //{ - // itemRouter.POST("", h.CreateCartItem) - // itemRouter.PATCH("", h.UpdateCartItem) - // itemRouter.DELETE("", h.DeleteCartItem) - //} + { + itemRouter.POST("", h.CreateCartItem) + itemRouter.PATCH("", h.UpdateCartItem) + itemRouter.DELETE("", h.DeleteCartItem) + } } diff --git a/handlers/order/endpoints/ep.go b/handlers/order/endpoints/ep.go index 8d7440c..7fe32a2 100644 --- a/handlers/order/endpoints/ep.go +++ b/handlers/order/endpoints/ep.go @@ -1,10 +1,12 @@ package endpoints import ( + "context" "fmt" - "net/http" "relynolli-server/models" - "relynolli-server/services" + "relynolli-server/status" + "relynolli-server/storage" + "time" "github.com/gin-gonic/gin" "github.com/go-playground/validator/v10" @@ -32,12 +34,27 @@ type makeOrderRequest struct { func (h handlers) GetTotal(c *gin.Context) { req := getTotalRequest{} err := c.ShouldBindJSON(&req) + meta := models.Meta{ + RequestStarted: time.Now().Unix(), + } + ctx := context.Background() + s := storage.NewStorageOrder() + resp := models.Response{ + Status: status.STATUS_OK, + Meta: &meta, + } + if err != nil { - c.JSON(http.StatusBadRequest, models.Response{Status: http.StatusBadRequest, Info: "fuserId is not provided"}) + meta.RequestFinished = time.Now().Unix() + resp.Status = status.STATUS_BAD_REQUEST + resp.Info = fmt.Sprintf("Error: %s", err.Error()) + c.JSON(400, resp) return } - total := services.GetTotal(req.FuserId) - c.JSON(http.StatusOK, getTotalResponse{TotalProductPrice: total}) + + data, err := s.GetTotal(ctx, int64(req.FuserId)) + resp.Data = data + c.JSON(200, resp) } func (h handlers) MakeOrder(c *gin.Context) { @@ -46,26 +63,26 @@ func (h handlers) MakeOrder(c *gin.Context) { req := makeOrderRequest{} err := c.ShouldBindJSON(&req) if err != nil { - c.JSON(400, models.Response{Status: http.StatusBadRequest, Info: fmt.Sprintf("ERROR: %s", err.Error())}) + //c.JSON(400, models.Response{Status: http.StatusBadRequest, Info: fmt.Sprintf("ERROR: %s", err.Error())}) return } validationErr := validate.Struct(req) if validationErr != nil { - responseErr := validationErr.(validator.ValidationErrors)[0] - c.JSON(http.StatusBadRequest, models.Response{Status: http.StatusBadRequest, Info: fmt.Sprintf("Validation Error: Field %s should be %s", responseErr.Field(), responseErr.Tag())}) + //responseErr := validationErr.(validator.ValidationErrors)[0] + //c.JSON(http.StatusBadRequest, models.Response{Status: http.StatusBadRequest, Info: fmt.Sprintf("Validation Error: Field %s should be %s", responseErr.Field(), responseErr.Tag())}) return } - kassaResult, serviceErr := services.MakeOrder(req.FuserId, req.Email, req.FullName, req.PhoneNumber) + //kassaResult, serviceErr := services.MakeOrder(req.FuserId, req.Email, req.FullName, req.PhoneNumber) - if serviceErr != nil { - c.JSON(http.StatusInternalServerError, models.Response{Status: http.StatusInternalServerError, Info: fmt.Sprintf("Error: %s", serviceErr.Error())}) - return - } + //if serviceErr != nil { + // c.JSON(http.StatusInternalServerError, models.Response{Status: http.StatusInternalServerError, Info: fmt.Sprintf("Error: %s", serviceErr.Error())}) + // return + //} - c.JSON(http.StatusOK, kassaResult) + //c.JSON(http.StatusOK, kassaResult) } type Handlers interface { diff --git a/handlers/routers.go b/handlers/routers.go index f4cad64..2520747 100644 --- a/handlers/routers.go +++ b/handlers/routers.go @@ -3,6 +3,7 @@ package handlers import ( "relynolli-server/handlers/cart" "relynolli-server/handlers/news" + "relynolli-server/handlers/order" "github.com/gin-gonic/gin" @@ -17,6 +18,5 @@ func InitializeRouter(router *gin.Engine) { catalog.HandleRoutes(APIV1Router) cart.HandleRoutes(APIV1Router) news.HandleRoutes(APIV1Router) - // order.HandleRoutes(APIV1Router) - // validate.HandleRoutes(APIV1Router) + order.HandleRoutes(APIV1Router) } diff --git a/storage/cart.go b/storage/cart.go index ea660ed..58f0b6b 100644 --- a/storage/cart.go +++ b/storage/cart.go @@ -101,8 +101,7 @@ func (s *storage) AddItemToCart(ctx context.Context, fuserId, productId int64) e func (s *storage) UpdateCartItem(ctx context.Context, fuserId, productId, quantity int64) error { if quantity <= 0 { - // TODO Implement - return nil + return s.DeleteCartItem(ctx, fuserId, productId) } item, _ := s.GetCartItem(ctx, fuserId, productId) diff --git a/storage/catalog.go b/storage/catalog.go index 65e82e6..16b0068 100644 --- a/storage/catalog.go +++ b/storage/catalog.go @@ -44,7 +44,7 @@ func (s *storage) GetCatalogItemByCode(ctx context.Context, code string) (*catal func (s *storage) GetCatalogItem(ctx context.Context, id *int64) (*catalog.DBCatalog, error) { model := new(catalog.DBCatalog) - err := s.db.NewSelect().Model(model).Where("id = ?", id).Where("available_quantity > 0").Where("is_available = 1").Scan(ctx) + err := s.db.NewSelect().Model(model).Where("id = ?", id).Where("available_quantity > 0").Where("is_active = 1").Scan(ctx) if err != nil { return nil, err diff --git a/storage/order.go b/storage/order.go new file mode 100644 index 0000000..5a3f400 --- /dev/null +++ b/storage/order.go @@ -0,0 +1,34 @@ +package storage + +import ( + "context" + "relynolli-server/internal" +) + +type StorageOrder interface { + GetTotal(ctx context.Context, fuserId int64) (*TotalQuery, error) +} + +func NewStorageOrder() StorageOrder { + if instance == nil { + instance = &storage{ + db: internal.InitDatabase().GetInstance(), + rdb: internal.InitRedis(), + } + } + return instance +} + +type TotalQuery struct { + Total float64 `bun:"total" json:"total"` +} + +func (s *storage) GetTotal(ctx context.Context, fuserId int64) (*TotalQuery, error) { + model := new(TotalQuery) + stmt := `select sum(price.PRICE * cart.quantity) as total from api_cart cart left join b_catalog_price price on cart.product_id = price.PRODUCT_ID and cart.price_type_id = price.CATALOG_GROUP_ID where fuser_id = ?` + err := s.db.NewRaw(stmt, fuserId).Scan(ctx, model) + if err != nil { + return nil, err + } + return model, nil +}