forked from Massad/gin-boilerplate
-
Notifications
You must be signed in to change notification settings - Fork 0
/
user.go
92 lines (68 loc) · 2.42 KB
/
user.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package models
import (
"errors"
"github.com/pjcalvo/gin-boilerplate/db"
"github.com/pjcalvo/gin-boilerplate/forms"
"golang.org/x/crypto/bcrypt"
)
//User ...
type User struct {
ID int64 `db:"id, primarykey, autoincrement" json:"id"`
Email string `db:"email" json:"email"`
Password string `db:"password" json:"-"`
Name string `db:"name" json:"name"`
UpdatedAt int64 `db:"updated_at" json:"-"`
CreatedAt int64 `db:"created_at" json:"-"`
}
//UserModel ...
type UserModel struct{}
var authModel = new(AuthModel)
//Login ...
func (m UserModel) Login(form forms.LoginForm) (user User, token Token, err error) {
err = db.GetDB().SelectOne(&user, "SELECT id, email, password, name, updated_at, created_at FROM public.user WHERE LOWER(email)=LOWER($1) LIMIT 1", form.Email)
if err != nil {
return user, token, err
}
//Compare the password form and database if match
bytePassword := []byte(form.Password)
byteHashedPassword := []byte(user.Password)
err = bcrypt.CompareHashAndPassword(byteHashedPassword, bytePassword)
if err != nil {
return user, token, errors.New("Invalid password")
}
//Generate the JWT auth token
tokenDetails, err := authModel.CreateToken(user.ID)
saveErr := authModel.CreateAuth(user.ID, tokenDetails)
if saveErr == nil {
token.AccessToken = tokenDetails.AccessToken
token.RefreshToken = tokenDetails.RefreshToken
}
return user, token, nil
}
//Register ...
func (m UserModel) Register(form forms.RegisterForm) (user User, err error) {
getDb := db.GetDB()
//Check if the user exists in database
checkUser, err := getDb.SelectInt("SELECT count(id) FROM public.user WHERE email=LOWER($1) LIMIT 1", form.Email)
if err != nil {
return user, err
}
if checkUser > 0 {
return user, errors.New("User already exists")
}
bytePassword := []byte(form.Password)
hashedPassword, err := bcrypt.GenerateFromPassword(bytePassword, bcrypt.DefaultCost)
if err != nil {
panic(err) //Something really went wrong here...
}
//Create the user and return back the user ID
err = getDb.QueryRow("INSERT INTO public.user(email, password, name) VALUES($1, $2, $3) RETURNING id", form.Email, string(hashedPassword), form.Name).Scan(&user.ID)
user.Name = form.Name
user.Email = form.Email
return user, err
}
//One ...
func (m UserModel) One(userID int64) (user User, err error) {
err = db.GetDB().SelectOne(&user, "SELECT id, email, name FROM public.user WHERE id=$1", userID)
return user, err
}