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  }