MIF_E31222379_BE/internal/services/cart_redis.go

74 lines
1.6 KiB
Go

package services
import (
"context"
"encoding/json"
"fmt"
"time"
"rijig/config"
"rijig/dto"
"github.com/go-redis/redis/v8"
)
const CartTTL = 30 * time.Minute
const CartKeyPrefix = "cart:"
func buildCartKey(userID string) string {
return fmt.Sprintf("%s%s", CartKeyPrefix, userID)
}
func SetCartToRedis(ctx context.Context, userID string, cart dto.RequestCartDTO) error {
data, err := json.Marshal(cart)
if err != nil {
return err
}
return config.RedisClient.Set(ctx, buildCartKey(userID), data, CartTTL).Err()
}
func RefreshCartTTL(ctx context.Context, userID string) error {
return config.RedisClient.Expire(ctx, buildCartKey(userID), CartTTL).Err()
}
func GetCartFromRedis(ctx context.Context, userID string) (*dto.RequestCartDTO, error) {
val, err := config.RedisClient.Get(ctx, buildCartKey(userID)).Result()
if err == redis.Nil {
return nil, nil
} else if err != nil {
return nil, err
}
var cart dto.RequestCartDTO
if err := json.Unmarshal([]byte(val), &cart); err != nil {
return nil, err
}
return &cart, nil
}
func DeleteCartFromRedis(ctx context.Context, userID string) error {
return config.RedisClient.Del(ctx, buildCartKey(userID)).Err()
}
func GetExpiringCartKeys(ctx context.Context, threshold time.Duration) ([]string, error) {
keys, err := config.RedisClient.Keys(ctx, CartKeyPrefix+"*").Result()
if err != nil {
return nil, err
}
var expiringKeys []string
for _, key := range keys {
ttl, err := config.RedisClient.TTL(ctx, key).Result()
if err != nil {
continue
}
if ttl > 0 && ttl <= threshold {
expiringKeys = append(expiringKeys, key)
}
}
return expiringKeys, nil
}