scanfile/server/internal/database/user.go
2025-05-21 08:57:48 +02:00

158 lines
2.8 KiB
Go

package database
import (
"log"
"time"
"golang.org/x/crypto/bcrypt"
)
type User struct {
ID int
Username string
Password string
Email string
PublicKey string `db:"public_key"`
Admin bool
Enabled bool
BaseDir string `db:"base_dir"`
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
}
func CreateUser(user User) error {
log.Println(user)
_, err := db.NamedExec(`
INSERT INTO users (
username,
password,
email,
public_key,
admin,
enabled,
base_dir,
created_at,
updated_at
) VALUES (
:username,
:password,
:email,
:public_key,
:admin,
:enabled,
:base_dir,
:created_at,
:updated_at
)
`, user)
return err
}
func GetUser(id int) (User, error) {
var user User
err := db.Get(&user, `
SELECT
id,
username,
password,
email,
admin,
enabled,
base_dir,
created_at,
updated_at
FROM users
WHERE id = ?
`, id)
return user, err
}
func GetUserByUsername(username string) (User, error) {
var user User
err := db.Get(&user, `
SELECT
id,
username,
password,
email,
public_key,
admin,
enabled,
base_dir,
created_at,
updated_at
FROM users
WHERE username = ?
`, username)
return user, err
}
func UpdateUser(user User) error {
_, err := db.NamedExec(`
UPDATE users
SET
username = :username,
password = :password,
email = :email,
public_key = :public_key,
admin = :admin,
enabled = :enabled,
base_dir = :base_dir,
updated_at = :updated_at
WHERE id = :id
`, user)
return err
}
func DeleteUser(id int) error {
_, err := db.Exec(`
DELETE FROM users
WHERE id = ?
`, id)
return err
}
func ListUsers() ([]User, error) {
var users []User
err := db.Select(&users, `
SELECT
id,
username,
password,
email,
public_key,
admin,
enabled,
base_dir,
created_at,
updated_at
FROM users
`)
return users, err
}
// SetPassword sets the password of a user
func (u *User) SetPassword(password string) error {
byteHash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
u.Password = string(byteHash)
if err != nil {
return err
}
return UpdateUser(*u)
}
// CheckPassword checks if the password of a user matches the given password
func CheckUserPassword(username, password string) (bool, error) {
var dbHash string
err := db.QueryRow(``, username).Scan(dbHash)
if err != nil {
return false, err
}
err = bcrypt.CompareHashAndPassword([]byte(dbHash), []byte(password))
if err != nil {
log.Printf("Wrong password attempt for user %s", username)
return false, err
} else {
return true, nil
}
}