github.com/hellofresh/janus@v0.0.0-20230925145208-ce8de8183c67/pkg/plugin/basic/in_memory_repository.go (about) 1 package basic 2 3 import ( 4 "github.com/hellofresh/janus/pkg/plugin/basic/encrypt" 5 log "github.com/sirupsen/logrus" 6 "sync" 7 ) 8 9 // InMemoryRepository represents a in memory repository 10 type InMemoryRepository struct { 11 sync.RWMutex 12 users map[string]*User 13 hash encrypt.Hash 14 } 15 16 // NewInMemoryRepository creates a in memory repository 17 func NewInMemoryRepository() *InMemoryRepository { 18 return &InMemoryRepository{users: make(map[string]*User)} 19 } 20 21 // FindAll fetches all the users available 22 func (r *InMemoryRepository) FindAll() ([]*User, error) { 23 r.RLock() 24 defer r.RUnlock() 25 26 var users []*User 27 for _, user := range r.users { 28 users = append(users, user) 29 } 30 31 return users, nil 32 } 33 34 // FindByUsername find an user by username 35 func (r *InMemoryRepository) FindByUsername(username string) (*User, error) { 36 r.RLock() 37 defer r.RUnlock() 38 return r.findByUsername(username) 39 } 40 41 // Add adds an user to the repository 42 func (r *InMemoryRepository) Add(user *User) error { 43 r.Lock() 44 defer r.Unlock() 45 46 hash, err := r.hash.Generate(user.Password) 47 if err != nil { 48 log.Errorf("error hashing password: %v", err) 49 return err 50 } 51 user.Password = hash 52 53 r.users[user.Username] = user 54 55 return nil 56 } 57 58 // Remove removes an user from the repository 59 func (r *InMemoryRepository) Remove(username string) error { 60 r.Lock() 61 defer r.Unlock() 62 63 if _, err := r.findByUsername(username); err == ErrUserNotFound { 64 return err 65 } 66 67 delete(r.users, username) 68 69 return nil 70 } 71 72 func (r *InMemoryRepository) findByUsername(username string) (*User, error) { 73 user, ok := r.users[username] 74 if false == ok { 75 return nil, ErrUserNotFound 76 } 77 78 return user, nil 79 }