-
Notifications
You must be signed in to change notification settings - Fork 4
/
route.go
143 lines (126 loc) · 3.3 KB
/
route.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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package main
import (
"github.com/gin-gonic/gin"
"log"
"sonar-webhook/sdks/sonar"
)
// 路由配置
func initRoute(g *gin.Engine) {
g.POST("/dingtalk/robot", DingTalkRobotHandle)
g.POST("/wecom/robot", WeComRobotHandle)
g.POST("/wecom/message", WeComMessageHandle)
g.POST("/feishu/robot", FeiShuRobotHandle)
g.POST("/feishu/message", FeiShuMessageHandle)
}
// DingTalkRobotHandle 钉钉机器人通知处理方法
func DingTalkRobotHandle(c *gin.Context) {
robotHandle(c, SendDingTalkRobotMessage)
}
// WeComRobotHandle 企微机器人处理方法
func WeComRobotHandle(c *gin.Context) {
robotHandle(c, SendWeComRobotMessage)
}
// FeiShuRobotHandle 飞书器人通知处理方法
func FeiShuRobotHandle(c *gin.Context) {
robotHandle(c, FeiShuRobotMessage)
}
func robotHandle(c *gin.Context, sender RobotMessageSender) {
// 参数绑定
p := new(RobotWebhookParameters)
err := c.BindQuery(p)
if err != nil {
c.JSON(400, NewResultFail(400, "bind parameter failed: "+err.Error()))
return
}
data := new(sonar.WebhookData)
err = c.BindJSON(data)
if err != nil {
c.JSON(400, NewResultFail(400, "parse request body error: "+err.Error()))
return
}
// 成功跳过
if data.IsQualityGateSuccess() && p.SkipSuccess {
log.Printf("skip send message when quality gate success")
return
}
err = sender(p, data)
if err != nil {
c.JSON(500, NewResultFail(1, "request third failed: "+err.Error()))
return
}
c.JSON(200, NewResultOkEmpty())
}
// WeComMessageHandle 企微应用消息通知处理方法
func WeComMessageHandle(c *gin.Context) {
// 参数绑定
p := new(WeComMessageParameters)
err := c.BindQuery(p)
if err != nil {
c.JSON(400, NewResultFail(400, "bind parameter failed: "+err.Error()))
return
}
data := new(sonar.WebhookData)
err = c.BindJSON(data)
if err != nil {
c.JSON(400, NewResultFail(400, "parse request body json error: "+err.Error()))
return
}
// 成功跳过
if data.IsQualityGateSuccess() && p.SkipSuccess {
log.Printf("skip send message when quality gate success")
return
}
err = SendWeComMessage(p, data)
if err != nil {
c.JSON(500, NewResultFail(1, "request third failed: "+err.Error()))
return
}
c.JSON(200, NewResultOkEmpty())
}
// FeiShuMessageHandle 企微应用消息通知处理方法
func FeiShuMessageHandle(c *gin.Context) {
// 参数绑定
p := new(FeiShuMessageParameters)
err := c.BindQuery(p)
if err != nil {
c.JSON(400, NewResultFail(400, "bind parameter failed: "+err.Error()))
return
}
data := new(sonar.WebhookData)
err = c.BindJSON(data)
if err != nil {
c.JSON(400, NewResultFail(400, "parse request body json error: "+err.Error()))
return
}
// 成功跳过
if data.IsQualityGateSuccess() && p.SkipSuccess {
log.Printf("skip send message when quality gate success")
return
}
err = SendFeiShuMessage(p, data)
if err != nil {
c.JSON(500, NewResultFail(1, "request third failed: "+err.Error()))
return
}
c.JSON(200, NewResultOkEmpty())
}
// Result 接口层响应数据
type Result struct {
Code int `json:"code"` // 错误码
Msg string `json:"msg"` // 提示消息
Data interface{} `json:"data"` // 数据
}
func NewResultFail(code int, msg string) *Result {
return &Result{
Code: code,
Msg: msg,
Data: nil,
}
}
func NewResultOkEmpty() *Result {
return &Result{
Code: 0,
Msg: "ok",
Data: nil,
}
}