67 lines
1.5 KiB
Go
67 lines
1.5 KiB
Go
package models
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
"time"
|
|
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
type User struct {
|
|
ID int
|
|
Username string
|
|
PasswordHash string
|
|
Role string
|
|
CreatedAt time.Time
|
|
}
|
|
|
|
func Authenticate(db *sql.DB, username, password string) (*User, error) {
|
|
u := &User{}
|
|
err := db.QueryRow(
|
|
"SELECT id, username, password_hash, role, created_at FROM users WHERE username = ?",
|
|
username,
|
|
).Scan(&u.ID, &u.Username, &u.PasswordHash, &u.Role, &u.CreatedAt)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("user not found")
|
|
}
|
|
|
|
if err := bcrypt.CompareHashAndPassword([]byte(u.PasswordHash), []byte(password)); err != nil {
|
|
return nil, fmt.Errorf("invalid password")
|
|
}
|
|
|
|
return u, nil
|
|
}
|
|
|
|
func UserGetAll(db *sql.DB) ([]User, error) {
|
|
rows, err := db.Query("SELECT id, username, role, created_at FROM users ORDER BY username")
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var users []User
|
|
for rows.Next() {
|
|
var u User
|
|
if err := rows.Scan(&u.ID, &u.Username, &u.Role, &u.CreatedAt); err != nil {
|
|
return nil, err
|
|
}
|
|
users = append(users, u)
|
|
}
|
|
return users, nil
|
|
}
|
|
|
|
func UserCreate(db *sql.DB, username, password, role string) error {
|
|
hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = db.Exec("INSERT INTO users (username, password_hash, role) VALUES (?, ?, ?)", username, string(hash), role)
|
|
return err
|
|
}
|
|
|
|
func UserDelete(db *sql.DB, id int) error {
|
|
_, err := db.Exec("DELETE FROM users WHERE id = ?", id)
|
|
return err
|
|
}
|