Newer
Older
wg-portal / internal / persistence / users.go
@Christoph Haas Christoph Haas on 10 Oct 2021 1 KB wip: persistence
package persistence

import (
	"time"

	"github.com/pkg/errors"
)

func (d *Database) GetUser(id UserIdentifier) (User, error) {
	var user User
	if err := d.db.First(&user, id).Error; err != nil {
		return User{}, errors.WithMessagef(err, "unable to find user %s", id)
	}
	return user, nil
}

func (d *Database) GetUsers() ([]User, error) {
	var users []User
	if err := d.db.Find(&users).Error; err != nil {
		return nil, errors.WithMessagef(err, "unable to find users")
	}
	return users, nil
}

func (d *Database) GetUsersUnscoped() ([]User, error) {
	var users []User
	if err := d.db.Unscoped().Find(&users).Error; err != nil {
		return nil, errors.WithMessagef(err, "unable to find unscoped users")
	}
	return users, nil
}

func (d *Database) GetUsersFiltered(filters ...DatabaseFilterCondition) ([]User, error) {
	var users []User
	tx := d.db
	for _, filter := range filters {
		tx = filter(tx)
	}
	if err := tx.Find(&users).Error; err != nil {
		return nil, errors.WithMessagef(err, "unable to find filtered users")
	}
	return users, nil
}

func (d *Database) SaveUser(user User) error {
	create := user.Uid == ""
	now := time.Now()

	user.UpdatedAt = now

	if create {
		user.CreatedAt = now
		if err := d.db.Create(&user).Error; err != nil {
			return errors.WithMessage(err, "unable to create new user")
		}
	} else {
		if err := d.db.Save(&user).Error; err != nil {
			return errors.WithMessagef(err, "unable to update user %s", user.Uid)
		}
	}
	return nil
}

func (d *Database) DeleteUser(id UserIdentifier) error {
	if err := d.db.Delete(&User{}, id).Error; err != nil {
		return errors.WithMessagef(err, "unable to delete user %s", id)
	}
	return nil
}