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 }