feat: add protobuf message compression and decompression for Redis; refactor product fetching logic

This commit is contained in:
2025-08-17 06:16:15 +03:00
parent 38acc4a443
commit abbcc0a81a
1396 changed files with 609 additions and 451436 deletions

View File

@@ -2,9 +2,9 @@ package ym
import (
"errors"
"git.denco.store/fakz9/yandex-go-client"
"net/http"
"sipro-mps/internal/marketplace"
"sipro-mps/pkg/api/yandex/ymclient"
"strings"
"github.com/tidwall/gjson"

View File

@@ -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 {

View File

@@ -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

View File

@@ -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...)
}
}