...
This commit is contained in:
@@ -34,6 +34,8 @@ func ProductsHandlerRoutes(r fiber.Router) fiber.Router {
|
||||
|
||||
r.Get("/:id/:country_id/:quantity", handler.GetProductJson)
|
||||
r.Get("/list", handler.ListProducts)
|
||||
r.Post("/favorite/:product_id", handler.AddToFavorites)
|
||||
r.Delete("/favorite/:product_id", handler.RemoveFromFavorites)
|
||||
|
||||
return r
|
||||
}
|
||||
@@ -114,3 +116,51 @@ var columnMappingListProducts map[string]string = map[string]string{
|
||||
"quantity": "sa.quantity",
|
||||
"is_favorite": "ps.is_favorite",
|
||||
}
|
||||
|
||||
func (h *ProductsHandler) AddToFavorites(c fiber.Ctx) error {
|
||||
productIDStr := c.Params("product_id")
|
||||
|
||||
productID, err := strconv.Atoi(productIDStr)
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
userID, ok := localeExtractor.GetUserID(c)
|
||||
if !ok {
|
||||
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
|
||||
}
|
||||
|
||||
err = h.productService.AddToFavorites(userID, uint(productID))
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
|
||||
}
|
||||
|
||||
func (h *ProductsHandler) RemoveFromFavorites(c fiber.Ctx) error {
|
||||
productIDStr := c.Params("product_id")
|
||||
|
||||
productID, err := strconv.Atoi(productIDStr)
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
userID, ok := localeExtractor.GetUserID(c)
|
||||
if !ok {
|
||||
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
|
||||
}
|
||||
|
||||
err = h.productService.RemoveFromFavorites(userID, uint(productID))
|
||||
if err != nil {
|
||||
return c.Status(responseErrors.GetErrorStatus(err)).
|
||||
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
|
||||
}
|
||||
|
||||
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
|
||||
}
|
||||
|
||||
@@ -86,3 +86,12 @@ type ProductFilters struct {
|
||||
}
|
||||
|
||||
type FeatVal = map[uint][]uint
|
||||
|
||||
type B2bFavorite struct {
|
||||
UserID uint `gorm:"column:user_id;not null;primaryKey" json:"user_id"`
|
||||
ProductID uint `gorm:"column:product_id;not null;primaryKey" json:"product_id"`
|
||||
}
|
||||
|
||||
func (*B2bFavorite) TableName() string {
|
||||
return "b2b_favorites"
|
||||
}
|
||||
|
||||
@@ -17,6 +17,8 @@ import (
|
||||
type UIProductsRepo interface {
|
||||
GetJSON(p_id_product, p_id_shop, p_id_lang, p_id_customer, b2b_id_country, p_quantity int) (*json.RawMessage, error)
|
||||
Find(id_lang, userID uint, p find.Paging, filt *filters.FiltersList) (find.Found[model.ProductInList], error)
|
||||
AddToFavorites(userID uint, productID uint) error
|
||||
RemoveFromFavorites(userID uint, productID uint) error
|
||||
}
|
||||
|
||||
type ProductsRepo struct{}
|
||||
@@ -125,3 +127,17 @@ func (repo *ProductsRepo) Find(id_lang, userID uint, p find.Paging, filt *filter
|
||||
Count: uint(total),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (repo *ProductsRepo) AddToFavorites(userID uint, productID uint) error {
|
||||
fav := model.B2bFavorite{
|
||||
UserID: userID,
|
||||
ProductID: productID,
|
||||
}
|
||||
return db.Get().Create(&fav).Error
|
||||
}
|
||||
|
||||
func (repo *ProductsRepo) RemoveFromFavorites(userID uint, productID uint) error {
|
||||
return db.Get().
|
||||
Where("user_id = ? AND product_id = ?", userID, productID).
|
||||
Delete(&model.B2bFavorite{}).Error
|
||||
}
|
||||
|
||||
@@ -32,3 +32,11 @@ func (s *ProductService) GetJSON(p_id_product, p_id_lang, p_id_customer, b2b_id_
|
||||
func (s *ProductService) Find(id_lang, userID uint, p find.Paging, filters *filters.FiltersList) (find.Found[model.ProductInList], error) {
|
||||
return s.productsRepo.Find(id_lang, userID, p, filters)
|
||||
}
|
||||
|
||||
func (s *ProductService) AddToFavorites(userID uint, productID uint) error {
|
||||
return s.productsRepo.AddToFavorites(userID, productID)
|
||||
}
|
||||
|
||||
func (s *ProductService) RemoveFromFavorites(userID uint, productID uint) error {
|
||||
return s.productsRepo.RemoveFromFavorites(userID, productID)
|
||||
}
|
||||
|
||||
@@ -49,8 +49,11 @@ var (
|
||||
ErrAIResponseFail = errors.New("AI responded with failure")
|
||||
ErrAIBadOutput = errors.New("AI response does not obey the format")
|
||||
|
||||
// Typed errors for product list handler
|
||||
ErrBadPaging = errors.New("bad or missing paging attribute value in header")
|
||||
// Typed errors for product handler
|
||||
ErrBadPaging = errors.New("bad or missing paging attribute value in header")
|
||||
ErrProductNotFound = errors.New("product with provided id does not exist")
|
||||
ErrAlreadyInFavorites = errors.New("the product already is in your favorites")
|
||||
ErrNotInFavorites = errors.New("the product already is not in your favorites")
|
||||
|
||||
// Typed errors for menu handler
|
||||
ErrNoRootFound = errors.New("no root found in categories table")
|
||||
@@ -170,6 +173,12 @@ func GetErrorCode(c fiber.Ctx, err error) string {
|
||||
|
||||
case errors.Is(err, ErrBadPaging):
|
||||
return i18n.T_(c, "error.err_bad_paging")
|
||||
case errors.Is(err, ErrProductNotFound):
|
||||
return i18n.T_(c, "error.err_product_not_found")
|
||||
case errors.Is(err, ErrAlreadyInFavorites):
|
||||
return i18n.T_(c, "error.err_already_in_favorites")
|
||||
case errors.Is(err, ErrNotInFavorites):
|
||||
return i18n.T_(c, "error.err_already_not_in_favorites")
|
||||
|
||||
case errors.Is(err, ErrNoRootFound):
|
||||
return i18n.T_(c, "error.err_no_root_found")
|
||||
@@ -249,6 +258,9 @@ func GetErrorStatus(err error) int {
|
||||
errors.Is(err, ErrInvalidURLSlug),
|
||||
errors.Is(err, ErrInvalidXHTML),
|
||||
errors.Is(err, ErrBadPaging),
|
||||
errors.Is(err, ErrProductNotFound),
|
||||
errors.Is(err, ErrAlreadyInFavorites),
|
||||
errors.Is(err, ErrNotInFavorites),
|
||||
errors.Is(err, ErrNoRootFound),
|
||||
errors.Is(err, ErrCircularDependency),
|
||||
errors.Is(err, ErrStartCategoryNotFound),
|
||||
|
||||
Reference in New Issue
Block a user