ERP/internal/models/user.go

67 lines
1.5 KiB
Go
Raw Normal View History

2026-02-06 17:35:29 +01:00
package models
import (
"database/sql"
"fmt"
"time"
"golang.org/x/crypto/bcrypt"
)
type User struct {
ID int
Username string
PasswordHash string
2026-02-08 14:20:18 +01:00
Role string
2026-02-06 17:35:29 +01:00
CreatedAt time.Time
}
func Authenticate(db *sql.DB, username, password string) (*User, error) {
u := &User{}
err := db.QueryRow(
2026-02-08 14:20:18 +01:00
"SELECT id, username, password_hash, role, created_at FROM users WHERE username = ?",
2026-02-06 17:35:29 +01:00
username,
2026-02-08 14:20:18 +01:00
).Scan(&u.ID, &u.Username, &u.PasswordHash, &u.Role, &u.CreatedAt)
2026-02-06 17:35:29 +01:00
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
}
2026-02-08 14:20:18 +01:00
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
}