44 lines
830 B
Go
44 lines
830 B
Go
package models
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
type User struct {
|
|
ID int
|
|
Email string
|
|
PasswordHash string
|
|
}
|
|
|
|
type UserService struct {
|
|
DB *sql.DB
|
|
}
|
|
|
|
func (us *UserService) Create(email, password string) (*User, error) {
|
|
email = strings.ToLower(email)
|
|
|
|
hashedBytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("create user: %w", err)
|
|
}
|
|
passwordHash := string(hashedBytes)
|
|
|
|
user := User{
|
|
Email: email,
|
|
PasswordHash: passwordHash,
|
|
}
|
|
row := us.DB.QueryRow(`
|
|
INSERT INTO users (email, password_hash)
|
|
VALUES ($1, $2) RETURNING id
|
|
`, email, passwordHash)
|
|
err = row.Scan(&user.ID)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("create user: %w", err)
|
|
}
|
|
return &user, nil
|
|
}
|