chat_back_go/internal/service/cache.go

48 lines
1.2 KiB
Go

package service
import (
"context"
"encoding"
"errors"
"github.com/redis/go-redis/v9"
"time"
"git.urec56.ru/urec/chat_back_go/internal/domain"
"git.urec56.ru/urec/chat_back_go/internal/logger"
)
type cacheService struct {
l *logger.Logger
r redis.UniversalClient
}
func newCacheService(r redis.UniversalClient, l *logger.Logger) *cacheService {
return &cacheService{r: r, l: l}
}
func (c *cacheService) Get(key string, v encoding.BinaryUnmarshaler) error {
return c.GetCtx(context.Background(), key, v)
}
func (c *cacheService) GetCtx(ctx context.Context, key string, v encoding.BinaryUnmarshaler) error {
err := c.r.Get(ctx, key).Scan(v)
if err != nil {
if errors.Is(err, redis.Nil) {
return domain.NoKeyFoundError
}
c.l.Errorf("getting key %s: %s", key, err.Error())
return domain.InternalServerError
}
return nil
}
func (c *cacheService) Set(key string, v encoding.BinaryMarshaler, ex time.Duration) error {
return c.SetCtx(context.Background(), key, v, ex)
}
func (c *cacheService) SetCtx(ctx context.Context, key string, v encoding.BinaryMarshaler, ex time.Duration) error {
if err := c.r.SetEx(ctx, key, v, ex).Err(); err != nil {
return err
}
return nil
}