github.com/dimeko/sapi@v0.0.0-20231115204413-952501e4268a/store/store.go (about) 1 package store 2 3 import ( 4 "encoding/json" 5 6 "github.com/dimeko/sapi/models" 7 "github.com/dimeko/sapi/store/cache" 8 "github.com/dimeko/sapi/store/rdbms" 9 "github.com/sirupsen/logrus" 10 ) 11 12 var log = logrus.New() 13 14 type Store struct { 15 Cache *cache.Cache 16 Rdbms models.Actions 17 } 18 19 func New() *Store { 20 cache := cache.New() 21 rdbms := rdbms.New() 22 store := &Store{ 23 Cache: cache, 24 Rdbms: rdbms, 25 } 26 return store 27 } 28 29 func (s *Store) Create(payload models.UserPayload) (*models.User, error) { 30 newUser, err := s.Rdbms.Create(payload) 31 32 if err != nil { 33 return nil, err 34 } 35 36 unhashedCacheKey := "users:listing" 37 err1 := s.Cache.Remove(unhashedCacheKey) 38 if err1 != nil { 39 log.Error(err1) 40 } 41 return newUser, nil 42 } 43 44 func (s *Store) Update(id string, payload models.UserPayload) (*models.User, error) { 45 unhashedCurrentCacheKey := "user:" + id 46 updatedUser, err := s.Rdbms.Update(id, payload) 47 if err != nil { 48 log.Error(err) 49 return nil, err 50 } 51 52 err1 := s.Cache.Remove(unhashedCurrentCacheKey) 53 if err1 != nil { 54 log.Error(err1) 55 } 56 57 unhashedCacheKey := "users:listing" 58 err2 := s.Cache.Remove(unhashedCacheKey) 59 if err1 != nil { 60 log.Error(err2) 61 } 62 63 return updatedUser, nil 64 } 65 66 func (s *Store) List(limit string, offset string) ([]*models.User, error) { 67 unhashedCacheKey := "users:listing" 68 var users []*models.User 69 item, err := s.Cache.Get(unhashedCacheKey) 70 if err != nil { 71 log.Error("Cache error: ", err) 72 users, err1 := s.Rdbms.List(limit, offset) 73 if err1 != nil { 74 log.Error(err1) 75 return nil, err1 76 } 77 _, err2 := s.Cache.Set(unhashedCacheKey, users) 78 if err2 != nil { 79 log.Error(err2) 80 } 81 return users, nil 82 } 83 84 log.Info("Cache hit on user listing") 85 err2 := json.Unmarshal(item.Value, &users) 86 if err2 != nil { 87 log.Error(err2) 88 return nil, err2 89 } 90 91 return users, nil 92 } 93 94 func (s *Store) Get(id string) (*models.User, error) { 95 unhashedCacheKey := "user:" + id 96 var user *models.User 97 item, err := s.Cache.Get(unhashedCacheKey) 98 if err != nil { 99 log.Error("Cache error: ", err) 100 user, err = s.Rdbms.Get(id) 101 if err != nil { 102 log.Error(err) 103 return nil, err 104 } 105 _, err2 := s.Cache.Set(unhashedCacheKey, user) 106 if err2 != nil { 107 log.Error(err2) 108 } 109 return user, nil 110 } 111 112 log.Info("Cache hit on user get") 113 err2 := json.Unmarshal(item.Value, &user) 114 if err2 != nil { 115 log.Error(err2) 116 return nil, err2 117 } 118 119 return user, nil 120 } 121 122 func (s *Store) Delete(id string) error { 123 unhashedCacheKey := "user:" + id 124 err := s.Rdbms.Delete(id) 125 if err != nil { 126 log.Error(err) 127 return err 128 } 129 err1 := s.Cache.Remove(unhashedCacheKey) 130 if err1 != nil { 131 log.Error(err1) 132 } 133 134 return nil 135 }