gin_http/models/user.go

71 lines
1.8 KiB
Go

package models
import (
"fmt"
"github.com/golang-jwt/jwt/v5"
"golang.org/x/crypto/bcrypt"
"os"
"time"
"udemy_httpserver/db"
)
type User struct {
ID int
Name string `binding:"required" json:"name"`
Email string `binding:"required" json:"email"`
Password string `binding:"required" json:"password"`
}
func (u *User) New() error {
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost)
if err != nil {
fmt.Println("Something went wrong trying to hash a user password")
return err
}
u.Password = string(hashedPassword)
insertQuery := `INSERT INTO users (name, email, password)
VALUES (?, ?, ?)`
_, err = db.Conn.Exec(insertQuery, u.Name, u.Email, u.Password)
return nil
}
func FindOneByEmail(email string) (*User, error) {
selectQuery := `SELECT * FROM users WHERE email = ?`
dbResponse, err := db.Conn.Query(selectQuery, email)
if err != nil {
fmt.Println("Something went wrong trying to find a user")
return nil, err
}
if dbResponse.Next() {
var user User
err = dbResponse.Scan(&user.ID, &user.Name, &user.Email, &user.Password)
if err != nil {
fmt.Println("Something went wrong parsing the database row")
return nil, err
}
return &user, nil
}
return nil, nil
}
func (u *User) GetJWToken() (string, error) {
expirationDelta, err := time.ParseDuration(os.Getenv("AUTH_EXPIRATION"))
if err != nil {
fmt.Println("Something went wrong trying to parse AUTH_EXPIRATION env variable")
return "", err
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"sub": u.ID,
"exp": time.Now().Add(expirationDelta).Unix(),
})
tokenString, err := token.SignedString([]byte(os.Getenv("JWT_SECRET")))
if err != nil {
fmt.Println("Something went wrong trying to sign the token")
return "", err
}
return tokenString, nil
}