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  }