forked from mattermost/mattermost-plugin-gitlab
-
Notifications
You must be signed in to change notification settings - Fork 0
/
webhook.go
135 lines (116 loc) · 3.55 KB
/
webhook.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
package webhook
import (
"fmt"
"strings"
"github.com/manland/mattermost-plugin-gitlab/server/subscription"
"github.com/manland/go-gitlab"
)
// GitlabRetreiver return infos of current gitlab instance
type GitlabRetreiver interface {
// GetUserURL return the url of this gitlab user depending on domain instance (e.g. https://gitlab.com/username)
GetUserURL(username string) string
// GetUsernameById return a username by gitlab id
GetUsernameByID(id int) string
// ParseGitlabUsernamesFromText from a text return an array of username
ParseGitlabUsernamesFromText(text string) []string
// GetSubscribedChannelsForRepository return all subscription for this repository
GetSubscribedChannelsForRepository(repoWithNamespace string, isPublicVisibility bool) []*subscription.Subscription
}
type HandleWebhook struct {
Message string
From string
ToUsers []string
ToChannels []string
}
type Webhook interface {
HandleIssue(event *gitlab.IssueEvent) ([]*HandleWebhook, error)
HandleMergeRequest(event *gitlab.MergeEvent) ([]*HandleWebhook, error)
HandleIssueComment(event *gitlab.IssueCommentEvent) ([]*HandleWebhook, error)
HandleMergeRequestComment(event *gitlab.MergeCommentEvent) ([]*HandleWebhook, error)
HandlePipeline(event *gitlab.PipelineEvent) ([]*HandleWebhook, error)
HandleTag(event *gitlab.TagEvent) ([]*HandleWebhook, error)
HandlePush(event *gitlab.PushEvent) ([]*HandleWebhook, error)
}
type webhook struct {
gitlabRetreiver GitlabRetreiver
}
func NewWebhook(g GitlabRetreiver) Webhook {
return &webhook{gitlabRetreiver: g}
}
func cleanWebhookHandlers(handlers []*HandleWebhook) []*HandleWebhook {
res := make([]*HandleWebhook, 0)
for _, handle := range handlers {
res = append(res, cleanWebhookHandlerTo(handle))
}
return res
}
func cleanWebhookHandlerTo(handler *HandleWebhook) *HandleWebhook {
users := map[string]bool{}
for _, v := range handler.ToUsers {
if handler.From != v && v != "" { // don't send message to author or unknown user
users[v] = true
}
}
cleanedUsers := []string{}
for key := range users {
cleanedUsers = append(cleanedUsers, key)
}
channels := map[string]bool{}
for _, v := range handler.ToChannels {
channels[v] = true
}
cleanedChannels := []string{}
for key := range channels {
cleanedChannels = append(cleanedChannels, key)
}
return &HandleWebhook{
From: handler.From,
Message: handler.Message,
ToUsers: cleanedUsers,
ToChannels: cleanedChannels,
}
}
type mentionDetails struct {
senderUsername string
pathWithNamespace string
IID string
URL string
body string
}
func (w *webhook) handleMention(m mentionDetails) *HandleWebhook {
mentionedUsernames := w.gitlabRetreiver.ParseGitlabUsernamesFromText(m.body)
if len(mentionedUsernames) > 0 {
return &HandleWebhook{
From: m.senderUsername,
Message: fmt.Sprintf("[%s](%s) mentioned you on [%s#%s](%s):\n>%s", m.senderUsername, w.gitlabRetreiver.GetUserURL(m.senderUsername), m.pathWithNamespace, m.IID, m.URL, m.body),
ToUsers: mentionedUsernames,
}
}
return nil
}
func sameLabels(a []gitlab.Label, b []gitlab.Label) bool {
if len(a) != len(b) {
return false
}
for index, l := range a {
if l.ID != b[index].ID {
return false
}
}
return true
}
func containsLabel(a []gitlab.Label, labelName string) bool {
for _, l := range a {
if l.Name == labelName {
return true
}
}
return false
}
func labelToString(a []gitlab.Label) string {
names := make([]string, len(a))
for index, l := range a {
names[index] = l.Name
}
return strings.Join(names, ", ")
}