61 lines
1.4 KiB
Go
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[:]))
|
|
}
|