diff options
| author | Guillermo Serrahima <dev@vylion.com> | 2026-04-11 07:40:30 +0200 |
|---|---|---|
| committer | Guillermo Serrahima <dev@vylion.com> | 2026-04-11 23:39:19 +0200 |
| commit | 9f0a9a6779f00786e4728ad5c3fad36814a293b0 (patch) | |
| tree | 4b16d535c5d41ef46980608a88b7581be3c2bfd0 /backend/fetchers/cache.go | |
| parent | f6d60077b7cfc0d589fa7961e2bb59aea9f993a3 (diff) | |
| download | llostre-9f0a9a6779f00786e4728ad5c3fad36814a293b0.tar.xz llostre-9f0a9a6779f00786e4728ad5c3fad36814a293b0.zip | |
project restructure
Diffstat (limited to 'backend/fetchers/cache.go')
| -rw-r--r-- | backend/fetchers/cache.go | 166 |
1 files changed, 0 insertions, 166 deletions
diff --git a/backend/fetchers/cache.go b/backend/fetchers/cache.go deleted file mode 100644 index ac91259..0000000 --- a/backend/fetchers/cache.go +++ /dev/null @@ -1,166 +0,0 @@ -package fetchers - -import ( - "context" - "encoding/json" - "fmt" - "llostre/backend/notes" - "sort" - "time" - - "github.com/redis/go-redis/v9" -) - -type Cache struct { - client *redis.Client - ctx context.Context - expiryTime time.Duration -} - -func NewCache(addr, password string, expiryMinutes int) (*Cache, error) { - client := redis.NewClient(&redis.Options{ - Addr: addr, - Password: password, - DB: 0, - }) - - ctx := context.Background() - if err := client.Ping(ctx).Err(); err != nil { - return nil, fmt.Errorf("redis connection failed: %w", err) - } - - return &Cache{ - client: client, - ctx: ctx, - expiryTime: time.Duration(expiryMinutes) * time.Minute, - }, nil -} - -func (c *Cache) Get(uri string) (*notes.Note, bool) { - key := fmt.Sprintf("post:%s", uri) - data, err := c.client.Get(c.ctx, key).Bytes() - if err != nil { - return nil, false - } - - var note notes.Note - if err := json.Unmarshal(data, ¬e); err != nil { - return nil, false - } - - return ¬e, true -} - -func (c *Cache) Set(uri string, note *notes.Note) { - key := fmt.Sprintf("post:%s", uri) - data, err := json.Marshal(note) - if err != nil { - return - } - - c.client.Set(c.ctx, key, data, c.expiryTime) -} - -func (c *Cache) GetAuthor(did string) (*notes.Author, bool) { - key := fmt.Sprintf("profile:%s", did) - data, err := c.client.Get(c.ctx, key).Bytes() - if err != nil { - return nil, false - } - - var author notes.Author - if err := json.Unmarshal(data, &author); err != nil { - return nil, false - } - - return &author, true -} - -func (c *Cache) SetAuthor(did string, author *notes.Author) { - key := fmt.Sprintf("profile:%s", did) - data, err := json.Marshal(author) - if err != nil { - return - } - - c.client.Set(c.ctx, key, data, c.expiryTime) -} - -func (c *Cache) GetCursor(did string) (string, bool) { - key := fmt.Sprintf("cursor:%s", did) - cursor, err := c.client.Get(c.ctx, key).Result() - if err != nil { - return "", false - } - return cursor, true -} - -func (c *Cache) SetCursor(did, cursor string) { - key := fmt.Sprintf("cursor:%s", did) - if cursor == "" { - c.client.Del(c.ctx, key) - return - } - c.client.Set(c.ctx, key, cursor, 24*time.Hour) -} - -func (c *Cache) GetPostsByDID(did string) ([]notes.Note, error) { - pattern := fmt.Sprintf("post:at://%s/*", did) - var posts []notes.Note - - iter := c.client.Scan(c.ctx, 0, pattern, 0).Iterator() - for iter.Next(c.ctx) { - data, err := c.client.Get(c.ctx, iter.Val()).Bytes() - if err != nil { - continue - } - var note notes.Note - if err := json.Unmarshal(data, ¬e); err != nil { - continue - } - posts = append(posts, note) - } - - if err := iter.Err(); err != nil { - return nil, err - } - - sort.Slice(posts, func(i, j int) bool { - return posts[i].CreatedAt.After(posts[j].CreatedAt) - }) - - return posts, nil -} - -// track oldest sent post per profile -func (c *Cache) GetOldestSent(did string) (time.Time, bool) { - key := fmt.Sprintf("oldest_sent:%s", did) - ts, err := c.client.Get(c.ctx, key).Int64() - if err != nil { - return time.Time{}, false - } - return time.Unix(ts, 0), true -} - -func (c *Cache) SetOldestSent(did string, timestamp time.Time) { - key := fmt.Sprintf("oldest_sent:%s", did) - c.client.Set(c.ctx, key, timestamp.Unix(), 24*time.Hour) -} - -// count posts older than timestamp for a profile -func (c *Cache) CountPostsOlderThan(did string, timestamp time.Time) (int, error) { - posts, err := c.GetPostsByDID(did) - if err != nil { - return 0, err - } - for i, p := range posts { - if p.CreatedAt.Before(timestamp) { - return len(posts) - i, nil - } - } - return 0, nil -} - -func (c *Cache) Close() error { - return c.client.Close() -} |
