Newer
Older
wg-portal / internal / user / manager.go
@Christoph Haas Christoph Haas on 11 Oct 2021 2 KB wip: ip handling, refactoring, tests
package user

import (
	"github.com/h44z/wg-portal/internal/persistence"
	"github.com/pkg/errors"
)

type Loader interface {
	GetUser(id persistence.UserIdentifier) (persistence.User, error)
	GetActiveUsers() ([]persistence.User, error)
	GetAllUsers() ([]persistence.User, error)
	GetFilteredUsers(filter ...persistence.DatabaseFilterCondition) ([]persistence.User, error)
}

type Updater interface {
	CreateUser(user persistence.User) error
	UpdateUser(user persistence.User) error
	DeleteUser(identifier persistence.UserIdentifier) error
}

type Authenticator interface {
	PlaintextAuthentication(userId persistence.UserIdentifier, plainPassword string) error
	HashedAuthentication(userId persistence.UserIdentifier, hashedPassword string) error
}

type PasswordHasher interface {
	HashPassword(plain string) (string, error)
}

type Manager interface {
	Loader
	Updater
	Authenticator
	PasswordHasher
}

type PersistentManager struct {
	store store

	authenticator Authenticator
	hasher        PasswordHasher
}

func NewPersistentManager(store store) (*PersistentManager, error) {
	if store == nil {
		return nil, errors.New("user manager requires a valid store object")
	}

	pwa, err := NewPasswordAuthenticator(store)
	if err != nil {
		return nil, errors.WithMessage(err, "failed to initialize authenticator")
	}

	mgr := &PersistentManager{
		store:         store,
		authenticator: pwa,
		hasher:        pwa,
	}

	return mgr, nil
}

func (p *PersistentManager) GetUser(id persistence.UserIdentifier) (persistence.User, error) {
	return p.store.GetUser(id)
}

func (p *PersistentManager) GetActiveUsers() ([]persistence.User, error) {
	return p.store.GetUsers()
}

func (p *PersistentManager) GetAllUsers() ([]persistence.User, error) {
	return p.store.GetUsersUnscoped()
}

func (p *PersistentManager) GetFilteredUsers(filter ...persistence.DatabaseFilterCondition) ([]persistence.User, error) {
	return p.store.GetUsersFiltered(filter...)
}

func (p *PersistentManager) CreateUser(user persistence.User) error {
	return p.store.SaveUser(user)
}

func (p *PersistentManager) UpdateUser(user persistence.User) error {
	return p.store.SaveUser(user)
}

func (p *PersistentManager) DeleteUser(identifier persistence.UserIdentifier) error {
	return p.store.DeleteUser(identifier)
}