From fb1be5ddc3ff036c304a339309f567d443b2af1f Mon Sep 17 00:00:00 2001 From: admin Date: Sun, 17 Aug 2025 11:46:44 +0300 Subject: [PATCH] feat: implement HashArray utility and refactor product key generation for Redis --- cmd/test/main.go | 32 +++++++++++++++++------- internal/ozon/products/repository_api.go | 6 ++++- internal/tasks/ozon/ozon.go | 2 +- internal/tasks/wb/wb.go | 2 +- internal/wb/products/repository_api.go | 6 ++++- internal/ym/products/repository_api.go | 6 ++++- 6 files changed, 40 insertions(+), 14 deletions(-) diff --git a/cmd/test/main.go b/cmd/test/main.go index b53fdfc..919efbf 100644 --- a/cmd/test/main.go +++ b/cmd/test/main.go @@ -1,8 +1,11 @@ package main -//package main +import "sipro-mps/pkg/utils" + +// package main +// +// import ( // -//import ( // "context" // "fmt" // "sipro-mps/internal/wb/products/mapping/generated" @@ -12,15 +15,26 @@ package main // "sipro-mps/pkg/api/wb/client" // // "github.com/deliveryhero/pipeline/v2" -//) // -//func main() { +// ) // -// input := "1,2,3,4,5" +// func main() { // -// for out := range pipeline.Process(context.Background(), apply, pipeline.Emit(input)) { -// for j := range out { -// fmt.Printf("process: %s\n", out[j]) +// input := "1,2,3,4,5" +// +// for out := range pipeline.Process(context.Background(), apply, pipeline.Emit(input)) { +// for j := range out { +// fmt.Printf("process: %s\n", out[j]) +// } // } // } -//} +func main() { + arr := []string{"1", "2", "3", "4", "5"} + + hash, err := utils.HashArray(arr) + + if err != nil { + panic(err) + } + println("Hash of array:", hash) +} diff --git a/internal/ozon/products/repository_api.go b/internal/ozon/products/repository_api.go index e837765..dd145f5 100644 --- a/internal/ozon/products/repository_api.go +++ b/internal/ozon/products/repository_api.go @@ -22,6 +22,10 @@ type apiRepository struct { marketplaceRepository marketplace.Repository } +func GetProductsKey(identifier string) string { + return fmt.Sprintf("ozon:products:%s", identifier) +} + func NewAPIRepository(marketplaceRepository marketplace.Repository) Repository { return &apiRepository{ marketplaceRepository: marketplaceRepository, @@ -136,7 +140,7 @@ func (a *apiRepository) StreamAllProductsCache(ctx context.Context, marketplaceI errChan <- fmt.Errorf("getting marketplace identifier: %w", err) return } - key := fmt.Sprintf("ozon:products:%s", identifier) + key := GetProductsKey(identifier) var cachedMessage pb.GetListOfProductsResponse err = redis.ReadProtoMessage(ctx, key, &cachedMessage) if err == nil && len(cachedMessage.Products) > 0 { diff --git a/internal/tasks/ozon/ozon.go b/internal/tasks/ozon/ozon.go index d002524..d31a02e 100644 --- a/internal/tasks/ozon/ozon.go +++ b/internal/tasks/ozon/ozon.go @@ -53,7 +53,7 @@ func (p *FetchProductsProcessor) ProcessTask(ctx context.Context, task *asynq.Ta productsProto := lo.Map(productsRaw, func(item products.OzonProduct, _ int) *products.PbProduct { return converter.ToProto(&item) }) - redisKey := fmt.Sprintf("ozon:products:%s", identifier) + redisKey := products.GetProductsKey(identifier) err = redis.WriteProtoMessage(ctx, redisKey, &pb.GetListOfProductsResponse{Products: productsProto}) if err != nil { fmt.Printf("Failed to write products to Redis for marketplace %s: %v\n", identifier, err) diff --git a/internal/tasks/wb/wb.go b/internal/tasks/wb/wb.go index 79670a7..f8972a1 100644 --- a/internal/tasks/wb/wb.go +++ b/internal/tasks/wb/wb.go @@ -46,7 +46,7 @@ func (p *FetchProductsProcessor) ProcessTask(ctx context.Context, task *asynq.Ta defer cancel() - redisKey := fmt.Sprintf("wb:products:%s", sellerId) + redisKey := products.GetProductsKey(sellerId) productsRaw, err := repo.GetAllProducts(ctx, payload.MarketplaceId) if err != nil { return fmt.Errorf("failed to fetch products for marketplace %d: %w", payload.MarketplaceId, err) diff --git a/internal/wb/products/repository_api.go b/internal/wb/products/repository_api.go index a44b7a3..9e87a90 100644 --- a/internal/wb/products/repository_api.go +++ b/internal/wb/products/repository_api.go @@ -25,6 +25,10 @@ type apiRepository struct { marketplaceRepository marketplace.Repository } +func GetProductsKey(identifier string) string { + return fmt.Sprintf("wb:products:%s", identifier) +} + func (a apiRepository) ParseMarketplace(ctx context.Context, marketplaceId int) (*marketplace.Marketplace, string, error) { marketplaceByID, err := a.marketplaceRepository.GetMarketplaceByID(ctx, marketplaceId) if err != nil { @@ -110,7 +114,7 @@ func (a apiRepository) StreamAllProductsCache(ctx context.Context, marketplaceId converter := generated.ConverterImpl{} - key := fmt.Sprintf("wb:products:%s", identifier) + key := GetProductsKey(identifier) var cachedMessage pb.GetProductsResponse err = redis.ReadProtoMessage(ctx, key, &cachedMessage) if err == nil && len(cachedMessage.Products) > 0 { diff --git a/internal/ym/products/repository_api.go b/internal/ym/products/repository_api.go index faad7b0..057c323 100644 --- a/internal/ym/products/repository_api.go +++ b/internal/ym/products/repository_api.go @@ -39,6 +39,10 @@ func NewAPIRepository(marketplaceRepository marketplace.Repository) Repository { } } +func GetProductKey(identifier string) string { + return fmt.Sprintf("ym:products:%s", identifier) +} + // getBusinessID retrieves the business ID for a given marketplace by looking up the campaign func (r *apiRepository) getBusinessID(ctx context.Context, mp *marketplace.Marketplace) (int64, error) { if mp.CampaignID == "" { @@ -101,7 +105,7 @@ func (r *apiRepository) GetProducts(ctx context.Context, marketplaceID int, req errChan <- err return } - key := fmt.Sprintf("ym:products:%d", businessID) + key := GetProductKey(strconv.Itoa(int(businessID))) var cachedMessage pb.GetProductsResponse err = redis.ReadProtoMessage(ctx, key, &cachedMessage) if err == nil && len(cachedMessage.Offers) > 0 {