From ce4cadaa1628bc8e0ce5cdcb159f99a47445a9de Mon Sep 17 00:00:00 2001 From: Daniel Goc Date: Mon, 13 Apr 2026 15:29:21 +0200 Subject: [PATCH] most importantly: new category and filter on is_new --- app/delivery/middleware/auth.go | 21 ---- app/delivery/middleware/perms/permissions.go | 14 ++- app/delivery/web/api/restricted/product.go | 1 + .../web/api/restricted/productTranslation.go | 18 +-- app/delivery/web/api/restricted/search.go | 10 +- app/delivery/web/api/restricted/storage.go | 10 +- app/delivery/web/init.go | 10 -- app/model/product.go | 1 + .../productDescriptionRepo.go | 107 ----------------- app/repos/productsRepo/productsRepo.go | 14 ++- app/repos/searchRepo/searchRepo.go | 110 ++++++++++++++++++ app/service/meiliService/meiliService.go | 12 +- app/utils/localeExtractor/localeExtractor.go | 8 -- .../20260302163123_create_tables_data.sql | 12 ++ 14 files changed, 159 insertions(+), 189 deletions(-) diff --git a/app/delivery/middleware/auth.go b/app/delivery/middleware/auth.go index 756e79f..54910ea 100644 --- a/app/delivery/middleware/auth.go +++ b/app/delivery/middleware/auth.go @@ -10,7 +10,6 @@ import ( "git.ma-al.com/goc_daniel/b2b/app/model" "git.ma-al.com/goc_daniel/b2b/app/service/authService" constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data" - "git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor" "github.com/gofiber/fiber/v3" ) @@ -115,26 +114,6 @@ func AuthMiddleware() fiber.Handler { } } -// RequireAdmin creates admin-only middleware -func RequireAdmin() fiber.Handler { - return func(c fiber.Ctx) error { - originalUserRole, ok := localeExtractor.GetOriginalUserRole(c) - if !ok { - return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{ - "error": "not authenticated", - }) - } - - if model.CustomerRole(originalUserRole.Name) != model.RoleAdmin { - return c.Status(fiber.StatusForbidden).JSON(fiber.Map{ - "error": "admin access required", - }) - } - - return c.Next() - } -} - // Webdav func Webdav() fiber.Handler { authService := authService.NewAuthService() diff --git a/app/delivery/middleware/perms/permissions.go b/app/delivery/middleware/perms/permissions.go index 69ab5df..fb922d4 100644 --- a/app/delivery/middleware/perms/permissions.go +++ b/app/delivery/middleware/perms/permissions.go @@ -3,9 +3,13 @@ package perms type Permission string const ( - UserReadAny Permission = "user.read.any" - UserWriteAny Permission = "user.write.any" - UserDeleteAny Permission = "user.delete.any" - CurrencyWrite Permission = "currency.write" - SpecificPriceManage Permission = "specific_price.manage" + UserReadAny Permission = "user.read.any" + UserWriteAny Permission = "user.write.any" + UserDeleteAny Permission = "user.delete.any" + CurrencyWrite Permission = "currency.write" + SpecificPriceManage Permission = "specific_price.manage" + CreateWebdavToken Permission = "webdav.create_token" + ProductTranslationSave Permission = "product_translation.save" + ProductTranslationTranslate Permission = "product_translation.translate" + SearchCreateIndex Permission = "search.create_index" ) diff --git a/app/delivery/web/api/restricted/product.go b/app/delivery/web/api/restricted/product.go index ea0e07f..bc7778e 100644 --- a/app/delivery/web/api/restricted/product.go +++ b/app/delivery/web/api/restricted/product.go @@ -111,6 +111,7 @@ var columnMappingListProducts map[string]string = map[string]string{ "category_id": "cp.id_category", "quantity": "sa.quantity", "is_favorite": "ps.is_favorite", + "is_new": "is_new", } func (h *ProductsHandler) AddToFavorites(c fiber.Ctx) error { diff --git a/app/delivery/web/api/restricted/productTranslation.go b/app/delivery/web/api/restricted/productTranslation.go index 3dc16bd..c995085 100644 --- a/app/delivery/web/api/restricted/productTranslation.go +++ b/app/delivery/web/api/restricted/productTranslation.go @@ -4,7 +4,7 @@ import ( "strconv" "git.ma-al.com/goc_daniel/b2b/app/config" - "git.ma-al.com/goc_daniel/b2b/app/model" + "git.ma-al.com/goc_daniel/b2b/app/delivery/middleware" "git.ma-al.com/goc_daniel/b2b/app/service/productTranslationService" "git.ma-al.com/goc_daniel/b2b/app/utils/i18n" "git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor" @@ -35,8 +35,8 @@ func ProductTranslationHandlerRoutes(r fiber.Router) fiber.Router { handler := NewProductTranslationHandler() r.Get("/get-product-description", handler.GetProductDescription) - r.Post("/save-product-description", handler.SaveProductDescription) - r.Get("/translate-product-description", handler.TranslateProductDescription) + r.Post("/save-product-description", middleware.Require("product_translation.save"), handler.SaveProductDescription) + r.Get("/translate-product-description", middleware.Require("product_translation.translate"), handler.TranslateProductDescription) return r } @@ -80,12 +80,6 @@ func (h *ProductTranslationHandler) SaveProductDescription(c fiber.Ctx) error { JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody))) } - userRole, ok := localeExtractor.GetOriginalUserRole(c) - if !ok || model.CustomerRole(userRole.Name) != model.RoleAdmin { - return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrAdminAccessRequired)). - JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrAdminAccessRequired))) - } - productID_attribute := c.Query("productID") productID, err := strconv.Atoi(productID_attribute) if err != nil { @@ -123,12 +117,6 @@ func (h *ProductTranslationHandler) TranslateProductDescription(c fiber.Ctx) err JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody))) } - userRole, ok := localeExtractor.GetOriginalUserRole(c) - if !ok || model.CustomerRole(userRole.Name) != model.RoleAdmin { - return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrAdminAccessRequired)). - JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrAdminAccessRequired))) - } - productID_attribute := c.Query("productID") productID, err := strconv.Atoi(productID_attribute) if err != nil { diff --git a/app/delivery/web/api/restricted/search.go b/app/delivery/web/api/restricted/search.go index 843c956..dc79683 100644 --- a/app/delivery/web/api/restricted/search.go +++ b/app/delivery/web/api/restricted/search.go @@ -4,7 +4,7 @@ import ( "encoding/json" "fmt" - "git.ma-al.com/goc_daniel/b2b/app/model" + "git.ma-al.com/goc_daniel/b2b/app/delivery/middleware" "git.ma-al.com/goc_daniel/b2b/app/service/meiliService" searchservice "git.ma-al.com/goc_daniel/b2b/app/service/searchService" "git.ma-al.com/goc_daniel/b2b/app/utils/i18n" @@ -30,7 +30,7 @@ func NewMeiliSearchHandler() *MeiliSearchHandler { func MeiliSearchHandlerRoutes(r fiber.Router) fiber.Router { handler := NewMeiliSearchHandler() - r.Get("/create-index", handler.CreateIndex) + r.Get("/create-index", middleware.Require("search.create_index"), handler.CreateIndex) r.Post("/search", handler.Search) r.Post("/settings", handler.GetSettings) @@ -44,12 +44,6 @@ func (h *MeiliSearchHandler) CreateIndex(c fiber.Ctx) error { JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute))) } - userRole, ok := localeExtractor.GetOriginalUserRole(c) - if !ok || model.CustomerRole(userRole.Name) != model.RoleAdmin { - return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrAdminAccessRequired)). - JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrAdminAccessRequired))) - } - err := h.meiliService.CreateIndex(id_lang) if err != nil { fmt.Printf("CreateIndex error: %v\n", err) diff --git a/app/delivery/web/api/restricted/storage.go b/app/delivery/web/api/restricted/storage.go index 910aae1..1bd631d 100644 --- a/app/delivery/web/api/restricted/storage.go +++ b/app/delivery/web/api/restricted/storage.go @@ -4,7 +4,7 @@ import ( "strconv" "git.ma-al.com/goc_daniel/b2b/app/config" - "git.ma-al.com/goc_daniel/b2b/app/model" + "git.ma-al.com/goc_daniel/b2b/app/delivery/middleware" "git.ma-al.com/goc_daniel/b2b/app/service/storageService" "git.ma-al.com/goc_daniel/b2b/app/utils/i18n" "git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor" @@ -34,7 +34,7 @@ func StorageHandlerRoutes(r fiber.Router) fiber.Router { r.Get("/download-file/*", handler.DownloadFile) // for admins only - r.Get("/create-new-webdav-token", handler.CreateNewWebdavToken) + r.Get("/create-new-webdav-token", middleware.Require("webdav.create_token"), handler.CreateNewWebdavToken) return r } @@ -84,12 +84,6 @@ func (h *StorageHandler) CreateNewWebdavToken(c fiber.Ctx) error { JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody))) } - userRole, ok := localeExtractor.GetOriginalUserRole(c) - if !ok || model.CustomerRole(userRole.Name) != model.RoleAdmin { - return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrAdminAccessRequired)). - JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrAdminAccessRequired))) - } - new_token, err := h.storageService.NewWebdavToken(userID) if err != nil { return c.Status(responseErrors.GetErrorStatus(err)). diff --git a/app/delivery/web/init.go b/app/delivery/web/init.go index 29fcd71..c67d530 100644 --- a/app/delivery/web/init.go +++ b/app/delivery/web/init.go @@ -161,16 +161,6 @@ func (s *Server) Setup() error { // }) // }) - // // Admin routes example - // admin := s.api.Group("/admin") - // admin.Use(middleware.AuthMiddleware()) - // admin.Use(middleware.RequireAdmin()) - // admin.Get("/users", func(c fiber.Ctx) error { - // return c.JSON(fiber.Map{ - // "message": "Admin area - user management", - // }) - // }) - // keep this at the end because its wilderange general.InitBo(s.App()) diff --git a/app/model/product.go b/app/model/product.go index 8c062a7..6595f79 100644 --- a/app/model/product.go +++ b/app/model/product.go @@ -12,6 +12,7 @@ type ProductInList struct { PriceTaxExcl float64 `gorm:"column:price_tax_excl" json:"price_tax_excl"` PriceTaxIncl float64 `gorm:"column:price_tax_incl" json:"price_tax_incl"` IsFavorite bool `gorm:"column:is_favorite" json:"is_favorite"` + IsNew uint `gorm:"column:is_new" json:"is_new"` } type ProductFilters struct { diff --git a/app/repos/productDescriptionRepo/productDescriptionRepo.go b/app/repos/productDescriptionRepo/productDescriptionRepo.go index 5083a42..b6eda1e 100644 --- a/app/repos/productDescriptionRepo/productDescriptionRepo.go +++ b/app/repos/productDescriptionRepo/productDescriptionRepo.go @@ -9,7 +9,6 @@ import ( "git.ma-al.com/goc_daniel/b2b/app/model" "git.ma-al.com/goc_daniel/b2b/app/model/dbmodel" constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data" - "github.com/WinterYukky/gorm-extra-clause-plugin/exclause" "gorm.io/gorm" ) @@ -17,7 +16,6 @@ type UIProductDescriptionRepo interface { GetProductDescription(productID uint, productid_lang uint) (*model.ProductDescription, error) CreateIfDoesNotExist(productID uint, productid_lang uint) error UpdateFields(productID uint, productid_lang uint, updates map[string]string) error - GetMeiliProducts(id_lang uint, offset, limit int) ([]model.MeiliSearchProduct, error) } type ProductDescriptionRepo struct{} @@ -118,108 +116,3 @@ func (r *ProductDescriptionRepo) UpdateFields(productID uint, productid_lang uin return nil } - -// GetMeiliProductsBatchedScanned returns a batch of products with LIMIT/OFFSET pagination -// The scanning is done inside the repo to keep the service layer cleaner -func (r *ProductDescriptionRepo) GetMeiliProducts(id_lang uint, offset, limit int) ([]model.MeiliSearchProduct, error) { - - var products []model.MeiliSearchProduct - - err := db.Get(). - Table("ps_product_shop ps"). - Select(` - ps.id_product AS id_product, - pl.name AS name, - TRIM(REGEXP_REPLACE(REGEXP_REPLACE(pl.description_short, '<[^>]*>', ' '), '[[:space:]]+', ' ')) AS description, - p.ean13, - p.reference, - ps.price, - ps.id_category_default AS id_category, - cl.name AS cat_name, - cl.link_rewrite AS l_rew, - COALESCE(vary.attributes, JSON_OBJECT()) AS attr, - COALESCE(feat.features, JSON_OBJECT()) AS feat, - img.id_image, - cat.category_ids, - (SELECT COUNT(*) FROM ps_product_attribute_shop pas2 WHERE pas2.id_product = ps.id_product AND pas2.id_shop = ?) AS variations - `, constdata.SHOP_ID). - Joins("JOIN ps_product p ON p.id_product = ps.id_product"). - Joins("JOIN ps_product_lang pl ON pl.id_product = ps.id_product AND pl.id_shop = ? AND pl.id_lang = ?", constdata.SHOP_ID, id_lang). - Joins("JOIN ps_category_lang cl ON cl.id_category = ps.id_category_default AND cl.id_shop = ? AND cl.id_lang = ?", constdata.SHOP_ID, id_lang). - Joins("LEFT JOIN variations vary ON vary.id_product = ps.id_product"). - Joins("LEFT JOIN features feat ON feat.id_product = ps.id_product"). - Joins("LEFT JOIN images img ON img.id_product = ps.id_product"). - Joins("LEFT JOIN categories cat ON cat.id_product = ps.id_product"). - Joins("JOIN products_page pp ON pp.id_product = ps.id_product"). - Where("ps.active = ?", 1). - Order("ps.id_product"). - Clauses(exclause.With{CTEs: []exclause.CTE{ - { - Name: "products_page", - Subquery: exclause.Subquery{ - DB: db.Get(). - Model(&dbmodel.PsProductShop{}). - Select("id_product, price"). - Where("id_shop = ? AND active = 1", constdata.SHOP_ID). - Order("id_product"). - Limit(limit). - Offset(offset), - }, - }, - { - Name: "variation_attributes", - Subquery: exclause.Subquery{ - DB: db.Get(). - Table("ps_product_attribute_shop pas"). // <- explicit alias here - Select(` - pas.id_product, - pag.id_attribute_group AS attribute_name, - JSON_ARRAYAGG(DISTINCT pa.id_attribute) AS attribute_values - `). - Joins("JOIN ps_product_attribute_combination ppac ON ppac.id_product_attribute = pas.id_product_attribute"). - Joins("JOIN ps_attribute pa ON pa.id_attribute = ppac.id_attribute"). - Joins("JOIN ps_attribute_group pag ON pag.id_attribute_group = pa.id_attribute_group"). - Where("pas.id_shop = ?", constdata.SHOP_ID). - Group("pas.id_product, pag.id_attribute_group"), - }, - }, - { - Name: "variations", - Subquery: exclause.Subquery{ - DB: db.Get(). - Table("variation_attributes"). - Select("id_product, JSON_OBJECTAGG(attribute_name, attribute_values) AS attributes"). - Group("id_product"), - }, - }, - { - Name: "features", - Subquery: exclause.Subquery{ - DB: db.Get(). - Table("ps_feature_product pfp"). // <- explicit alias - Select("pfp.id_product, JSON_OBJECTAGG(pfp.id_feature, pfp.id_feature_value) AS features"). - Group("pfp.id_product"), - }, - }, - { - Name: "images", - Subquery: exclause.Subquery{ - DB: db.Get(). - Model(&dbmodel.PsImageShop{}). - Select("id_product, id_image"). - Where("id_shop = ? AND cover = 1", constdata.SHOP_ID), - }, - }, - { - Name: "categories", - Subquery: exclause.Subquery{ - DB: db.Get(). - Model(&dbmodel.PsCategoryProduct{}). - Select("id_product, JSON_ARRAYAGG(id_category) AS category_ids"). - Group("id_product"), - }, - }, - }}).Find(&products).Error - - return products, err -} diff --git a/app/repos/productsRepo/productsRepo.go b/app/repos/productsRepo/productsRepo.go index 5f0e1a9..eae3f91 100644 --- a/app/repos/productsRepo/productsRepo.go +++ b/app/repos/productsRepo/productsRepo.go @@ -116,7 +116,19 @@ func (repo *ProductsRepo) Find(langID uint, userID uint, p find.Paging, filt *fi p.reference AS reference, COALESCE(v.variants_number, 0) AS variants_number, sa.quantity AS quantity, - COALESCE(f.is_favorite, 0) AS is_favorite + 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). diff --git a/app/repos/searchRepo/searchRepo.go b/app/repos/searchRepo/searchRepo.go index de4d5ea..d8b56ba 100644 --- a/app/repos/searchRepo/searchRepo.go +++ b/app/repos/searchRepo/searchRepo.go @@ -7,7 +7,11 @@ import ( "net/http" "git.ma-al.com/goc_daniel/b2b/app/config" + "git.ma-al.com/goc_daniel/b2b/app/db" "git.ma-al.com/goc_daniel/b2b/app/model" + "git.ma-al.com/goc_daniel/b2b/app/model/dbmodel" + constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data" + "github.com/WinterYukky/gorm-extra-clause-plugin/exclause" ) type SearchProxyResponse struct { @@ -17,6 +21,7 @@ type SearchProxyResponse struct { type UISearchRepo interface { Search(index string, body []byte) (*SearchProxyResponse, error) + GetMeiliProducts(id_lang uint, offset, limit int) ([]model.MeiliSearchProduct, error) GetIndexSettings(index string) (*SearchProxyResponse, error) GetRoutes(langId uint) ([]model.Route, error) } @@ -80,3 +85,108 @@ func (r *SearchRepo) doRequest(method, url string, body []byte) (*SearchProxyRes func (r *SearchRepo) GetRoutes(langId uint) ([]model.Route, error) { return nil, nil } + +// GetMeiliProductsProducts returns a batch of products with LIMIT/OFFSET pagination +// The scanning is done inside the repo to keep the service layer cleaner +func (r *SearchRepo) GetMeiliProducts(id_lang uint, offset, limit int) ([]model.MeiliSearchProduct, error) { + + var products []model.MeiliSearchProduct + + err := db.Get(). + Table("ps_product_shop ps"). + Select(` + ps.id_product AS id_product, + pl.name AS name, + TRIM(REGEXP_REPLACE(REGEXP_REPLACE(pl.description_short, '<[^>]*>', ' '), '[[:space:]]+', ' ')) AS description, + p.ean13, + p.reference, + ps.price, + ps.id_category_default AS id_category, + cl.name AS cat_name, + cl.link_rewrite AS l_rew, + COALESCE(vary.attributes, JSON_OBJECT()) AS attr, + COALESCE(feat.features, JSON_OBJECT()) AS feat, + img.id_image, + cat.category_ids, + (SELECT COUNT(*) FROM ps_product_attribute_shop pas2 WHERE pas2.id_product = ps.id_product AND pas2.id_shop = ?) AS variations + `, constdata.SHOP_ID). + Joins("JOIN ps_product p ON p.id_product = ps.id_product"). + Joins("JOIN ps_product_lang pl ON pl.id_product = ps.id_product AND pl.id_shop = ? AND pl.id_lang = ?", constdata.SHOP_ID, id_lang). + Joins("JOIN ps_category_lang cl ON cl.id_category = ps.id_category_default AND cl.id_shop = ? AND cl.id_lang = ?", constdata.SHOP_ID, id_lang). + Joins("LEFT JOIN variations vary ON vary.id_product = ps.id_product"). + Joins("LEFT JOIN features feat ON feat.id_product = ps.id_product"). + Joins("LEFT JOIN images img ON img.id_product = ps.id_product"). + Joins("LEFT JOIN categories cat ON cat.id_product = ps.id_product"). + Joins("JOIN products_page pp ON pp.id_product = ps.id_product"). + Where("ps.active = ?", 1). + Order("ps.id_product"). + Clauses(exclause.With{CTEs: []exclause.CTE{ + { + Name: "products_page", + Subquery: exclause.Subquery{ + DB: db.Get(). + Model(&dbmodel.PsProductShop{}). + Select("id_product, price"). + Where("id_shop = ? AND active = 1", constdata.SHOP_ID). + Order("id_product"). + Limit(limit). + Offset(offset), + }, + }, + { + Name: "variation_attributes", + Subquery: exclause.Subquery{ + DB: db.Get(). + Table("ps_product_attribute_shop pas"). // <- explicit alias here + Select(` + pas.id_product, + pag.id_attribute_group AS attribute_name, + JSON_ARRAYAGG(DISTINCT pa.id_attribute) AS attribute_values + `). + Joins("JOIN ps_product_attribute_combination ppac ON ppac.id_product_attribute = pas.id_product_attribute"). + Joins("JOIN ps_attribute pa ON pa.id_attribute = ppac.id_attribute"). + Joins("JOIN ps_attribute_group pag ON pag.id_attribute_group = pa.id_attribute_group"). + Where("pas.id_shop = ?", constdata.SHOP_ID). + Group("pas.id_product, pag.id_attribute_group"), + }, + }, + { + Name: "variations", + Subquery: exclause.Subquery{ + DB: db.Get(). + Table("variation_attributes"). + Select("id_product, JSON_OBJECTAGG(attribute_name, attribute_values) AS attributes"). + Group("id_product"), + }, + }, + { + Name: "features", + Subquery: exclause.Subquery{ + DB: db.Get(). + Table("ps_feature_product pfp"). // <- explicit alias + Select("pfp.id_product, JSON_OBJECTAGG(pfp.id_feature, pfp.id_feature_value) AS features"). + Group("pfp.id_product"), + }, + }, + { + Name: "images", + Subquery: exclause.Subquery{ + DB: db.Get(). + Model(&dbmodel.PsImageShop{}). + Select("id_product, id_image"). + Where("id_shop = ? AND cover = 1", constdata.SHOP_ID), + }, + }, + { + Name: "categories", + Subquery: exclause.Subquery{ + DB: db.Get(). + Model(&dbmodel.PsCategoryProduct{}). + Select("id_product, JSON_ARRAYAGG(id_category) AS category_ids"). + Group("id_product"), + }, + }, + }}).Find(&products).Error + + return products, err +} diff --git a/app/service/meiliService/meiliService.go b/app/service/meiliService/meiliService.go index 6d9120a..41e9b8f 100644 --- a/app/service/meiliService/meiliService.go +++ b/app/service/meiliService/meiliService.go @@ -6,7 +6,7 @@ import ( "git.ma-al.com/goc_daniel/b2b/app/config" "git.ma-al.com/goc_daniel/b2b/app/model" - "git.ma-al.com/goc_daniel/b2b/app/repos/productDescriptionRepo" + searchrepo "git.ma-al.com/goc_daniel/b2b/app/repos/searchRepo" constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data" "github.com/meilisearch/meilisearch-go" ) @@ -20,8 +20,8 @@ type MeiliIndexSettings struct { } type MeiliService struct { - productDescriptionRepo productDescriptionRepo.UIProductDescriptionRepo - meiliClient meilisearch.ServiceManager + searchRepo searchrepo.UISearchRepo + meiliClient meilisearch.ServiceManager } func New() *MeiliService { @@ -32,8 +32,8 @@ func New() *MeiliService { ) return &MeiliService{ - meiliClient: client, - productDescriptionRepo: productDescriptionRepo.New(), + meiliClient: client, + searchRepo: searchrepo.New(), } } @@ -50,7 +50,7 @@ func (s *MeiliService) CreateIndex(id_lang uint) error { for { // Get batch of products from repo (includes scanning) - products, err := s.productDescriptionRepo.GetMeiliProducts(id_lang, offset, batchSize) + products, err := s.searchRepo.GetMeiliProducts(id_lang, offset, batchSize) if err != nil { return fmt.Errorf("failed to get products batch at offset %d: %w", offset, err) } diff --git a/app/utils/localeExtractor/localeExtractor.go b/app/utils/localeExtractor/localeExtractor.go index 37bdb0a..7dcd0cc 100644 --- a/app/utils/localeExtractor/localeExtractor.go +++ b/app/utils/localeExtractor/localeExtractor.go @@ -22,14 +22,6 @@ func GetUserID(c fiber.Ctx) (uint, bool) { return user_locale.User.ID, true } -func GetOriginalUserRole(c fiber.Ctx) (model.Role, bool) { - user_locale, ok := c.Locals(constdata.USER_LOCALE).(*model.UserLocale) - if !ok || user_locale.OriginalUser == nil || user_locale.OriginalUser.Role == nil { - return model.Role{}, false - } - return *user_locale.OriginalUser.Role, true -} - func GetCustomer(c fiber.Ctx) (*model.Customer, bool) { user_locale, ok := c.Locals(constdata.USER_LOCALE).(*model.UserLocale) if !ok || user_locale.User == nil { diff --git a/i18n/migrations/20260302163123_create_tables_data.sql b/i18n/migrations/20260302163123_create_tables_data.sql index bb7fde3..5f7a634 100644 --- a/i18n/migrations/20260302163123_create_tables_data.sql +++ b/i18n/migrations/20260302163123_create_tables_data.sql @@ -35,15 +35,27 @@ INSERT INTO `b2b_permissions` (`id`, `name`) VALUES ('2', 'user.write.any'); INSERT INTO `b2b_permissions` (`id`, `name`) VALUES ('3', 'user.delete.any'); INSERT INTO `b2b_permissions` (`id`, `name`) VALUES ('4', 'currency.write'); INSERT INTO `b2b_permissions` (`id`, `name`) VALUES ('5', 'specific_price.manage'); +INSERT INTO `b2b_permissions` (`id`, `name`) VALUES ('6', 'webdav.create_token'); +INSERT INTO `b2b_permissions` (`id`, `name`) VALUES ('7', 'product_translation.save'); +INSERT INTO `b2b_permissions` (`id`, `name`) VALUES ('8', 'product_translation.translate'); +INSERT INTO `b2b_permissions` (`id`, `name`) VALUES ('9', 'search.create_index'); INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('2', '1'); INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('2', '2'); INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('2', '3'); INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('2', '4'); INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('2', '5'); +INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('2', '6'); +INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('2', '7'); +INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('2', '8'); +INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('2', '9'); INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('3', '1'); INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('3', '2'); INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('3', '3'); INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('3', '4'); INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('3', '5'); +INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('3', '6'); +INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('3', '7'); +INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('3', '8'); +INSERT INTO `b2b_role_permissions` (`role_id`, `permission_id`) VALUES ('3', '9'); -- +goose Down \ No newline at end of file