learn-go/snippetbox/internal/models/users.go

58 lines
1.1 KiB
Go
Raw Normal View History

package models
import (
"database/sql"
2024-02-07 23:54:12 +00:00
"errors"
"strings"
2024-02-07 23:15:54 +00:00
"time"
2024-02-07 23:54:12 +00:00
"github.com/go-sql-driver/mysql"
"golang.org/x/crypto/bcrypt"
)
type User struct {
2024-02-07 23:15:54 +00:00
ID int
Username string
Email string
HashedPassword []byte
Created time.Time
}
type UserModel struct {
DB *sql.DB
}
// Insert
2024-02-07 23:54:12 +00:00
func (m *UserModel) Insert(username, email, password string) error {
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), 15)
if err != nil {
return err
}
stmt := `INSERT INTO users (username, email, hashed_password, created)
VALUES(?, ?, ?, UTC_TIMESTAMP())`
_, err = m.DB.Exec(stmt, username, email, string(hashedPassword))
if err != nil {
var mySQLError *mysql.MySQLError
if errors.As(err, &mySQLError) {
if mySQLError.Number == 1062 && strings.Contains(mySQLError.Message, "users_uc_email") {
return ErrDuplicateEmail
}
}
return err
}
return nil
}
2024-02-07 23:15:54 +00:00
// Authenticate
func (m *UserModel) Authenticate(email int, password string) (int, error) {
return 0, nil
}
2024-02-07 23:15:54 +00:00
// Exists
func (m *UserModel) Exists(id int) (bool, error) {
return false, nil
}