/
user.go
120 lines (97 loc) · 3.29 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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package forms
import (
"time"
"github.com/porter-dev/porter/internal/models"
"github.com/porter-dev/porter/internal/repository"
"golang.org/x/crypto/bcrypt"
"gorm.io/gorm"
)
// WriteUserForm is a generic form for write operations to the User model
type WriteUserForm interface {
ToUser(repo repository.UserRepository) (*models.User, error)
}
// CreateUserForm represents the accepted values for creating a user
type CreateUserForm struct {
WriteUserForm
Email string `json:"email" form:"required,max=255,email"`
Password string `json:"password" form:"required,max=255"`
// ignore this field from the json
EmailVerified bool `json:"-"`
}
// ToUser converts a CreateUserForm to models.User
func (cuf *CreateUserForm) ToUser(_ repository.UserRepository) (*models.User, error) {
hashed, err := bcrypt.GenerateFromPassword([]byte(cuf.Password), 8)
if err != nil {
return nil, err
}
return &models.User{
Email: cuf.Email,
Password: string(hashed),
EmailVerified: cuf.EmailVerified,
}, nil
}
// LoginUserForm represents the accepted values for logging a user in
type LoginUserForm struct {
WriteUserForm
ID uint `form:"required"`
Email string `json:"email" form:"required,max=255,email"`
Password string `json:"password" form:"required,max=255"`
}
// ToUser converts a LoginUserForm to models.User
func (luf *LoginUserForm) ToUser(_ repository.UserRepository) (*models.User, error) {
hashed, err := bcrypt.GenerateFromPassword([]byte(luf.Password), 8)
if err != nil {
return nil, err
}
return &models.User{
Email: luf.Email,
Password: string(hashed),
}, nil
}
// DeleteUserForm represents the accepted values for deleting a user
type DeleteUserForm struct {
WriteUserForm
ID uint `form:"required"`
Password string `json:"password" form:"required,max=255"`
}
// ToUser converts a DeleteUserForm to models.User using the user ID
func (uuf *DeleteUserForm) ToUser(_ repository.UserRepository) (*models.User, error) {
return &models.User{
Model: gorm.Model{
ID: uuf.ID,
},
}, nil
}
// InitiateResetUserPasswordForm represents the accepted values for resetting a user's password
type InitiateResetUserPasswordForm struct {
Email string `json:"email" form:"required"`
}
func (ruf *InitiateResetUserPasswordForm) ToPWResetToken() (*models.PWResetToken, string, error) {
expiry := time.Now().Add(30 * time.Minute)
rawToken := stringWithCharset(32, randCharset)
hashedToken, err := bcrypt.GenerateFromPassword([]byte(rawToken), 8)
if err != nil {
return nil, "", err
}
return &models.PWResetToken{
Email: ruf.Email,
IsValid: true,
Expiry: &expiry,
Token: string(hashedToken),
}, rawToken, nil
}
type VerifyResetUserPasswordForm struct {
Email string `json:"email" form:"required,max=255,email"`
PWResetTokenID uint `json:"token_id" form:"required"`
Token string `json:"token" form:"required"`
}
type FinalizeResetUserPasswordForm struct {
Email string `json:"email" form:"required,max=255,email"`
PWResetTokenID uint `json:"token_id" form:"required"`
Token string `json:"token" form:"required"`
NewPassword string `json:"new_password" form:"required,max=255"`
}
type FinalizeVerifyEmailForm struct {
TokenID uint `json:"token_id" form:"required"`
Token string `json:"token" form:"required"`
}