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