Skip to content

Commit 636ced9

Browse files
committed
refactor webhook
1 parent 7719009 commit 636ced9

File tree

9 files changed

+116
-38
lines changed

9 files changed

+116
-38
lines changed

modules/webhook/deliver.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,8 +215,8 @@ func webhookProxy() func(req *http.Request) (*url.URL, error) {
215215
}
216216
}
217217

218-
// InitDeliverHooks starts the hooks delivery thread
219-
func InitDeliverHooks() {
218+
// initDeliverHooks starts the hooks delivery thread
219+
func initDeliverHooks() {
220220
timeout := time.Duration(setting.Webhook.DeliverTimeout) * time.Second
221221

222222
webhookHTTPClient = &http.Client{

modules/webhook/dingtalk.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -392,8 +392,17 @@ func getDingtalkReleasePayload(p *api.ReleasePayload) (*DingtalkPayload, error)
392392
return nil, nil
393393
}
394394

395-
// GetDingtalkPayload converts a ding talk webhook into a DingtalkPayload
396-
func GetDingtalkPayload(p api.Payloader, event models.HookEventType, meta string) (*DingtalkPayload, error) {
395+
type DingtalkWebhookType struct {
396+
}
397+
398+
var _ WebhookType = &DingtalkWebhookType{}
399+
400+
func (dingtalkType *DingtalkWebhookType) Name() string {
401+
return "dingtalk"
402+
}
403+
404+
// GetPayload converts a ding talk webhook into a DingtalkPayload
405+
func (dingtalkType *DingtalkWebhookType) GetPayload(p api.Payloader, event models.HookEventType, meta string) (api.Payloader, error) {
397406
s := new(DingtalkPayload)
398407

399408
switch event {

modules/webhook/discord.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -544,8 +544,17 @@ func getDiscordReleasePayload(p *api.ReleasePayload, meta *DiscordMeta) (*Discor
544544
}, nil
545545
}
546546

547-
// GetDiscordPayload converts a discord webhook into a DiscordPayload
548-
func GetDiscordPayload(p api.Payloader, event models.HookEventType, meta string) (*DiscordPayload, error) {
547+
type DiscordWebhookType struct {
548+
}
549+
550+
var _ WebhookType = &DiscordWebhookType{}
551+
552+
func (discordType *DiscordWebhookType) Name() string {
553+
return "discord"
554+
}
555+
556+
// GetPayload converts a discord webhook into a DiscordPayload
557+
func (discordType *DiscordWebhookType) GetPayload(p api.Payloader, event models.HookEventType, meta string) (api.Payloader, error) {
549558
s := new(DiscordPayload)
550559

551560
discord := &DiscordMeta{}

modules/webhook/msteams.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -699,8 +699,17 @@ func getMSTeamsReleasePayload(p *api.ReleasePayload) (*MSTeamsPayload, error) {
699699
}, nil
700700
}
701701

702-
// GetMSTeamsPayload converts a MSTeams webhook into a MSTeamsPayload
703-
func GetMSTeamsPayload(p api.Payloader, event models.HookEventType, meta string) (*MSTeamsPayload, error) {
702+
type MSTeamsWebhookType struct {
703+
}
704+
705+
var _ WebhookType = &MSTeamsWebhookType{}
706+
707+
func (msteamsType *MSTeamsWebhookType) Name() string {
708+
return "msteams"
709+
}
710+
711+
// GetPayload converts a MSTeams webhook into a MSTeamsPayload
712+
func (msteamsType *MSTeamsWebhookType) GetPayload(p api.Payloader, event models.HookEventType, meta string) (api.Payloader, error) {
704713
s := new(MSTeamsPayload)
705714

706715
switch event {

modules/webhook/slack.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -398,8 +398,17 @@ func getSlackRepositoryPayload(p *api.RepositoryPayload, slack *SlackMeta) (*Sla
398398
}, nil
399399
}
400400

401-
// GetSlackPayload converts a slack webhook into a SlackPayload
402-
func GetSlackPayload(p api.Payloader, event models.HookEventType, meta string) (*SlackPayload, error) {
401+
type SlackWebhookType struct {
402+
}
403+
404+
var _ WebhookType = &SlackWebhookType{}
405+
406+
func (slackType *SlackWebhookType) Name() string {
407+
return "slack"
408+
}
409+
410+
// GetPayload converts a slack webhook into a SlackPayload
411+
func (slackType *SlackWebhookType) GetPayload(p api.Payloader, event models.HookEventType, meta string) (api.Payloader, error) {
403412
s := new(SlackPayload)
404413

405414
slack := &SlackMeta{}

modules/webhook/telegram.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -307,8 +307,17 @@ func getTelegramReleasePayload(p *api.ReleasePayload) (*TelegramPayload, error)
307307
return nil, nil
308308
}
309309

310-
// GetTelegramPayload converts a telegram webhook into a TelegramPayload
311-
func GetTelegramPayload(p api.Payloader, event models.HookEventType, meta string) (*TelegramPayload, error) {
310+
type TelegramWebhookType struct {
311+
}
312+
313+
var _ WebhookType = &TelegramWebhookType{}
314+
315+
func (telegramType *TelegramWebhookType) Name() string {
316+
return "telegram"
317+
}
318+
319+
// GetPayload converts a telegram webhook into a TelegramPayload
320+
func (telegramType *TelegramWebhookType) GetPayload(p api.Payloader, event models.HookEventType, meta string) (api.Payloader, error) {
312321
s := new(TelegramPayload)
313322

314323
switch event {

modules/webhook/webhook.go

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -88,33 +88,13 @@ func prepareWebhook(w *models.Webhook, repo *models.Repository, event models.Hoo
8888
var payloader api.Payloader
8989
var err error
9090
// Use separate objects so modifications won't be made on payload on non-Gogs/Gitea type hooks.
91-
switch w.HookTaskType {
92-
case models.SLACK:
93-
payloader, err = GetSlackPayload(p, event, w.Meta)
91+
webhookType, ok := webhookTypes[w.HookTaskType.Name()]
92+
if ok {
93+
payloader, err = webhookType.GetPayload(p, event, w.Meta)
9494
if err != nil {
95-
return fmt.Errorf("GetSlackPayload: %v", err)
95+
return fmt.Errorf("GetPayload: %v", err)
9696
}
97-
case models.DISCORD:
98-
payloader, err = GetDiscordPayload(p, event, w.Meta)
99-
if err != nil {
100-
return fmt.Errorf("GetDiscordPayload: %v", err)
101-
}
102-
case models.DINGTALK:
103-
payloader, err = GetDingtalkPayload(p, event, w.Meta)
104-
if err != nil {
105-
return fmt.Errorf("GetDingtalkPayload: %v", err)
106-
}
107-
case models.TELEGRAM:
108-
payloader, err = GetTelegramPayload(p, event, w.Meta)
109-
if err != nil {
110-
return fmt.Errorf("GetTelegramPayload: %v", err)
111-
}
112-
case models.MSTEAMS:
113-
payloader, err = GetMSTeamsPayload(p, event, w.Meta)
114-
if err != nil {
115-
return fmt.Errorf("GetMSTeamsPayload: %v", err)
116-
}
117-
default:
97+
} else {
11898
p.SetSecret(w.Secret)
11999
payloader = p
120100
}
@@ -187,3 +167,18 @@ func prepareWebhooks(repo *models.Repository, event models.HookEventType, p api.
187167
}
188168
return nil
189169
}
170+
171+
// Init initlize
172+
func Init() error {
173+
for _, tp := range setting.Webhook.Types {
174+
for _, wt := range defaultWebhookTypes {
175+
if strings.EqualFold(wt.Name(), tp) {
176+
RegisterWebhookType(wt)
177+
break
178+
}
179+
}
180+
}
181+
182+
initDeliverHooks()
183+
return nil
184+
}

modules/webhook/webhook_type.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright 2019 The Gitea Authors. All rights reserved.
2+
// Use of this source code is governed by a MIT-style
3+
// license that can be found in the LICENSE file.
4+
5+
package webhook
6+
7+
import (
8+
"code.gitea.io/gitea/models"
9+
api "code.gitea.io/gitea/modules/structs"
10+
)
11+
12+
// WebhookType represents a webhook type, all webhook types should implement this interface
13+
type WebhookType interface {
14+
Name() string
15+
GetPayload(p api.Payloader, event models.HookEventType, meta string) (api.Payloader, error)
16+
}
17+
18+
var (
19+
webhookTypes map[string]WebhookType
20+
defaultWebhookTypes = []WebhookType{
21+
&SlackWebhookType{},
22+
&TelegramWebhookType{},
23+
&DingtalkWebhookType{},
24+
&DiscordWebhookType{},
25+
&MSTeamsWebhookType{},
26+
}
27+
)
28+
29+
func init() {
30+
webhookTypes = make(map[string]WebhookType)
31+
}
32+
33+
// RegisterWebhookType register a webhook type
34+
func RegisterWebhookType(t WebhookType) {
35+
webhookTypes[t.Name()] = t
36+
}

routers/init.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,9 @@ func GlobalInit() {
102102
issue_indexer.InitIssueIndexer(false)
103103
models.InitRepoIndexer()
104104
mirror_service.InitSyncMirrors()
105-
webhook.InitDeliverHooks()
105+
if err := webhook.Init(); err != nil {
106+
log.Fatal("Failed to initialize webhook: %v", err)
107+
}
106108
models.InitTestPullRequests()
107109
if err := task.Init(); err != nil {
108110
log.Fatal("Failed to initialize task scheduler: %v", err)

0 commit comments

Comments
 (0)