Files
secunda_test/internal/cache/redis.go
T
2026-06-22 14:31:01 +05:00

61 lines
1.4 KiB
Go

package cache
import (
"context"
"crypto/sha1"
"encoding/hex"
"encoding/json"
"fmt"
"time"
"github.com/redis/go-redis/v9"
"secunda-test/internal/domain"
)
type TaskCache struct {
client *redis.Client
ttl time.Duration
}
func NewTaskCache(client *redis.Client, ttl time.Duration) *TaskCache {
return &TaskCache{client: client, ttl: ttl}
}
func (c *TaskCache) GetTasks(ctx context.Context, filter domain.TaskFilter) ([]domain.Task, bool, error) {
data, err := c.client.Get(ctx, c.key(filter)).Bytes()
if err == redis.Nil {
return nil, false, nil
}
if err != nil {
return nil, false, err
}
var tasks []domain.Task
if err := json.Unmarshal(data, &tasks); err != nil {
return nil, false, err
}
return tasks, true, nil
}
func (c *TaskCache) SetTasks(ctx context.Context, filter domain.TaskFilter, tasks []domain.Task) error {
data, err := json.Marshal(tasks)
if err != nil {
return err
}
return c.client.Set(ctx, c.key(filter), data, c.ttl).Err()
}
func (c *TaskCache) DeleteTeam(ctx context.Context, teamID int64) error {
iter := c.client.Scan(ctx, 0, fmt.Sprintf("tasks:team:%d:*", teamID), 100).Iterator()
for iter.Next(ctx) {
_ = c.client.Del(ctx, iter.Val()).Err()
}
return iter.Err()
}
func (c *TaskCache) key(filter domain.TaskFilter) string {
raw, _ := json.Marshal(filter)
sum := sha1.Sum(raw)
return fmt.Sprintf("tasks:team:%d:%s", filter.TeamID, hex.EncodeToString(sum[:]))
}