-
Notifications
You must be signed in to change notification settings - Fork 6
/
login.go
106 lines (88 loc) · 2.23 KB
/
login.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
package auth
import (
"net/http"
"github.com/yaptide/app/model/auth"
"github.com/yaptide/app/web/auth/token"
"github.com/yaptide/app/web/server"
"github.com/yaptide/app/web/util"
)
type loginHandler struct {
*server.Context
}
func login(validateLogin, generateToken func() bool) {
ok := validateLogin()
if !ok {
return
}
_ = generateToken()
}
func (h *loginHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
requestAccount := &auth.Account{}
ok := util.DecodeJSONRequest(w, r, requestAccount)
if !ok {
return
}
dbSession := h.Db.Copy()
defer dbSession.Close()
var dbAccount *auth.Account
validateLogin := func() bool {
sendError := func(errorMap map[string]string) {
util.WriteJSONResponse(w, http.StatusNotFound, errorMap)
}
mapFields := map[string]string{}
// validate username
if requestAccount.Username == "" {
mapFields["username"] = "Username is required"
}
userWithUsername, userErr := dbSession.Account().FindByUsername(requestAccount.Username)
userWithEmail, emailErr := dbSession.Account().FindByEmail(requestAccount.Username)
switch {
case userErr != nil:
w.WriteHeader(http.StatusInternalServerError)
return false
case emailErr != nil:
w.WriteHeader(http.StatusInternalServerError)
return false
}
switch {
case userWithEmail != nil:
dbAccount = userWithEmail
case userWithUsername != nil:
dbAccount = userWithUsername
default:
mapFields["all"] = "Login or password incorrect"
sendError(mapFields)
return false
}
// validate password
if requestAccount.Password == "" {
mapFields["password"] = "Password is required"
}
ok := dbAccount.ComparePassword(requestAccount.Password)
if !ok {
mapFields["all"] = "Login or password incorrect"
}
if len(mapFields) != 0 {
sendError(mapFields)
return false
}
return true
}
generateToken := func() bool {
tokenString, err := token.Generate(dbAccount.ID, h.JWTKey)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
return false
}
dbAccount.Password = ""
response := &struct {
*auth.Account
Token string `json:"token"`
}{
dbAccount,
tokenString,
}
return util.WriteJSONResponse(w, http.StatusOK, response)
}
login(validateLogin, generateToken)
}