aboutsummaryrefslogtreecommitdiff
path: root/gorm
diff options
context:
space:
mode:
authorXe Iaso <me@xeiaso.net>2024-08-21 12:42:32 -0400
committerXe Iaso <me@xeiaso.net>2024-08-21 12:42:40 -0400
commit83902a1af00e76e9aaa40651cf33e4c399ff7380 (patch)
tree5e1e1f3d00975fd8d9191c4a40312a1cd17cdb96 /gorm
parent7a4ad5e24d0c3c3e702544315062485281a868a7 (diff)
downloadx-83902a1af00e76e9aaa40651cf33e4c399ff7380.tar.xz
x-83902a1af00e76e9aaa40651cf33e4c399ff7380.zip
get started on htmx fun
Signed-off-by: Xe Iaso <me@xeiaso.net>
Diffstat (limited to 'gorm')
-rw-r--r--gorm/valkeycache/valkeycache.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/gorm/valkeycache/valkeycache.go b/gorm/valkeycache/valkeycache.go
new file mode 100644
index 0000000..747d2dd
--- /dev/null
+++ b/gorm/valkeycache/valkeycache.go
@@ -0,0 +1,73 @@
+package valkeycache
+
+import (
+ "context"
+ "fmt"
+ "time"
+
+ "github.com/go-gorm/caches/v4"
+ valkey "github.com/redis/go-redis/v9"
+)
+
+func New(rdb *valkey.Client) *Cache {
+ return &Cache{rdb: rdb}
+}
+
+type Cache struct {
+ rdb *valkey.Client
+}
+
+func (c *Cache) Get(ctx context.Context, key string, q *caches.Query[any]) (*caches.Query[any], error) {
+ res, err := c.rdb.Get(ctx, key).Result()
+ if err == valkey.Nil {
+ return nil, nil
+ }
+
+ if err != nil {
+ return nil, err
+ }
+
+ if err := q.Unmarshal([]byte(res)); err != nil {
+ return nil, err
+ }
+
+ return q, nil
+}
+
+func (c *Cache) Store(ctx context.Context, key string, val *caches.Query[any]) error {
+ res, err := val.Marshal()
+ if err != nil {
+ return err
+ }
+
+ c.rdb.Set(ctx, key, res, 300*time.Second) // Set proper cache time
+ return nil
+}
+
+func (c *Cache) Invalidate(ctx context.Context) error {
+ var (
+ cursor uint64
+ keys []string
+ )
+ for {
+ var (
+ k []string
+ err error
+ )
+ k, cursor, err = c.rdb.Scan(ctx, cursor, fmt.Sprintf("%s*", caches.IdentifierPrefix), 0).Result()
+ if err != nil {
+ return err
+ }
+ keys = append(keys, k...)
+ if cursor == 0 {
+ break
+ }
+ }
+
+ if len(keys) > 0 {
+ if _, err := c.rdb.Del(ctx, keys...).Result(); err != nil {
+ return err
+ }
+ }
+ return nil
+}