summaryrefslogtreecommitdiff
path: root/internal
diff options
from:
to:
context:
space:
mode:
authorGravatar SayaAndy <saya.andy@posteo.com> 2025-08-26 00:39:22 +0700
committerGravatar SayaAndy <saya.andy@posteo.com> 2025-08-26 00:39:22 +0700
commit5ed2499a1d8806fe78369b5b492d7990218131c9 (patch)
tree0a9e0548aa145986b654af81554f16c8cf544c41 /internal
parentb815b74d7a943d1f71a0ddcf6b343d3958d2b97a (diff)
downloadweb-5ed2499a1d8806fe78369b5b492d7990218131c9.tar.gz
web-5ed2499a1d8806fe78369b5b492d7990218131c9.zip
feat: client hash cache
feat: add local config feat: create a volume for data (for the future) format: unname unused vars
Diffstat (limited to 'internal')
-rw-r--r--internal/router/api-v1-blog-search.go2
-rw-r--r--internal/router/client-cache.go46
-rw-r--r--internal/router/lang-blog-title.go4
-rw-r--r--internal/router/lang-blog.go2
4 files changed, 52 insertions, 2 deletions
diff --git a/internal/router/api-v1-blog-search.go b/internal/router/api-v1-blog-search.go
index 51ace85..a809783 100644
--- a/internal/router/api-v1-blog-search.go
+++ b/internal/router/api-v1-blog-search.go
@@ -48,7 +48,7 @@ func Api_V1_BlogSearch(l map[string]*locale.LocaleConfig, langs []string, b2Clie
c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
return c.Status(fiber.ErrInternalServerError.Code).SendString("failed to generate regex for tags gathering")
}
- decodedQuery, err := url.QueryUnescape(string(encodedQuery))
+ decodedQuery, _ := url.QueryUnescape(string(encodedQuery))
matches := re.FindAllStringSubmatch(decodedQuery, -1)
tags := make([]string, 0, len(matches))
diff --git a/internal/router/client-cache.go b/internal/router/client-cache.go
new file mode 100644
index 0000000..192d2ed
--- /dev/null
+++ b/internal/router/client-cache.go
@@ -0,0 +1,46 @@
+package router
+
+import (
+ "log/slog"
+ "sync"
+
+ "golang.org/x/crypto/argon2"
+)
+
+type ClientCache struct {
+ hashMap map[string][]byte
+ mutexMap map[string]*sync.Mutex
+ 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,
+ }
+}
+
+func (c *ClientCache) GetHash(id string) []byte {
+ if val, ok := c.hashMap[id]; ok {
+ slog.Debug("gave an old hash", slog.String("hash", string(val)))
+ return val
+ }
+
+ if _, ok := c.mutexMap[id]; !ok {
+ c.mutexMap[id] = &sync.Mutex{}
+ }
+ c.mutexMap[id].Lock()
+ defer c.mutexMap[id].Unlock()
+
+ if val, ok := c.hashMap[id]; ok {
+ slog.Debug("gave a newly generated hash", slog.String("hash", string(val)))
+ return val
+ }
+
+ c.hashMap[id] = argon2.IDKey([]byte(id), c.salt, 1, 64*1024, 4, 32)
+ slog.Debug("generated hash", slog.String("hash", string(c.hashMap[id])))
+ return c.hashMap[id]
+}
diff --git a/internal/router/lang-blog-title.go b/internal/router/lang-blog-title.go
index b7b5d7e..5b80ec8 100644
--- a/internal/router/lang-blog-title.go
+++ b/internal/router/lang-blog-title.go
@@ -22,6 +22,10 @@ func init() {
func Lang_Blog_Title(l map[string]*locale.LocaleConfig, langs []string, b2Client *b2.B2Client, md goldmark.Markdown) func(c *fiber.Ctx) error {
return func(c *fiber.Ctx) error {
+ ip := c.IP()
+ slog.Debug("client entering blog page", slog.String("ip", ip), slog.String("page", c.Path()))
+ go CCache.GetHash(ip)
+
lang := c.Params("lang")
if !slices.Contains(langs, lang) {
c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
diff --git a/internal/router/lang-blog.go b/internal/router/lang-blog.go
index 650c4b1..0cbba94 100644
--- a/internal/router/lang-blog.go
+++ b/internal/router/lang-blog.go
@@ -37,7 +37,7 @@ func Lang_Blog(l map[string]*locale.LocaleConfig, langs []string, b2Client *b2.B
c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
return c.Status(fiber.ErrInternalServerError.Code).SendString("failed to generate regex for tags gathering")
}
- decodedQuery, err := url.QueryUnescape(string(encodedQuery))
+ decodedQuery, _ := url.QueryUnescape(string(encodedQuery))
matches := re.FindAllStringSubmatch(decodedQuery, -1)
queryTags := make([]string, 0, len(matches))