feat: add protobuf message compression and decompression for Redis; refactor product fetching logic
This commit is contained in:
		@@ -1,8 +1,8 @@
 | 
			
		||||
package mapping
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"git.denco.store/fakz9/yandex-go-client"
 | 
			
		||||
	proto "sipro-mps/api/generated/v1/yandexmarket/products"
 | 
			
		||||
	"sipro-mps/pkg/api/yandex/ymclient"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
//go:generate go run github.com/jmattheis/goverter/cmd/goverter gen .
 | 
			
		||||
@@ -12,6 +12,7 @@ import (
 | 
			
		||||
// goverter:output:package generated
 | 
			
		||||
// goverter:ignoreUnexported yes
 | 
			
		||||
// goverter:matchIgnoreCase yes
 | 
			
		||||
// goverter:ignoreMissing yes
 | 
			
		||||
// goverter:useZeroValueOnPointerInconsistency yes
 | 
			
		||||
// goverter:extend Int64ToFloat32 Int64ToInt32 Float32ToInt64 Int32ToInt64 PointerInt32ToInt64
 | 
			
		||||
type Converter interface {
 | 
			
		||||
 
 | 
			
		||||
@@ -4,17 +4,17 @@
 | 
			
		||||
package generated
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	yandexgoclient "git.denco.store/fakz9/yandex-go-client"
 | 
			
		||||
	products "sipro-mps/api/generated/v1/yandexmarket/products"
 | 
			
		||||
	mapping "sipro-mps/internal/ym/products/mapping"
 | 
			
		||||
	ymclient "sipro-mps/pkg/api/yandex/ymclient"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type ConverterImpl struct{}
 | 
			
		||||
 | 
			
		||||
func (c *ConverterImpl) ProtoOfferToYmOffer(source *products.CalculateProductTariffsRequest_Offers) *ymclient.CalculateTariffsOfferDTO {
 | 
			
		||||
	var pYmclientCalculateTariffsOfferDTO *ymclient.CalculateTariffsOfferDTO
 | 
			
		||||
func (c *ConverterImpl) ProtoOfferToYmOffer(source *products.CalculateProductTariffsRequest_Offers) *yandexgoclient.CalculateTariffsOfferDTO {
 | 
			
		||||
	var pYmclientCalculateTariffsOfferDTO *yandexgoclient.CalculateTariffsOfferDTO
 | 
			
		||||
	if source != nil {
 | 
			
		||||
		var ymclientCalculateTariffsOfferDTO ymclient.CalculateTariffsOfferDTO
 | 
			
		||||
		var ymclientCalculateTariffsOfferDTO yandexgoclient.CalculateTariffsOfferDTO
 | 
			
		||||
		ymclientCalculateTariffsOfferDTO.CategoryId = (*source).CategoryId
 | 
			
		||||
		ymclientCalculateTariffsOfferDTO.Price = mapping.Int64ToFloat32((*source).Price)
 | 
			
		||||
		ymclientCalculateTariffsOfferDTO.Length = mapping.Int64ToFloat32((*source).Length)
 | 
			
		||||
@@ -27,23 +27,23 @@ func (c *ConverterImpl) ProtoOfferToYmOffer(source *products.CalculateProductTar
 | 
			
		||||
	}
 | 
			
		||||
	return pYmclientCalculateTariffsOfferDTO
 | 
			
		||||
}
 | 
			
		||||
func (c *ConverterImpl) ProtoParametersToYmParameters(source *products.CalculateProductTariffsRequest_Parameters) *ymclient.CalculateTariffsParametersDTO {
 | 
			
		||||
	var pYmclientCalculateTariffsParametersDTO *ymclient.CalculateTariffsParametersDTO
 | 
			
		||||
func (c *ConverterImpl) ProtoParametersToYmParameters(source *products.CalculateProductTariffsRequest_Parameters) *yandexgoclient.CalculateTariffsParametersDTO {
 | 
			
		||||
	var pYmclientCalculateTariffsParametersDTO *yandexgoclient.CalculateTariffsParametersDTO
 | 
			
		||||
	if source != nil {
 | 
			
		||||
		var ymclientCalculateTariffsParametersDTO ymclient.CalculateTariffsParametersDTO
 | 
			
		||||
		var ymclientCalculateTariffsParametersDTO yandexgoclient.CalculateTariffsParametersDTO
 | 
			
		||||
		pInt64 := (*source).CampaignId
 | 
			
		||||
		ymclientCalculateTariffsParametersDTO.CampaignId = &pInt64
 | 
			
		||||
		pYmclientSellingProgramType := ymclient.SellingProgramType((*source).SellingProgram)
 | 
			
		||||
		pYmclientSellingProgramType := yandexgoclient.SellingProgramType((*source).SellingProgram)
 | 
			
		||||
		ymclientCalculateTariffsParametersDTO.SellingProgram = &pYmclientSellingProgramType
 | 
			
		||||
		pYmclientPaymentFrequencyType := ymclient.PaymentFrequencyType((*source).Frequency)
 | 
			
		||||
		pYmclientPaymentFrequencyType := yandexgoclient.PaymentFrequencyType((*source).Frequency)
 | 
			
		||||
		ymclientCalculateTariffsParametersDTO.Frequency = &pYmclientPaymentFrequencyType
 | 
			
		||||
		pYmclientCurrencyType := ymclient.CurrencyType((*source).Currency)
 | 
			
		||||
		pYmclientCurrencyType := yandexgoclient.CurrencyType((*source).Currency)
 | 
			
		||||
		ymclientCalculateTariffsParametersDTO.Currency = &pYmclientCurrencyType
 | 
			
		||||
		pYmclientCalculateTariffsParametersDTO = &ymclientCalculateTariffsParametersDTO
 | 
			
		||||
	}
 | 
			
		||||
	return pYmclientCalculateTariffsParametersDTO
 | 
			
		||||
}
 | 
			
		||||
func (c *ConverterImpl) YmOfferToProtoOffer(source *ymclient.GetOfferDTO) *products.GetProductsResponse_Offer {
 | 
			
		||||
func (c *ConverterImpl) YmOfferToProtoOffer(source *yandexgoclient.GetOfferDTO) *products.GetProductsResponse_Offer {
 | 
			
		||||
	var pProductsGetProductsResponse_Offer *products.GetProductsResponse_Offer
 | 
			
		||||
	if source != nil {
 | 
			
		||||
		var productsGetProductsResponse_Offer products.GetProductsResponse_Offer
 | 
			
		||||
@@ -57,7 +57,7 @@ func (c *ConverterImpl) YmOfferToProtoOffer(source *ymclient.GetOfferDTO) *produ
 | 
			
		||||
	}
 | 
			
		||||
	return pProductsGetProductsResponse_Offer
 | 
			
		||||
}
 | 
			
		||||
func (c *ConverterImpl) YmOfferToProtoResponseOffer(source *ymclient.CalculateTariffsOfferInfoDTO) *products.CalculateProductTariffsResponse_Offers {
 | 
			
		||||
func (c *ConverterImpl) YmOfferToProtoResponseOffer(source *yandexgoclient.CalculateTariffsOfferInfoDTO) *products.CalculateProductTariffsResponse_Offers {
 | 
			
		||||
	var pProductsCalculateProductTariffsResponse_Offers *products.CalculateProductTariffsResponse_Offers
 | 
			
		||||
	if source != nil {
 | 
			
		||||
		var productsCalculateProductTariffsResponse_Offers products.CalculateProductTariffsResponse_Offers
 | 
			
		||||
@@ -72,7 +72,7 @@ func (c *ConverterImpl) YmOfferToProtoResponseOffer(source *ymclient.CalculateTa
 | 
			
		||||
	}
 | 
			
		||||
	return pProductsCalculateProductTariffsResponse_Offers
 | 
			
		||||
}
 | 
			
		||||
func (c *ConverterImpl) YmTariffToProtoTariff(source *ymclient.CalculatedTariffDTO) *products.CalculateProductTariffsResponse_Tariff {
 | 
			
		||||
func (c *ConverterImpl) YmTariffToProtoTariff(source *yandexgoclient.CalculatedTariffDTO) *products.CalculateProductTariffsResponse_Tariff {
 | 
			
		||||
	var pProductsCalculateProductTariffsResponse_Tariff *products.CalculateProductTariffsResponse_Tariff
 | 
			
		||||
	if source != nil {
 | 
			
		||||
		var productsCalculateProductTariffsResponse_Tariff products.CalculateProductTariffsResponse_Tariff
 | 
			
		||||
@@ -93,7 +93,7 @@ func (c *ConverterImpl) YmTariffToProtoTariff(source *ymclient.CalculatedTariffD
 | 
			
		||||
	}
 | 
			
		||||
	return pProductsCalculateProductTariffsResponse_Tariff
 | 
			
		||||
}
 | 
			
		||||
func (c *ConverterImpl) pYmclientGetPriceWithDiscountDTOToPProductsGetProductsResponse_Offer_BasicPrice(source *ymclient.GetPriceWithDiscountDTO) *products.GetProductsResponse_Offer_BasicPrice {
 | 
			
		||||
func (c *ConverterImpl) pYmclientGetPriceWithDiscountDTOToPProductsGetProductsResponse_Offer_BasicPrice(source *yandexgoclient.GetPriceWithDiscountDTO) *products.GetProductsResponse_Offer_BasicPrice {
 | 
			
		||||
	var pProductsGetProductsResponse_Offer_BasicPrice *products.GetProductsResponse_Offer_BasicPrice
 | 
			
		||||
	if source != nil {
 | 
			
		||||
		var productsGetProductsResponse_Offer_BasicPrice products.GetProductsResponse_Offer_BasicPrice
 | 
			
		||||
@@ -102,7 +102,7 @@ func (c *ConverterImpl) pYmclientGetPriceWithDiscountDTOToPProductsGetProductsRe
 | 
			
		||||
	}
 | 
			
		||||
	return pProductsGetProductsResponse_Offer_BasicPrice
 | 
			
		||||
}
 | 
			
		||||
func (c *ConverterImpl) pYmclientOfferWeightDimensionsDTOToPProductsGetProductsResponse_Offer_WeightDimensions(source *ymclient.OfferWeightDimensionsDTO) *products.GetProductsResponse_Offer_WeightDimensions {
 | 
			
		||||
func (c *ConverterImpl) pYmclientOfferWeightDimensionsDTOToPProductsGetProductsResponse_Offer_WeightDimensions(source *yandexgoclient.OfferWeightDimensionsDTO) *products.GetProductsResponse_Offer_WeightDimensions {
 | 
			
		||||
	var pProductsGetProductsResponse_Offer_WeightDimensions *products.GetProductsResponse_Offer_WeightDimensions
 | 
			
		||||
	if source != nil {
 | 
			
		||||
		var productsGetProductsResponse_Offer_WeightDimensions products.GetProductsResponse_Offer_WeightDimensions
 | 
			
		||||
@@ -114,7 +114,7 @@ func (c *ConverterImpl) pYmclientOfferWeightDimensionsDTOToPProductsGetProductsR
 | 
			
		||||
	}
 | 
			
		||||
	return pProductsGetProductsResponse_Offer_WeightDimensions
 | 
			
		||||
}
 | 
			
		||||
func (c *ConverterImpl) ymclientCalculateTariffsOfferDTOToPProductsCalculateProductTariffsResponse_Offer(source ymclient.CalculateTariffsOfferDTO) *products.CalculateProductTariffsResponse_Offer {
 | 
			
		||||
func (c *ConverterImpl) ymclientCalculateTariffsOfferDTOToPProductsCalculateProductTariffsResponse_Offer(source yandexgoclient.CalculateTariffsOfferDTO) *products.CalculateProductTariffsResponse_Offer {
 | 
			
		||||
	var productsCalculateProductTariffsResponse_Offer products.CalculateProductTariffsResponse_Offer
 | 
			
		||||
	productsCalculateProductTariffsResponse_Offer.CategoryId = source.CategoryId
 | 
			
		||||
	productsCalculateProductTariffsResponse_Offer.Price = mapping.Float32ToInt64(source.Price)
 | 
			
		||||
@@ -127,7 +127,7 @@ func (c *ConverterImpl) ymclientCalculateTariffsOfferDTOToPProductsCalculateProd
 | 
			
		||||
	}
 | 
			
		||||
	return &productsCalculateProductTariffsResponse_Offer
 | 
			
		||||
}
 | 
			
		||||
func (c *ConverterImpl) ymclientCalculatedTariffDTOToPProductsCalculateProductTariffsResponse_Tariff(source ymclient.CalculatedTariffDTO) *products.CalculateProductTariffsResponse_Tariff {
 | 
			
		||||
func (c *ConverterImpl) ymclientCalculatedTariffDTOToPProductsCalculateProductTariffsResponse_Tariff(source yandexgoclient.CalculatedTariffDTO) *products.CalculateProductTariffsResponse_Tariff {
 | 
			
		||||
	var productsCalculateProductTariffsResponse_Tariff products.CalculateProductTariffsResponse_Tariff
 | 
			
		||||
	productsCalculateProductTariffsResponse_Tariff.Type = string(source.Type)
 | 
			
		||||
	if source.Amount != nil {
 | 
			
		||||
@@ -144,7 +144,7 @@ func (c *ConverterImpl) ymclientCalculatedTariffDTOToPProductsCalculateProductTa
 | 
			
		||||
	}
 | 
			
		||||
	return &productsCalculateProductTariffsResponse_Tariff
 | 
			
		||||
}
 | 
			
		||||
func (c *ConverterImpl) ymclientTariffParameterDTOToPProductsCalculateProductTariffsResponse_Parameter(source ymclient.TariffParameterDTO) *products.CalculateProductTariffsResponse_Parameter {
 | 
			
		||||
func (c *ConverterImpl) ymclientTariffParameterDTOToPProductsCalculateProductTariffsResponse_Parameter(source yandexgoclient.TariffParameterDTO) *products.CalculateProductTariffsResponse_Parameter {
 | 
			
		||||
	var productsCalculateProductTariffsResponse_Parameter products.CalculateProductTariffsResponse_Parameter
 | 
			
		||||
	productsCalculateProductTariffsResponse_Parameter.Name = source.Name
 | 
			
		||||
	productsCalculateProductTariffsResponse_Parameter.Value = source.Value
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"math"
 | 
			
		||||
	"sipro-mps/internal/redis"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
@@ -11,8 +12,8 @@ import (
 | 
			
		||||
	"sipro-mps/internal/marketplace"
 | 
			
		||||
	"sipro-mps/internal/ym"
 | 
			
		||||
	"sipro-mps/internal/ym/products/mapping/generated"
 | 
			
		||||
	"sipro-mps/pkg/api/yandex/ymclient"
 | 
			
		||||
 | 
			
		||||
	"git.denco.store/fakz9/yandex-go-client"
 | 
			
		||||
	"github.com/samber/lo"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -100,9 +101,25 @@ func (r *apiRepository) GetProducts(ctx context.Context, marketplaceID int, req
 | 
			
		||||
		errChan <- err
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	key := fmt.Sprintf("ym:products:%d", businessID)
 | 
			
		||||
	var cachedMessage pb.GetProductsResponse
 | 
			
		||||
	err = redis.ReadProtoMessage(ctx, key, &cachedMessage)
 | 
			
		||||
	if err == nil && len(cachedMessage.Offers) > 0 {
 | 
			
		||||
		resultChan <- cachedMessage.Offers
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	r.setOfferMappingsRateLimit(businessID)
 | 
			
		||||
 | 
			
		||||
	// all offers
 | 
			
		||||
	var allOffers []*pb.GetProductsResponse_Offer
 | 
			
		||||
	defer func() {
 | 
			
		||||
		if len(allOffers) == 0 {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		message := pb.GetProductsResponse{
 | 
			
		||||
			Offers: allOffers,
 | 
			
		||||
		}
 | 
			
		||||
		_ = redis.WriteProtoMessage(ctx, key, &message)
 | 
			
		||||
	}()
 | 
			
		||||
	for _, chunk := range lo.Chunk(req.OfferIds, defaultChunkSize) {
 | 
			
		||||
		offers, err := r.fetchOfferMappings(ctx, client, businessID, chunk)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
@@ -110,6 +127,7 @@ func (r *apiRepository) GetProducts(ctx context.Context, marketplaceID int, req
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		resultChan <- offers
 | 
			
		||||
		allOffers = append(allOffers, offers...)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user