diff options
| author | Xe Iaso <me@xeiaso.net> | 2024-08-21 12:42:32 -0400 |
|---|---|---|
| committer | Xe Iaso <me@xeiaso.net> | 2024-08-21 12:42:40 -0400 |
| commit | 83902a1af00e76e9aaa40651cf33e4c399ff7380 (patch) | |
| tree | 5e1e1f3d00975fd8d9191c4a40312a1cd17cdb96 /gorm | |
| parent | 7a4ad5e24d0c3c3e702544315062485281a868a7 (diff) | |
| download | x-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.go | 73 |
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 +} |
