summaryrefslogtreecommitdiff
path: root/internal/router/client-cache.go
diff options
from:
to:
context:
space:
mode:
authorGravatar SayaAndy <saya.andy@posteo.com> 2025-08-26 23:41:00 +0700
committerGravatar SayaAndy <saya.andy@posteo.com> 2025-08-26 23:41:00 +0700
commitb0ab2ed92870d8c651267db10d68eb695da2ec62 (patch)
tree880b194c4d0953e486be60eca45fd7aac17ee5d8 /internal/router/client-cache.go
parentbbe41e5b06ab540a38c8c6b4e0cf719ab31b8e55 (diff)
downloadweb-b0ab2ed92870d8c651267db10d68eb695da2ec62.tar.gz
web-b0ab2ed92870d8c651267db10d68eb695da2ec62.zip
feat: like button (only inmem-cache for now)
Diffstat (limited to 'internal/router/client-cache.go')
-rw-r--r--internal/router/client-cache.go82
1 files changed, 66 insertions, 16 deletions
diff --git a/internal/router/client-cache.go b/internal/router/client-cache.go
index a4a0cc2..3104a66 100644
--- a/internal/router/client-cache.go
+++ b/internal/router/client-cache.go
@@ -9,40 +9,90 @@ import (
)
type ClientCache struct {
- hashMap map[string][]byte
- mutexMap map[string]*sync.Mutex
- salt []byte
+ hashMap map[string]string
+ mutexLikeMap map[string]*sync.Mutex
+ mutexHashMap map[string]*sync.Mutex
+ likePageMap map[string]map[string]struct{}
+ salt []byte
}
var CCache *ClientCache
func NewClientCache(salt []byte) *ClientCache {
return &ClientCache{
- hashMap: make(map[string][]byte),
- mutexMap: make(map[string]*sync.Mutex),
- salt: salt,
+ hashMap: make(map[string]string),
+ mutexLikeMap: make(map[string]*sync.Mutex),
+ mutexHashMap: make(map[string]*sync.Mutex),
+ likePageMap: make(map[string]map[string]struct{}),
+ salt: salt,
}
}
-func (c *ClientCache) GetHash(id string) []byte {
-
+func (c *ClientCache) GetHash(id string) string {
if val, ok := c.hashMap[id]; ok {
- slog.Debug("gave an old hash", slog.String("hash", base64.RawStdEncoding.EncodeToString(val)))
+ slog.Debug("gave an old hash", slog.String("hash", val))
return val
}
- if _, ok := c.mutexMap[id]; !ok {
- c.mutexMap[id] = &sync.Mutex{}
+ if _, ok := c.mutexHashMap[id]; !ok {
+ c.mutexHashMap[id] = &sync.Mutex{}
}
- c.mutexMap[id].Lock()
- defer c.mutexMap[id].Unlock()
+ c.mutexHashMap[id].Lock()
+ defer c.mutexHashMap[id].Unlock()
if val, ok := c.hashMap[id]; ok {
- slog.Debug("gave a newly generated hash", slog.String("hash", base64.RawStdEncoding.EncodeToString(val)))
+ slog.Debug("gave a newly generated hash", slog.String("hash", val))
return val
}
- c.hashMap[id] = argon2.IDKey([]byte(id), c.salt, 1, 64*1024, 4, 32)
- slog.Debug("generated hash", slog.String("hash", base64.RawStdEncoding.EncodeToString(c.hashMap[id])))
+ c.hashMap[id] = base64.RawStdEncoding.EncodeToString(argon2.IDKey([]byte(id), c.salt, 1, 64*1024, 4, 32))
+ slog.Debug("generated hash", slog.String("hash", c.hashMap[id]))
return c.hashMap[id]
}
+
+func (c *ClientCache) GetLikeStatus(id string, page string) bool {
+ if _, ok := c.likePageMap[page]; !ok {
+ return false
+ }
+ _, ok := c.likePageMap[page][c.GetHash(id)]
+ return ok
+}
+
+func (c *ClientCache) LikeOn(id string, page string) (alreadyLiked bool) {
+ if _, ok := c.mutexLikeMap[id]; !ok {
+ c.mutexLikeMap[id] = &sync.Mutex{}
+ }
+ c.mutexLikeMap[id].Lock()
+ defer c.mutexLikeMap[id].Unlock()
+
+ hash := c.GetHash(id)
+
+ if userSet, ok := c.likePageMap[page]; ok {
+ _, alreadyLiked = userSet[hash]
+ c.likePageMap[page][hash] = struct{}{}
+ return
+ }
+
+ c.likePageMap[page] = make(map[string]struct{})
+ c.likePageMap[page][hash] = struct{}{}
+ return
+}
+
+func (c *ClientCache) LikeOff(id string, page string) (alreadyUnliked bool) {
+ if _, ok := c.mutexLikeMap[id]; !ok {
+ c.mutexLikeMap[id] = &sync.Mutex{}
+ }
+ c.mutexLikeMap[id].Lock()
+ defer c.mutexLikeMap[id].Unlock()
+
+ if _, ok := c.likePageMap[page]; !ok {
+ return true
+ }
+ hash := c.GetHash(id)
+ if _, ok := c.likePageMap[page][hash]; !ok {
+ return true
+ }
+
+ delete(c.likePageMap[page], hash)
+ return false
+}