From 4fd63574c2e1a6b3d83d7763c4b103feab141a6c Mon Sep 17 00:00:00 2001 From: Ethan Wellenreiter Date: Wed, 7 May 2025 00:16:37 -0400 Subject: [PATCH] Implementing redis caching for receipts Signed-off-by: Ethan Wellenreiter --- .../internal/storage/cache/redis_receipts.go | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 backend/internal/storage/cache/redis_receipts.go diff --git a/backend/internal/storage/cache/redis_receipts.go b/backend/internal/storage/cache/redis_receipts.go new file mode 100644 index 0000000..40c7a7f --- /dev/null +++ b/backend/internal/storage/cache/redis_receipts.go @@ -0,0 +1,55 @@ +package cache + +import ( + "context" + "encoding/json" + "fmt" + + "git.ewellenr.ca/receipt_indexer/backend/internal/storage" + "github.com/redis/go-redis/v9" +) + +type ReceiptStore struct { + rdb *redis.Client +} + +func (s *ReceiptStore) generateCacheKey(id int64) string { + return fmt.Sprintf("receipt-%d", id) +} + +func (s *ReceiptStore) Get(ctx context.Context, id int64) (*storage.Receipt, error) { + cacheKey := s.generateCacheKey(id) + + data, err := s.rdb.Get(ctx, cacheKey).Result() + if err == redis.Nil { + return nil, nil + } else if err != nil { + return nil, err + } + + var receipt storage.Receipt + if data != "" { + err := json.Unmarshal([]byte(data), &receipt) + if err != nil { + return nil, err + } + } + + return &receipt, nil +} + +func (s *ReceiptStore) Set(ctx context.Context, receipt *storage.Receipt) error { + cacheKey := s.generateCacheKey(receipt.ID) + + json, err := json.Marshal(receipt) + if err != nil { + return err + } + + return s.rdb.Set(ctx, cacheKey, json, ReceiptExpTime).Err() +} + +func (s *ReceiptStore) Delete(ctx context.Context, id int64) { + cacheKey := s.generateCacheKey(id) + s.rdb.Del(ctx, cacheKey) +}