amocrm/internal/repository/redis_repo.go
2025-02-27 16:30:52 +03:00

140 lines
3.2 KiB
Go

package repository
import (
"context"
"encoding/json"
"fmt"
"gitea.pena/SQuiz/amocrm/internal/models"
"github.com/go-redis/redis/v8"
"go.uber.org/zap"
"strconv"
"sync"
)
type Repository struct {
redisClient *redis.Client
logger *zap.Logger
}
type Deps struct {
RedisClient *redis.Client
Logger *zap.Logger
}
func NewRepository(deps Deps) *Repository {
return &Repository{
redisClient: deps.RedisClient,
logger: deps.Logger,
}
}
func (r *Repository) CachingDealToRedis(ctx context.Context, deps models.SaveDeal) error {
key := "deal:" + strconv.FormatInt(deps.AnswerID, 10) + ":" + strconv.Itoa(int(deps.DealID))
valueJson, err := json.Marshal(deps)
if err != nil {
return err
}
err = r.redisClient.Set(ctx, key, valueJson, 0).Err()
if err != nil {
return err
}
return nil
}
func (r *Repository) CachingLeadFieldsToRedis(ctx context.Context, answerID int64, leadFields []models.FieldsValues) error {
key := strconv.FormatInt(answerID, 10)
leadFieldsJson, err := json.Marshal(leadFields)
if err != nil {
return err
}
err = r.redisClient.Set(ctx, key, leadFieldsJson, 0).Err()
if err != nil {
return err
}
return nil
}
func (r *Repository) FetchingDeals(ctx context.Context) (map[string][]models.MappingDealsData, map[int32]models.ForRestoringData, error) {
keys, err := r.redisClient.Keys(ctx, "deal:*").Result()
if err != nil {
r.logger.Error("error fetching keys from Redis", zap.Error(err))
return nil, nil, err
}
var (
mu sync.Mutex
dealsDataForUpdate = make(map[string][]models.MappingDealsData)
forRestoringMap = make(map[int32]models.ForRestoringData)
wg sync.WaitGroup
)
wg.Add(len(keys))
for _, key := range keys {
go func(key string) {
defer wg.Done()
saveDealJSON, err := r.redisClient.GetDel(ctx, key).Result()
if err != nil {
r.logger.Error("error getting saveDeal JSON from Redis", zap.Error(err))
return
}
var saveDeal models.SaveDeal
err = json.Unmarshal([]byte(saveDealJSON), &saveDeal)
if err != nil {
r.logger.Error("error unmarshal saveDeal JSON", zap.Error(err))
return
}
answerIDStr := strconv.FormatInt(saveDeal.AnswerID, 10)
leadFieldsJSON, err := r.redisClient.GetDel(ctx, answerIDStr).Result()
if err != nil {
r.logger.Error("error getting leadFields JSON from Redis", zap.Error(err))
return
}
var leadFields []models.FieldsValues
err = json.Unmarshal([]byte(leadFieldsJSON), &leadFields)
if err != nil {
r.logger.Error("error unmarshal leadFields JSON", zap.Error(err))
return
}
fmt.Println("CUSTOM ENCODER", leadFields)
mu.Lock()
defer mu.Unlock()
dealsDataForUpdate[saveDeal.AccessToken] = append(dealsDataForUpdate[saveDeal.AccessToken], models.MappingDealsData{
AnswerID: saveDeal.AnswerID,
DealID: saveDeal.DealID,
LeadFields: leadFields,
SubDomain: saveDeal.SubDomain,
})
forRestoringMap[saveDeal.DealID] = models.ForRestoringData{
SaveDeal: saveDeal,
LeadFields: leadFields,
}
}(key)
}
wg.Wait()
return dealsDataForUpdate, forRestoringMap, nil
}
func (r *Repository) Close(_ context.Context) error {
err := r.redisClient.Close()
if err != nil {
return err
}
return nil
}