diff --git a/backend/internal/storage/cache/cache.go b/backend/internal/storage/cache/cache.go new file mode 100644 index 0000000..4084969 --- /dev/null +++ b/backend/internal/storage/cache/cache.go @@ -0,0 +1,26 @@ +package cache + +import ( + "context" + + "git.ewellenr.ca/receipt_indexer/backend/internal/storage" + auth_storage "git.ewellenr.ca/receipt_indexer/backend/internal/storage/auth" +) + +type Storage struct { + Users interface { + Get(ctx context.Context, id int64) (*auth_storage.User, error) + Set(ctx context.Context, user *auth_storage.User) error + Delete(ctx context.Context, userID int64) + } + Receipts interface { + Get(ctx context.Context, id int64) (*storage.Receipt, error) + Set(ctx context.Context, receipt *storage.Receipt) error + Delete(ctx context.Context, id int64) + } + ReceiptImage interface { + Get(ctx context.Context, id int64) (*storage.Image, error) + Set(ctx context.Context, image *storage.Image) error + Delete(ctx context.Context, id int64) + } +} diff --git a/backend/internal/storage/cache/redis_user.go b/backend/internal/storage/cache/redis_user.go new file mode 100644 index 0000000..849885a --- /dev/null +++ b/backend/internal/storage/cache/redis_user.go @@ -0,0 +1,54 @@ +package cache + +import ( + "context" + "encoding/json" + "fmt" + "time" + + auth_storage "git.ewellenr.ca/receipt_indexer/backend/internal/storage/auth" + "github.com/redis/go-redis/v9" +) + +type UserStore struct { + rdb *redis.Client +} + +const UserExpTime = time.Minute + +func (s *UserStore) Get(ctx context.Context, userID int64) (*auth_storage.User, 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 user auth_storage.User + if data != "" { + err := json.Unmarshal([]byte(data), &user) + if err != nil { + return nil, err + } + } + + return &user, nil +} + +func (s *UserStore) Set(ctx context.Context, user *auth_storage.User) error { + cacheKey := fmt.Sprintf("user-%d", user.ID) + + json, err := json.Marshal(user) + if err != nil { + return err + } + + return s.rdb.Set(ctx, cacheKey, json, UserExpTime).Err() +} + +func (s *UserStore) Delete(ctx context.Context, userID int64) { + cacheKey := fmt.Sprintf("user-%d", userID) + s.rdb.Del(ctx, cacheKey) +}