feat: shit shit
This commit is contained in:
		@@ -2,20 +2,16 @@ package products
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/go-faster/errors"
 | 
			
		||||
	"github.com/redis/rueidis"
 | 
			
		||||
	"github.com/samber/lo"
 | 
			
		||||
	pb "sipro-mps/api/generated/v1/wb/products"
 | 
			
		||||
	"sipro-mps/internal/marketplace"
 | 
			
		||||
	"sipro-mps/internal/redis"
 | 
			
		||||
	"sipro-mps/internal/tasks/client"
 | 
			
		||||
	"sipro-mps/internal/tasks/types"
 | 
			
		||||
	"sipro-mps/internal/wb"
 | 
			
		||||
	"sipro-mps/internal/wb/products/mapping/generated"
 | 
			
		||||
	wbapi "sipro-mps/pkg/api/wb/client"
 | 
			
		||||
	"sipro-mps/pkg/utils"
 | 
			
		||||
 | 
			
		||||
	"github.com/deliveryhero/pipeline/v2"
 | 
			
		||||
	"github.com/samber/lo"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
@@ -97,79 +93,99 @@ func fetchProducts(
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (a apiRepository) StreamAllProductsCache(ctx context.Context, marketplaceId int, resultChan chan<- []pb.Product, errChan chan<- error) {
 | 
			
		||||
	defer close(resultChan)
 | 
			
		||||
	defer close(errChan)
 | 
			
		||||
	_, sellerId, err := a.ParseMarketplace(ctx, marketplaceId)
 | 
			
		||||
	// DO NOT close channels here - WithCache will handle it (caller/creator owns them)
 | 
			
		||||
	mp, err := a.marketplaceRepository.GetMarketplaceByID(ctx, marketplaceId)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		errChan <- err
 | 
			
		||||
		errChan <- fmt.Errorf("getting marketplace by ID: %w", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	c := *redis.Client
 | 
			
		||||
	key := fmt.Sprintf("wb:products:%s", sellerId)
 | 
			
		||||
	jsonString, err := c.Do(ctx, c.B().Get().Key(key).Build()).ToString()
 | 
			
		||||
	if err == nil && jsonString != "null" {
 | 
			
		||||
		var result []pb.Product
 | 
			
		||||
		err = json.Unmarshal([]byte(jsonString), &result)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			errChan <- fmt.Errorf("unmarshalling products from cache: %w", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		task, err := types.NewFetchProductsTask(types.TypeWbFetchProducts, marketplaceId)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			errChan <- fmt.Errorf("creating fetch products task: %w", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		_, err = client.Client.Enqueue(task)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			errChan <- fmt.Errorf("enqueueing fetch products task: %w", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		resultChan <- result
 | 
			
		||||
	identifier, err := mp.GetIdentifier()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		errChan <- fmt.Errorf("getting marketplace identifier: %w", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if !errors.As(err, &rueidis.Nil) && err != nil {
 | 
			
		||||
		errChan <- fmt.Errorf("fetching products from cache: %w", err)
 | 
			
		||||
	client, err := wb.GetClientFromMarketplace(mp)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	converter := generated.ConverterImpl{}
 | 
			
		||||
 | 
			
		||||
	innerResultChan := make(chan []WbProduct)
 | 
			
		||||
	innerErrChan := make(chan error)
 | 
			
		||||
	go a.StreamAllProducts(ctx, marketplaceId, innerResultChan, innerErrChan)
 | 
			
		||||
	var allProducts []pb.Product
 | 
			
		||||
	defer func() {
 | 
			
		||||
		jsonData, err := json.Marshal(allProducts)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			errChan <- fmt.Errorf("marshalling products to cache: %w", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		err = c.Do(ctx, c.B().Set().Key(key).Value(string(jsonData)).Build()).Error()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			errChan <- fmt.Errorf("setting products to cache: %w", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
	for {
 | 
			
		||||
		select {
 | 
			
		||||
		case err, ok := <-innerErrChan:
 | 
			
		||||
			if !ok {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			errChan <- fmt.Errorf("streaming products: %w", err)
 | 
			
		||||
			return
 | 
			
		||||
		case products, ok := <-innerResultChan:
 | 
			
		||||
			if !ok {
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			pbProducts := lo.Map(products, func(p WbProduct, _ int) pb.Product {
 | 
			
		||||
				return *converter.ToProto(&p)
 | 
			
		||||
			})
 | 
			
		||||
			allProducts = append(allProducts, pbProducts...)
 | 
			
		||||
			resultChan <- pbProducts
 | 
			
		||||
		}
 | 
			
		||||
	transform := pipeline.NewProcessor(func(_ context.Context, products []WbProduct) ([]pb.Product, error) {
 | 
			
		||||
		return lo.Map(products, func(item WbProduct, _ int) pb.Product {
 | 
			
		||||
			return *converter.ToProto(&item)
 | 
			
		||||
		}), nil
 | 
			
		||||
	}, nil)
 | 
			
		||||
	inputChan := make(chan []WbProduct)
 | 
			
		||||
	fetchProducts(ctx, client, identifier, inputChan, nil)
 | 
			
		||||
	for out := range pipeline.Process(ctx, transform, inputChan) {
 | 
			
		||||
		resultChan <- out
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	//c := *redis.Client
 | 
			
		||||
	//key := fmt.Sprintf("wb:products:%s", sellerId)
 | 
			
		||||
	//jsonString, err := c.Do(ctx, c.B().Get().Key(key).Build()).ToString()
 | 
			
		||||
	//if err == nil && jsonString != "null" {
 | 
			
		||||
	//	var result []pb.Product
 | 
			
		||||
	//	err = json.Unmarshal([]byte(jsonString), &result)
 | 
			
		||||
	//	if err != nil {
 | 
			
		||||
	//		errChan <- fmt.Errorf("unmarshalling products from cache: %w", err)
 | 
			
		||||
	//		return
 | 
			
		||||
	//	}
 | 
			
		||||
	//	task, err := types.NewFetchProductsTask(types.TypeWbFetchProducts, marketplaceId)
 | 
			
		||||
	//	if err != nil {
 | 
			
		||||
	//		errChan <- fmt.Errorf("creating fetch products task: %w", err)
 | 
			
		||||
	//		return
 | 
			
		||||
	//	}
 | 
			
		||||
	//	_, err = client.Client.Enqueue(task)
 | 
			
		||||
	//	if err != nil {
 | 
			
		||||
	//		errChan <- fmt.Errorf("enqueueing fetch products task: %w", err)
 | 
			
		||||
	//		return
 | 
			
		||||
	//	}
 | 
			
		||||
	//
 | 
			
		||||
	//	resultChan <- result
 | 
			
		||||
	//	return
 | 
			
		||||
	//}
 | 
			
		||||
	//if !errors.As(err, &rueidis.Nil) && err != nil {
 | 
			
		||||
	//	errChan <- fmt.Errorf("fetching products from cache: %w", err)
 | 
			
		||||
	//	return
 | 
			
		||||
	//}
 | 
			
		||||
	//converter := generated.ConverterImpl{}
 | 
			
		||||
	//
 | 
			
		||||
	//innerResultChan := make(chan []WbProduct)
 | 
			
		||||
	//innerErrChan := make(chan error)
 | 
			
		||||
	//go a.StreamAllProducts(ctx, marketplaceId, innerResultChan, innerErrChan)
 | 
			
		||||
	//var allProducts []pb.Product
 | 
			
		||||
	//defer func() {
 | 
			
		||||
	//	jsonData, err := json.Marshal(allProducts)
 | 
			
		||||
	//	if err != nil {
 | 
			
		||||
	//		errChan <- fmt.Errorf("marshalling products to cache: %w", err)
 | 
			
		||||
	//		return
 | 
			
		||||
	//	}
 | 
			
		||||
	//	err = c.Do(ctx, c.B().Set().Key(key).Value(string(jsonData)).Build()).Error()
 | 
			
		||||
	//	if err != nil {
 | 
			
		||||
	//		errChan <- fmt.Errorf("setting products to cache: %w", err)
 | 
			
		||||
	//		return
 | 
			
		||||
	//	}
 | 
			
		||||
	//}()
 | 
			
		||||
	//for {
 | 
			
		||||
	//	select {
 | 
			
		||||
	//	case err, ok := <-innerErrChan:
 | 
			
		||||
	//		if !ok {
 | 
			
		||||
	//			return
 | 
			
		||||
	//		}
 | 
			
		||||
	//		errChan <- fmt.Errorf("streaming products: %w", err)
 | 
			
		||||
	//		return
 | 
			
		||||
	//	case products, ok := <-innerResultChan:
 | 
			
		||||
	//		if !ok {
 | 
			
		||||
	//			return
 | 
			
		||||
	//		}
 | 
			
		||||
	//		pbProducts := lo.Map(products, func(p WbProduct, _ int) pb.Product {
 | 
			
		||||
	//			return *converter.ToProto(&p)
 | 
			
		||||
	//		})
 | 
			
		||||
	//		allProducts = append(allProducts, pbProducts...)
 | 
			
		||||
	//		resultChan <- pbProducts
 | 
			
		||||
	//	}
 | 
			
		||||
	//}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
func (a apiRepository) GetAllProducts(ctx context.Context, marketplaceId int) ([]WbProduct, error) {
 | 
			
		||||
	marketplaceByID, sellerId, err := a.ParseMarketplace(ctx, marketplaceId)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user