Skip to content

Commit 63abea2

Browse files
feat:[CDS-101592]: Add support for parsing Gitlab System Hooks (#324)
1 parent 607a215 commit 63abea2

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed

scm/driver/gitlab/webhook.go

+27
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ func (s *webhookService) Parse(req *http.Request, fn scm.SecretFunc) (scm.Webhoo
3939
hook, err = parsePullRequestHook(data)
4040
case "Note Hook":
4141
hook, err = parseIssueCommentHook(data)
42+
case "System Hook":
43+
hook, err = parseSystemHook(data)
4244
default:
4345
return nil, scm.ErrUnknownEvent
4446
}
@@ -63,6 +65,26 @@ func (s *webhookService) Parse(req *http.Request, fn scm.SecretFunc) (scm.Webhoo
6365
return hook, nil
6466
}
6567

68+
func parseSystemHook(data []byte) (scm.Webhook, error) {
69+
src := new(event)
70+
err := json.Unmarshal(data, src)
71+
if err != nil {
72+
return nil, err
73+
}
74+
switch src.ObjectKind {
75+
case "push", "tag_push":
76+
return parsePushHook(data)
77+
case "issue":
78+
return nil, scm.ErrUnknownEvent
79+
case "merge_request":
80+
return parsePullRequestHook(data)
81+
case "note":
82+
return parseIssueCommentHook(data)
83+
default:
84+
return nil, scm.ErrUnknownEvent
85+
}
86+
}
87+
6688
func parseIssueCommentHook(data []byte) (scm.Webhook, error) {
6789
src := new(commentHook)
6890
err := json.Unmarshal(data, src)
@@ -399,6 +421,11 @@ func parseTimeString(timeString string) time.Time {
399421
}
400422

401423
type (
424+
// Generic struct to detect event type
425+
event struct {
426+
ObjectKind string `json:"object_kind"`
427+
}
428+
402429
pushHook struct {
403430
ObjectKind string `json:"object_kind"`
404431
EventName string `json:"event_name"`

scm/driver/gitlab/webhook_test.go

+67
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,18 @@ func TestWebhooks(t *testing.T) {
3838
after: "testdata/webhooks/branch_delete.json.golden",
3939
obj: new(scm.BranchHook),
4040
},
41+
{
42+
event: "System Hook",
43+
before: "testdata/webhooks/branch_create.json",
44+
after: "testdata/webhooks/branch_create.json.golden",
45+
obj: new(scm.PushHook),
46+
},
47+
{
48+
event: "System Hook",
49+
before: "testdata/webhooks/branch_delete.json",
50+
after: "testdata/webhooks/branch_delete.json.golden",
51+
obj: new(scm.BranchHook),
52+
},
4153
// tag hooks
4254
{
4355
event: "Tag Push Hook",
@@ -51,13 +63,31 @@ func TestWebhooks(t *testing.T) {
5163
after: "testdata/webhooks/tag_delete.json.golden",
5264
obj: new(scm.TagHook),
5365
},
66+
{
67+
event: "System Hook",
68+
before: "testdata/webhooks/tag_create.json",
69+
after: "testdata/webhooks/tag_create.json.golden",
70+
obj: new(scm.PushHook),
71+
},
72+
{
73+
event: "System Hook",
74+
before: "testdata/webhooks/tag_delete.json",
75+
after: "testdata/webhooks/tag_delete.json.golden",
76+
obj: new(scm.TagHook),
77+
},
5478
// push hooks
5579
{
5680
event: "Push Hook",
5781
before: "testdata/webhooks/push.json",
5882
after: "testdata/webhooks/push.json.golden",
5983
obj: new(scm.PushHook),
6084
},
85+
{
86+
event: "System Hook",
87+
before: "testdata/webhooks/push.json",
88+
after: "testdata/webhooks/push.json.golden",
89+
obj: new(scm.PushHook),
90+
},
6191
// // issue hooks
6292
// {
6393
// event: "issues",
@@ -79,6 +109,13 @@ func TestWebhooks(t *testing.T) {
79109
after: "testdata/webhooks/pull_request_create.json.golden",
80110
obj: new(scm.PullRequestHook),
81111
},
112+
{
113+
event: "System Hook",
114+
before: "testdata/webhooks/pull_request_create.json",
115+
after: "testdata/webhooks/pull_request_create.json.golden",
116+
obj: new(scm.PullRequestHook),
117+
},
118+
82119
// {
83120
// event: "Merge Request Hook",
84121
// before: "testdata/webhooks/pull_request_edited.json",
@@ -115,13 +152,43 @@ func TestWebhooks(t *testing.T) {
115152
after: "testdata/webhooks/pull_request_merge.json.golden",
116153
obj: new(scm.PullRequestHook),
117154
},
155+
{
156+
event: "System Hook",
157+
before: "testdata/webhooks/pull_request_close.json",
158+
after: "testdata/webhooks/pull_request_close.json.golden",
159+
obj: new(scm.PullRequestHook),
160+
},
161+
{
162+
event: "System Hook",
163+
before: "testdata/webhooks/pull_request_review_ready.json",
164+
after: "testdata/webhooks/pull_request_review_ready.json.golden",
165+
obj: new(scm.PullRequestHook),
166+
},
167+
{
168+
event: "System Hook",
169+
before: "testdata/webhooks/pull_request_reopen.json",
170+
after: "testdata/webhooks/pull_request_reopen.json.golden",
171+
obj: new(scm.PullRequestHook),
172+
},
173+
{
174+
event: "System Hook",
175+
before: "testdata/webhooks/pull_request_merge.json",
176+
after: "testdata/webhooks/pull_request_merge.json.golden",
177+
obj: new(scm.PullRequestHook),
178+
},
118179
// Note hook for Gitlab Merge Request comment
119180
{
120181
event: "Note Hook",
121182
before: "testdata/webhooks/merge_request_comment_create.json",
122183
after: "testdata/webhooks/merge_request_comment_create.json.golden",
123184
obj: new(scm.IssueCommentHook),
124185
},
186+
{
187+
event: "System Hook",
188+
before: "testdata/webhooks/merge_request_comment_create.json",
189+
after: "testdata/webhooks/merge_request_comment_create.json.golden",
190+
obj: new(scm.IssueCommentHook),
191+
},
125192
}
126193

127194
for _, test := range tests {

0 commit comments

Comments
 (0)