aboutsummaryrefslogtreecommitdiff
path: root/backend/fetchers/cache.go
diff options
context:
space:
mode:
Diffstat (limited to 'backend/fetchers/cache.go')
-rw-r--r--backend/fetchers/cache.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/backend/fetchers/cache.go b/backend/fetchers/cache.go
new file mode 100644
index 0000000..12c68a8
--- /dev/null
+++ b/backend/fetchers/cache.go
@@ -0,0 +1,77 @@
+package fetchers
+
+import (
+ "llostre/backend/notes"
+ "sync"
+ "time"
+)
+
+type CacheEntry struct {
+ Note *notes.Note
+ ExpiresAt time.Time
+}
+
+type Cache struct {
+ posts map[string]*CacheEntry
+ mu sync.RWMutex
+}
+
+func NewCache() *Cache {
+ return &Cache{
+ posts: make(map[string]*CacheEntry),
+ }
+}
+
+func (c *Cache) Get(uri string) (*notes.Note, bool) {
+ c.mu.Lock()
+ defer c.mu.Unlock()
+
+ entry, exists := c.posts[uri]
+
+ if !exists {
+ return nil, false
+ }
+
+ if time.Now().After(entry.ExpiresAt) {
+ delete(c.posts, uri)
+ return nil, false
+ }
+
+ return entry.Note, true
+}
+
+func (c *Cache) Set(uri string, note *notes.Note) {
+ c.mu.Lock()
+ defer c.mu.Unlock()
+
+ ttl := time.Now().Add(15 * time.Minute)
+
+ c.posts[uri] = &CacheEntry{
+ Note: note,
+ ExpiresAt: ttl,
+ }
+}
+
+func (c *Cache) GetMany(uris []string) map[string]*notes.Note {
+ c.mu.Lock()
+ defer c.mu.Unlock()
+
+ result := make(map[string]*notes.Note)
+ now := time.Now()
+
+ for _, uri := range uris {
+ entry, exists := c.posts[uri]
+ if !exists {
+ continue
+ }
+
+ if now.After(entry.ExpiresAt) {
+ delete(c.posts, uri)
+ continue
+ }
+
+ result[uri] = entry.Note
+ }
+
+ return result
+}