Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into product-procedures
This commit is contained in:
@@ -16,11 +16,15 @@ 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 uint, p find.Paging, filt *filters.FiltersList) (*find.Found[model.ProductInList], error)
|
||||
Find(id_lang uint, userID uint, p find.Paging, filt *filters.FiltersList) (*find.Found[model.ProductInList], error)
|
||||
GetProductVariants(langID uint, productID uint, shopID uint, customerID uint, countryID uint, quantity uint) ([]view.ProductAttribute, error)
|
||||
GetBase(p_id_product, p_id_shop, p_id_lang uint) (view.Product, error)
|
||||
GetPrice(p_id_product uint, productAttributeID *uint, p_id_shop uint, p_id_customer uint, p_id_country uint, p_quantity uint) (view.Price, error)
|
||||
GetVariants(p_id_product, p_id_shop, p_id_lang, p_id_customer, p_id_country, p_quantity uint) ([]view.ProductAttribute, error)
|
||||
AddToFavorites(userID uint, productID uint) error
|
||||
RemoveFromFavorites(userID uint, productID uint) error
|
||||
ExistsInFavorites(userID uint, productID uint) (bool, error)
|
||||
ProductInDatabase(productID uint) (bool, error)
|
||||
}
|
||||
|
||||
type ProductsRepo struct{}
|
||||
@@ -100,34 +104,57 @@ func (repo *ProductsRepo) GetVariants(p_id_product, p_id_shop, p_id_lang, p_id_c
|
||||
return results, err
|
||||
}
|
||||
|
||||
func (repo *ProductsRepo) Find(langID uint, p find.Paging, filt *filters.FiltersList) (*find.Found[model.ProductInList], error) {
|
||||
func (repo *ProductsRepo) Find(langID uint, userID uint, p find.Paging, filt *filters.FiltersList) (*find.Found[model.ProductInList], error) {
|
||||
query := db.Get().
|
||||
Table(gormcol.Field.Tab(dbmodel.PsProductShopCols.Active)+" AS ps").
|
||||
Select(`
|
||||
ps.id_product AS product_id,
|
||||
pl.name AS name,
|
||||
pl.link_rewrite AS link_rewrite,
|
||||
CONCAT(?, '/', ims.id_image, '-small_default/', pl.link_rewrite, '.webp') AS image_link,
|
||||
cl.name AS category_name,
|
||||
p.reference AS reference,
|
||||
COALESCE(v.variants_number, 0) AS variants_number,
|
||||
sa.quantity AS quantity
|
||||
`, config.Get().Image.ImagePrefix).
|
||||
ps.id_product AS product_id,
|
||||
pl.name AS name,
|
||||
pl.link_rewrite AS link_rewrite,
|
||||
CONCAT(?, '/', ims.id_image, '-small_default/', pl.link_rewrite, '.webp') AS image_link,
|
||||
cl.name AS category_name,
|
||||
p.reference AS reference,
|
||||
COALESCE(v.variants_number, 0) AS variants_number,
|
||||
sa.quantity AS quantity,
|
||||
COALESCE(f.is_favorite, 0) AS is_favorite
|
||||
`, config.Get().Image.ImagePrefix).
|
||||
Joins("JOIN "+dbmodel.PsProductCols.IDProduct.Tab()+" p ON p.id_product = ps.id_product").
|
||||
Joins("JOIN ps_product_lang pl ON pl.id_product = ps.id_product AND pl.id_lang = ?", langID).
|
||||
Joins("JOIN ps_image_shop ims ON ims.id_product = ps.id_product AND ims.cover = 1").
|
||||
Joins("JOIN ps_category_lang cl ON cl.id_category = ps.id_category_default AND cl.id_lang = ?", langID).
|
||||
Joins("JOIN ps_category_product cp ON cp.id_product = ps.id_product").
|
||||
Joins("LEFT JOIN variants v ON v.id_product = ps.id_product").
|
||||
Joins("LEFT JOIN favorites f ON f.id_product = ps.id_product").
|
||||
Joins("LEFT JOIN ps_stock_available sa ON sa.id_product = ps.id_product AND sa.id_product_attribute = 0").
|
||||
Where("ps.active = ?", 1).
|
||||
Group("ps.id_product").
|
||||
Clauses(exclause.With{CTEs: []exclause.CTE{
|
||||
{
|
||||
Name: "variants",
|
||||
Subquery: exclause.Subquery{DB: db.Get().Model(&dbmodel.PsProductAttributeShop{}).Select("id_product", "COUNT(*) AS variants_number").Group("id_product")},
|
||||
Clauses(exclause.With{
|
||||
CTEs: []exclause.CTE{
|
||||
{
|
||||
Name: "variants",
|
||||
Subquery: exclause.Subquery{
|
||||
DB: db.Get().
|
||||
Model(&dbmodel.PsProductAttributeShop{}).
|
||||
Select("id_product", "COUNT(*) AS variants_number").
|
||||
Group("id_product"),
|
||||
},
|
||||
},
|
||||
|
||||
{
|
||||
Name: "favorites",
|
||||
Subquery: exclause.Subquery{
|
||||
DB: db.Get().
|
||||
Table("b2b_favorites").
|
||||
Select(`
|
||||
product_id AS id_product,
|
||||
COUNT(*) > 0 AS is_favorite
|
||||
`).
|
||||
Where("user_id = ?", userID).
|
||||
Group("product_id"),
|
||||
},
|
||||
},
|
||||
},
|
||||
}}).
|
||||
}).
|
||||
Order("ps.id_product DESC")
|
||||
|
||||
query = query.Scopes(filt.All()...)
|
||||
@@ -189,3 +216,35 @@ func (repo *ProductsRepo) PopulateProductPrice(product *model.ProductInList, tar
|
||||
return 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
|
||||
}
|
||||
|
||||
func (repo *ProductsRepo) ExistsInFavorites(userID uint, productID uint) (bool, error) {
|
||||
var count int64
|
||||
err := db.Get().
|
||||
Table("b2b_favorites").
|
||||
Where("user_id = ? AND product_id = ?", userID, productID).
|
||||
Count(&count).Error
|
||||
return count >= 1, err
|
||||
}
|
||||
|
||||
func (repo *ProductsRepo) ProductInDatabase(productID uint) (bool, error) {
|
||||
var count int64
|
||||
err := db.Get().
|
||||
Table(dbmodel.TableNamePsProduct).
|
||||
Where(dbmodel.PsProductCols.IDProduct.Col()+" = ?", productID).
|
||||
Count(&count).Error
|
||||
return count >= 1, err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user