2024-02-07 19:07:29 +00:00
|
|
|
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"
|
2024-02-07 19:07:29 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type User struct {
|
2024-02-07 23:15:54 +00:00
|
|
|
ID int
|
|
|
|
Username string
|
|
|
|
Email string
|
|
|
|
HashedPassword []byte
|
|
|
|
Created time.Time
|
2024-02-07 19:07:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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 19:07:29 +00:00
|
|
|
}
|
|
|
|
|
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 19:07:29 +00:00
|
|
|
|
2024-02-07 23:15:54 +00:00
|
|
|
// Exists
|
|
|
|
func (m *UserModel) Exists(id int) (bool, error) {
|
|
|
|
return false, nil
|
2024-02-07 19:07:29 +00:00
|
|
|
}
|