Skip to content

Commit e94f37f

Browse files
authored
Refactor webhook events (#33337)
Extract from #33320 This PR uses a map instead of a struct to store webhook event information. It removes many duplicated functions and makes the logic clearer.
1 parent 594b835 commit e94f37f

File tree

10 files changed

+176
-335
lines changed

10 files changed

+176
-335
lines changed

Diff for: models/webhook/webhook.go

+27-174
Original file line numberDiff line numberDiff line change
@@ -167,186 +167,39 @@ func (w *Webhook) UpdateEvent() error {
167167
return err
168168
}
169169

170-
// HasCreateEvent returns true if hook enabled create event.
171-
func (w *Webhook) HasCreateEvent() bool {
172-
return w.SendEverything ||
173-
(w.ChooseEvents && w.HookEvents.Create)
174-
}
175-
176-
// HasDeleteEvent returns true if hook enabled delete event.
177-
func (w *Webhook) HasDeleteEvent() bool {
178-
return w.SendEverything ||
179-
(w.ChooseEvents && w.HookEvents.Delete)
180-
}
181-
182-
// HasForkEvent returns true if hook enabled fork event.
183-
func (w *Webhook) HasForkEvent() bool {
184-
return w.SendEverything ||
185-
(w.ChooseEvents && w.HookEvents.Fork)
186-
}
187-
188-
// HasIssuesEvent returns true if hook enabled issues event.
189-
func (w *Webhook) HasIssuesEvent() bool {
190-
return w.SendEverything ||
191-
(w.ChooseEvents && w.HookEvents.Issues)
192-
}
193-
194-
// HasIssuesAssignEvent returns true if hook enabled issues assign event.
195-
func (w *Webhook) HasIssuesAssignEvent() bool {
196-
return w.SendEverything ||
197-
(w.ChooseEvents && w.HookEvents.IssueAssign)
198-
}
199-
200-
// HasIssuesLabelEvent returns true if hook enabled issues label event.
201-
func (w *Webhook) HasIssuesLabelEvent() bool {
202-
return w.SendEverything ||
203-
(w.ChooseEvents && w.HookEvents.IssueLabel)
204-
}
205-
206-
// HasIssuesMilestoneEvent returns true if hook enabled issues milestone event.
207-
func (w *Webhook) HasIssuesMilestoneEvent() bool {
208-
return w.SendEverything ||
209-
(w.ChooseEvents && w.HookEvents.IssueMilestone)
210-
}
211-
212-
// HasIssueCommentEvent returns true if hook enabled issue_comment event.
213-
func (w *Webhook) HasIssueCommentEvent() bool {
214-
return w.SendEverything ||
215-
(w.ChooseEvents && w.HookEvents.IssueComment)
216-
}
217-
218-
// HasPushEvent returns true if hook enabled push event.
219-
func (w *Webhook) HasPushEvent() bool {
220-
return w.PushOnly || w.SendEverything ||
221-
(w.ChooseEvents && w.HookEvents.Push)
222-
}
223-
224-
// HasPullRequestEvent returns true if hook enabled pull request event.
225-
func (w *Webhook) HasPullRequestEvent() bool {
226-
return w.SendEverything ||
227-
(w.ChooseEvents && w.HookEvents.PullRequest)
228-
}
229-
230-
// HasPullRequestAssignEvent returns true if hook enabled pull request assign event.
231-
func (w *Webhook) HasPullRequestAssignEvent() bool {
232-
return w.SendEverything ||
233-
(w.ChooseEvents && w.HookEvents.PullRequestAssign)
234-
}
235-
236-
// HasPullRequestLabelEvent returns true if hook enabled pull request label event.
237-
func (w *Webhook) HasPullRequestLabelEvent() bool {
238-
return w.SendEverything ||
239-
(w.ChooseEvents && w.HookEvents.PullRequestLabel)
240-
}
241-
242-
// HasPullRequestMilestoneEvent returns true if hook enabled pull request milestone event.
243-
func (w *Webhook) HasPullRequestMilestoneEvent() bool {
244-
return w.SendEverything ||
245-
(w.ChooseEvents && w.HookEvents.PullRequestMilestone)
246-
}
247-
248-
// HasPullRequestCommentEvent returns true if hook enabled pull_request_comment event.
249-
func (w *Webhook) HasPullRequestCommentEvent() bool {
250-
return w.SendEverything ||
251-
(w.ChooseEvents && w.HookEvents.PullRequestComment)
252-
}
253-
254-
// HasPullRequestApprovedEvent returns true if hook enabled pull request review event.
255-
func (w *Webhook) HasPullRequestApprovedEvent() bool {
256-
return w.SendEverything ||
257-
(w.ChooseEvents && w.HookEvents.PullRequestReview)
258-
}
259-
260-
// HasPullRequestRejectedEvent returns true if hook enabled pull request review event.
261-
func (w *Webhook) HasPullRequestRejectedEvent() bool {
262-
return w.SendEverything ||
263-
(w.ChooseEvents && w.HookEvents.PullRequestReview)
264-
}
265-
266-
// HasPullRequestReviewCommentEvent returns true if hook enabled pull request review event.
267-
func (w *Webhook) HasPullRequestReviewCommentEvent() bool {
268-
return w.SendEverything ||
269-
(w.ChooseEvents && w.HookEvents.PullRequestReview)
270-
}
271-
272-
// HasPullRequestSyncEvent returns true if hook enabled pull request sync event.
273-
func (w *Webhook) HasPullRequestSyncEvent() bool {
274-
return w.SendEverything ||
275-
(w.ChooseEvents && w.HookEvents.PullRequestSync)
276-
}
277-
278-
// HasWikiEvent returns true if hook enabled wiki event.
279-
func (w *Webhook) HasWikiEvent() bool {
280-
return w.SendEverything ||
281-
(w.ChooseEvents && w.HookEvent.Wiki)
282-
}
283-
284-
// HasReleaseEvent returns if hook enabled release event.
285-
func (w *Webhook) HasReleaseEvent() bool {
286-
return w.SendEverything ||
287-
(w.ChooseEvents && w.HookEvents.Release)
288-
}
289-
290-
// HasRepositoryEvent returns if hook enabled repository event.
291-
func (w *Webhook) HasRepositoryEvent() bool {
292-
return w.SendEverything ||
293-
(w.ChooseEvents && w.HookEvents.Repository)
294-
}
295-
296-
// HasPackageEvent returns if hook enabled package event.
297-
func (w *Webhook) HasPackageEvent() bool {
298-
return w.SendEverything ||
299-
(w.ChooseEvents && w.HookEvents.Package)
300-
}
301-
302-
// HasPullRequestReviewRequestEvent returns true if hook enabled pull request review request event.
303-
func (w *Webhook) HasPullRequestReviewRequestEvent() bool {
304-
return w.SendEverything ||
305-
(w.ChooseEvents && w.HookEvents.PullRequestReviewRequest)
306-
}
307-
308-
// EventCheckers returns event checkers
309-
func (w *Webhook) EventCheckers() []struct {
310-
Has func() bool
311-
Type webhook_module.HookEventType
312-
} {
313-
return []struct {
314-
Has func() bool
315-
Type webhook_module.HookEventType
316-
}{
317-
{w.HasCreateEvent, webhook_module.HookEventCreate},
318-
{w.HasDeleteEvent, webhook_module.HookEventDelete},
319-
{w.HasForkEvent, webhook_module.HookEventFork},
320-
{w.HasPushEvent, webhook_module.HookEventPush},
321-
{w.HasIssuesEvent, webhook_module.HookEventIssues},
322-
{w.HasIssuesAssignEvent, webhook_module.HookEventIssueAssign},
323-
{w.HasIssuesLabelEvent, webhook_module.HookEventIssueLabel},
324-
{w.HasIssuesMilestoneEvent, webhook_module.HookEventIssueMilestone},
325-
{w.HasIssueCommentEvent, webhook_module.HookEventIssueComment},
326-
{w.HasPullRequestEvent, webhook_module.HookEventPullRequest},
327-
{w.HasPullRequestAssignEvent, webhook_module.HookEventPullRequestAssign},
328-
{w.HasPullRequestLabelEvent, webhook_module.HookEventPullRequestLabel},
329-
{w.HasPullRequestMilestoneEvent, webhook_module.HookEventPullRequestMilestone},
330-
{w.HasPullRequestCommentEvent, webhook_module.HookEventPullRequestComment},
331-
{w.HasPullRequestApprovedEvent, webhook_module.HookEventPullRequestReviewApproved},
332-
{w.HasPullRequestRejectedEvent, webhook_module.HookEventPullRequestReviewRejected},
333-
{w.HasPullRequestCommentEvent, webhook_module.HookEventPullRequestReviewComment},
334-
{w.HasPullRequestSyncEvent, webhook_module.HookEventPullRequestSync},
335-
{w.HasWikiEvent, webhook_module.HookEventWiki},
336-
{w.HasRepositoryEvent, webhook_module.HookEventRepository},
337-
{w.HasReleaseEvent, webhook_module.HookEventRelease},
338-
{w.HasPackageEvent, webhook_module.HookEventPackage},
339-
{w.HasPullRequestReviewRequestEvent, webhook_module.HookEventPullRequestReviewRequest},
170+
func (w *Webhook) HasEvent(evt webhook_module.HookEventType) bool {
171+
if w.SendEverything {
172+
return true
340173
}
174+
if w.PushOnly {
175+
return evt == webhook_module.HookEventPush
176+
}
177+
checkEvt := evt
178+
switch evt {
179+
case webhook_module.HookEventPullRequestReviewApproved, webhook_module.HookEventPullRequestReviewRejected, webhook_module.HookEventPullRequestReviewComment:
180+
checkEvt = webhook_module.HookEventPullRequestReview
181+
}
182+
return w.HookEvents[checkEvt]
341183
}
342184

343185
// EventsArray returns an array of hook events
344186
func (w *Webhook) EventsArray() []string {
345-
events := make([]string, 0, 7)
187+
if w.SendEverything {
188+
events := make([]string, 0, len(webhook_module.AllEvents()))
189+
for _, evt := range webhook_module.AllEvents() {
190+
events = append(events, string(evt))
191+
}
192+
return events
193+
}
194+
195+
if w.PushOnly {
196+
return []string{string(webhook_module.HookEventPush)}
197+
}
346198

347-
for _, c := range w.EventCheckers() {
348-
if c.Has() {
349-
events = append(events, string(c.Type))
199+
events := make([]string, 0, len(w.HookEvents))
200+
for event, enabled := range w.HookEvents {
201+
if enabled {
202+
events = append(events, string(event))
350203
}
351204
}
352205
return events

Diff for: models/webhook/webhook_test.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,9 @@ func TestWebhook_UpdateEvent(t *testing.T) {
5454
SendEverything: false,
5555
ChooseEvents: false,
5656
HookEvents: webhook_module.HookEvents{
57-
Create: false,
58-
Push: true,
59-
PullRequest: false,
57+
webhook_module.HookEventCreate: false,
58+
webhook_module.HookEventPush: true,
59+
webhook_module.HookEventPullRequest: false,
6060
},
6161
}
6262
webhook.HookEvent = hookEvent
@@ -68,13 +68,13 @@ func TestWebhook_UpdateEvent(t *testing.T) {
6868
}
6969

7070
func TestWebhook_EventsArray(t *testing.T) {
71-
assert.Equal(t, []string{
71+
assert.EqualValues(t, []string{
7272
"create", "delete", "fork", "push",
7373
"issues", "issue_assign", "issue_label", "issue_milestone", "issue_comment",
7474
"pull_request", "pull_request_assign", "pull_request_label", "pull_request_milestone",
7575
"pull_request_comment", "pull_request_review_approved", "pull_request_review_rejected",
76-
"pull_request_review_comment", "pull_request_sync", "wiki", "repository", "release",
77-
"package", "pull_request_review_request",
76+
"pull_request_review_comment", "pull_request_sync", "pull_request_review_request", "wiki", "repository", "release",
77+
"package", "status",
7878
},
7979
(&Webhook{
8080
HookEvent: &webhook_module.HookEvent{SendEverything: true},

Diff for: modules/webhook/events.go

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Copyright 2025 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package webhook
5+
6+
type HookEvents map[HookEventType]bool
7+
8+
func (he HookEvents) Get(evt HookEventType) bool {
9+
return he[evt]
10+
}
11+
12+
// HookEvent represents events that will delivery hook.
13+
type HookEvent struct {
14+
PushOnly bool `json:"push_only"`
15+
SendEverything bool `json:"send_everything"`
16+
ChooseEvents bool `json:"choose_events"`
17+
BranchFilter string `json:"branch_filter"`
18+
19+
HookEvents `json:"events"`
20+
}

Diff for: modules/webhook/structs.go

-39
This file was deleted.

Diff for: modules/webhook/type.go

+37-16
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,47 @@ const (
3131
HookEventRepository HookEventType = "repository"
3232
HookEventRelease HookEventType = "release"
3333
HookEventPackage HookEventType = "package"
34-
HookEventSchedule HookEventType = "schedule"
3534
HookEventStatus HookEventType = "status"
35+
// once a new event added here, please also added to AllEvents() function
36+
37+
// FIXME: This event should be a group of pull_request_review_xxx events
38+
HookEventPullRequestReview HookEventType = "pull_request_review"
39+
// Actions event only
40+
HookEventSchedule HookEventType = "schedule"
3641
)
3742

43+
func AllEvents() []HookEventType {
44+
return []HookEventType{
45+
HookEventCreate,
46+
HookEventDelete,
47+
HookEventFork,
48+
HookEventPush,
49+
HookEventIssues,
50+
HookEventIssueAssign,
51+
HookEventIssueLabel,
52+
HookEventIssueMilestone,
53+
HookEventIssueComment,
54+
HookEventPullRequest,
55+
HookEventPullRequestAssign,
56+
HookEventPullRequestLabel,
57+
HookEventPullRequestMilestone,
58+
HookEventPullRequestComment,
59+
HookEventPullRequestReviewApproved,
60+
HookEventPullRequestReviewRejected,
61+
HookEventPullRequestReviewComment,
62+
HookEventPullRequestSync,
63+
HookEventPullRequestReviewRequest,
64+
HookEventWiki,
65+
HookEventRepository,
66+
HookEventRelease,
67+
HookEventPackage,
68+
HookEventStatus,
69+
}
70+
}
71+
3872
// Event returns the HookEventType as an event string
3973
func (h HookEventType) Event() string {
4074
switch h {
41-
case HookEventCreate:
42-
return "create"
43-
case HookEventDelete:
44-
return "delete"
45-
case HookEventFork:
46-
return "fork"
47-
case HookEventPush:
48-
return "push"
4975
case HookEventIssues, HookEventIssueAssign, HookEventIssueLabel, HookEventIssueMilestone:
5076
return "issues"
5177
case HookEventPullRequest, HookEventPullRequestAssign, HookEventPullRequestLabel, HookEventPullRequestMilestone,
@@ -59,14 +85,9 @@ func (h HookEventType) Event() string {
5985
return "pull_request_rejected"
6086
case HookEventPullRequestReviewComment:
6187
return "pull_request_comment"
62-
case HookEventWiki:
63-
return "wiki"
64-
case HookEventRepository:
65-
return "repository"
66-
case HookEventRelease:
67-
return "release"
88+
default:
89+
return string(h)
6890
}
69-
return ""
7091
}
7192

7293
func (h HookEventType) IsPullRequest() bool {

0 commit comments

Comments
 (0)