diff --git a/app/delivery/web/api/restricted/product.go b/app/delivery/web/api/restricted/product.go index bc7778e..ba6b99d 100644 --- a/app/delivery/web/api/restricted/product.go +++ b/app/delivery/web/api/restricted/product.go @@ -103,15 +103,15 @@ func (h *ProductsHandler) ListProducts(c fiber.Ctx) error { return c.JSON(response.Make(&list.Items, int(list.Count), i18n.T_(c, response.Message_OK))) } +// These are all the filterable fields var columnMappingListProducts map[string]string = map[string]string{ - "product_id": "ps.id_product", - "name": "pl.name", - "reference": "p.reference", - "category_name": "cl.name", - "category_id": "cp.id_category", - "quantity": "sa.quantity", - "is_favorite": "ps.is_favorite", - "is_new": "is_new", + "product_id": "bp.product_id", + "name": "bp.name", + "reference": "bp.reference", + "category_id": "bp.category_id", + "quantity": "bp.quantity", + "is_favorite": "bp.is_favorite", + "is_new": "bp.is_new", } func (h *ProductsHandler) AddToFavorites(c fiber.Ctx) error { diff --git a/app/repos/productsRepo/productsRepo.go b/app/repos/productsRepo/productsRepo.go index eae3f91..344b7a8 100644 --- a/app/repos/productsRepo/productsRepo.go +++ b/app/repos/productsRepo/productsRepo.go @@ -105,69 +105,90 @@ func (repo *ProductsRepo) GetVariants(p_id_product, p_id_shop, p_id_lang, p_id_c } 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, - COALESCE(f.is_favorite, 0) AS is_favorite, - CASE - WHEN ps.date_add >= DATE_SUB( - NOW(), - INTERVAL ( - SELECT value - FROM ps_configuration - WHERE name = 'PS_NB_DAYS_NEW_PRODUCT' - ) DAY - ) AND ps.active = 1 - THEN 1 - ELSE 0 - END AS is_new - `, 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"). + query := db.DB. + Table("base_products AS bp"). 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(). + DB: db.DB. Table("b2b_favorites"). Select(` - product_id AS id_product, + product_id AS product_id, COUNT(*) > 0 AS is_favorite `). Where("user_id = ?", userID). Group("product_id"), }, }, + { + Name: "new_product_days", + Subquery: exclause.Subquery{ + DB: db.DB. + Table("ps_configuration"). + Select("CAST(value AS SIGNED) AS days"). + Where("name = ?", "PS_NB_DAYS_NEW_PRODUCT"), + }, + }, + { + Name: "variants", + Subquery: exclause.Subquery{ + DB: db.DB. + Table("ps_product_attribute_shop"). + Select("id_product, COUNT(*) AS variants_number"). + Group("id_product"), + }, + }, + { + Name: "base_products", + Subquery: exclause.Subquery{ + DB: db.DB. + Table(gormcol.Field.Tab(dbmodel.PsProductShopCols.Active)+" AS ps"). + Select(` + ps.id_product AS product_id, + pl.name AS name, + ps.id_category_default AS category_id, + p.reference AS reference, + sa.quantity AS quantity, + COALESCE(f.is_favorite, 0) AS is_favorite, + CASE + WHEN ps.date_add >= DATE_SUB( + NOW(), + INTERVAL COALESCE(npd.days, 20) DAY + ) AND ps.active = 1 + THEN 1 + ELSE 0 + END AS is_new + `). + 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("LEFT JOIN favorites f ON f.product_id = ps.id_product"). + Joins("LEFT JOIN ps_stock_available sa ON sa.id_product = ps.id_product AND sa.id_product_attribute = 0"). + Joins("LEFT JOIN new_product_days npd ON 1 = 1"). + Where("ps.active = ?", 1). + Group("ps.id_product"), + }, + }, }, }). - Order("ps.id_product DESC") + Select(` + bp.product_id AS product_id, + bp.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, + bp.reference AS reference, + COALESCE(v.variants_number, 0) AS variants_number, + bp.quantity AS quantity, + bp.is_favorite AS is_favorite, + bp.is_new AS is_new + `, config.Get().Image.ImagePrefix). + Joins("JOIN ps_product_lang pl ON pl.id_product = bp.product_id AND pl.id_lang = ?", langID). + Joins("JOIN ps_image_shop ims ON ims.id_product = bp.product_id AND ims.cover = 1"). + Joins("JOIN ps_category_lang cl ON cl.id_category = bp.category_id AND cl.id_lang = ?", langID). + Joins("LEFT JOIN variants v ON v.id_product = bp.product_id"). + Order("bp.product_id DESC") query = query.Scopes(filt.All()...) diff --git a/bruno/api_v1/product/Products List.yml b/bruno/api_v1/product/Products List.yml index 01983e2..c099b28 100644 --- a/bruno/api_v1/product/Products List.yml +++ b/bruno/api_v1/product/Products List.yml @@ -5,7 +5,7 @@ info: http: method: GET - url: "{{bas_url}}/restricted/product/list?p=1&elems=30&sort=product_id,asc&reference=~NC100" + url: "{{bas_url}}/restricted/product/list?p=1&elems=30&reference=~NC100" params: - name: p value: "1" @@ -16,13 +16,22 @@ http: - name: sort value: product_id,asc type: query + disabled: true - name: category_id_in - value: "243" + value: "23" type: query disabled: true - name: reference value: ~NC100 type: query + - name: is_new_eq + value: "0" + type: query + disabled: true + - name: is_favorite_eq + value: "false" + type: query + disabled: true body: type: json data: ""