-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathworkflow_relative.go
112 lines (97 loc) · 3.62 KB
/
workflow_relative.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
package main
import (
"encoding/json"
"fmt"
"net/http"
"github.com/gin-gonic/gin"
"go.mongodb.org/mongo-driver/bson/primitive"
)
// relative wechat login
func relativeWeChatLoginHandler(ctx *gin.Context) {
params := ginContextRequestParameter(ctx)
response := GinResponse{
Status: http.StatusOK,
}
defer func() {
ginContextProcessResponse(ctx, &response)
}()
var relativeWeChatLoginInfo RelativeWeChatLoginInfo
var err error
if err = json.Unmarshal(params.Data, &relativeWeChatLoginInfo); err != nil {
response.Status = http.StatusBadRequest
response.Message = fmt.Sprintf("[%s] - %s", serverErrorMessages[seInputJSONNotValid], err.Error())
return
}
// check student relative wxID and binding code
wxLoginURL := fmt.Sprintf("%s?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code", serverConfig.RelativeWeChatLoginURL,
relativeWeChatLoginInfo.AppID, relativeWeChatLoginInfo.Secret, relativeWeChatLoginInfo.JSCode)
wxLoginResp, err := http.Get(wxLoginURL)
if err != nil {
response.Status = http.StatusBadRequest
response.Message = fmt.Sprintf("[%s] - Could not make wechat login request: %s", serverErrorMessages[seInputParamNotValid], err.Error())
return
}
var loginRespMap = map[string]interface{}{}
err = json.NewDecoder(wxLoginResp.Body).Decode(&loginRespMap)
if err != nil {
response.Status = http.StatusConflict
response.Message = fmt.Sprintf("[%s] - Could not retrieve wechat login response: %s", serverErrorMessages[seDataParseError], err.Error())
return
}
if _, errExist := loginRespMap["errcode"]; errExist {
response.Status = http.StatusConflict
response.Message = fmt.Sprintf("[%s] - WeChat login errcode: %v, errmsg: %v", serverErrorMessages[seWeChatLoginError], loginRespMap["errcode"], loginRespMap["errmsg"])
return
}
openID, openIDExist := loginRespMap["openid"]
if !openIDExist {
response.Status = http.StatusConflict
response.Message = fmt.Sprintf("[%s] - Could not retrieve WeChat OpenID", serverErrorMessages[seWeChatLoginError])
return
}
response.Payload = map[string]string{
"relative_wxid": fmt.Sprintf("%v", openID),
}
return
}
// relative search student
func relativeFindBoundStudentHandler(ctx *gin.Context) {
params := ginContextRequestParameter(ctx)
response := GinResponse{
Status: http.StatusOK,
}
defer func() {
ginContextProcessResponse(ctx, &response)
}()
var relativeWXIDMap = map[string]string{}
var err error
if err = json.Unmarshal(params.Data, &relativeWXIDMap); err != nil {
response.Status = http.StatusBadRequest
response.Message = fmt.Sprintf("[%s] - %s", serverErrorMessages[seInputJSONNotValid], err.Error())
return
}
relativeWXID, relativeWXIDExist := relativeWXIDMap["relative_wxid"]
if !relativeWXIDExist {
response.Status = http.StatusBadRequest
response.Message = fmt.Sprintf("[%s] - Could not retrieve relative_wxid", serverErrorMessages[seInputJSONNotValid])
return
}
// find relative by wechat id
var relativeFound *Relative
relativeFound, err = findRelativeByWXID(relativeWXID)
if err != nil || relativeFound == nil {
response.Status = http.StatusConflict
response.Message = fmt.Sprintf("[%s] - No relative found with wechat id \"%s\"", serverErrorMessages[seResourceNotFound], relativeWXID)
return
}
var references []*StudentRelativeRef
references, err = findStudentRelativeRef(primitive.NilObjectID, relativeFound.PID)
if err != nil {
response.Status = http.StatusConflict
response.Message = fmt.Sprintf("[%s] - %s -> could not search student-relative references with given relative_wxid %s",
serverErrorMessages[seResourceNotFound], err.Error(), relativeWXID)
return
}
response.Payload = references
return
}