48 lines
1.2 KiB
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
|
|
}
|