Add user model
This commit is contained in:
5
models/sql/users.sql
Normal file
5
models/sql/users.sql
Normal file
@@ -0,0 +1,5 @@
|
||||
CREATE TABLE users (
|
||||
id SERIAL PRIMARY KEY,
|
||||
email TEXT UNIQUE NOT NULL,
|
||||
password_hash TEXT NOT NULL
|
||||
);
|
||||
43
models/user.go
Normal file
43
models/user.go
Normal file
@@ -0,0 +1,43 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user