From 2b2fa217d662155cac53aff3c1f5c2a21defb2a5 Mon Sep 17 00:00:00 2001 From: Ethan Wellenreiter Date: Wed, 7 May 2025 00:00:54 -0400 Subject: [PATCH] Implementing usergroups caching Signed-off-by: Ethan Wellenreiter --- backend/internal/storage/cache/cache.go | 4 +- .../storage/cache/redis_usergroups.go | 51 +++++++++++++++++++ 2 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 backend/internal/storage/cache/redis_usergroups.go diff --git a/backend/internal/storage/cache/cache.go b/backend/internal/storage/cache/cache.go index 95c9634..fcfc4be 100644 --- a/backend/internal/storage/cache/cache.go +++ b/backend/internal/storage/cache/cache.go @@ -34,8 +34,8 @@ type Storage struct { Delete(ctx context.Context, name string) } UserGroups interface { - Get(ctx context.Context, userid int64) (*[]int64, error) - Set(ctx context.Context, groups *[]int64) error + Get(ctx context.Context, userid int64) (*storage.UserGroups, error) + Set(ctx context.Context, groups *storage.UserGroups) error Delete(ctx context.Context, userid int64) } Receipts interface { diff --git a/backend/internal/storage/cache/redis_usergroups.go b/backend/internal/storage/cache/redis_usergroups.go new file mode 100644 index 0000000..dcd0194 --- /dev/null +++ b/backend/internal/storage/cache/redis_usergroups.go @@ -0,0 +1,51 @@ +package cache + +import ( + "context" + "encoding/json" + "fmt" + + "git.ewellenr.ca/receipt_indexer/backend/internal/storage" + "github.com/redis/go-redis/v9" +) + +type UserGroupsStore struct { + rdb *redis.Client +} + +func (s *UserGroupsStore) Get(ctx context.Context, userid int64) (*storage.UserGroups, error) { + cacheKey := fmt.Sprintf("user-%d", userid) + + data, err := s.rdb.Get(ctx, cacheKey).Result() + if err == redis.Nil { + return nil, nil + } else if err != nil { + return nil, err + } + + var usergroups storage.UserGroups + if data != "" { + err := json.Unmarshal([]byte(data), &usergroups) + if err != nil { + return nil, err + } + } + + return &usergroups, nil +} + +func (s *UserGroupsStore) Set(ctx context.Context, groups *storage.UserGroups) error { + cacheKey := fmt.Sprintf("user-%d", groups.UserID) + + json, err := json.Marshal(groups) + if err != nil { + return err + } + + return s.rdb.Set(ctx, cacheKey, json, RolesExpTime).Err() +} + +func (s *UserGroupsStore) Delete(ctx context.Context, userid int64) { + cacheKey := fmt.Sprintf("user-%d", userid) + s.rdb.Del(ctx, cacheKey) +}