hotfix/hotfix-mysql-error
Ernest Litvinenko 2024-03-28 18:20:57 +03:00
parent d7b1f65805
commit 54b7fedcdb
8 changed files with 196 additions and 30 deletions

View File

@ -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 {

View File

@ -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)

View File

@ -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)
}
}

View File

@ -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 {

View File

@ -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)
}

View File

@ -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)

View File

@ -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

34
storage/order.go Normal file
View File

@ -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
}