first commit
This commit is contained in:
Vendored
+60
@@ -0,0 +1,60 @@
|
||||
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[:]))
|
||||
}
|
||||
Reference in New Issue
Block a user