Skip to content

Commit 0f12ca9

Browse files
earl-warrenLoïc Dachary
authored andcommitted
[BRANDING] define the forgejo webhook type
templates/swagger/v1_json.tmpl updated with `make generate-swagger` (cherry picked from commit 0f9842fc582057068e907ef2c7b3129848288f56)
1 parent fd24503 commit 0f12ca9

File tree

13 files changed

+136
-11
lines changed

13 files changed

+136
-11
lines changed

models/webhook/webhook.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ type HookType = string
155155

156156
// Types of webhooks
157157
const (
158+
FORGEJO HookType = "forgejo"
158159
GITEA HookType = "gitea"
159160
GOGS HookType = "gogs"
160161
SLACK HookType = "slack"

modules/setting/webhook.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func newWebhookService() {
3636
Webhook.DeliverTimeout = sec.Key("DELIVER_TIMEOUT").MustInt(5)
3737
Webhook.SkipTLSVerify = sec.Key("SKIP_TLS_VERIFY").MustBool()
3838
Webhook.AllowedHostList = sec.Key("ALLOWED_HOST_LIST").MustString("")
39-
Webhook.Types = []string{"gitea", "gogs", "slack", "discord", "dingtalk", "telegram", "msteams", "feishu", "matrix", "wechatwork", "packagist"}
39+
Webhook.Types = []string{"forgejo", "gitea", "gogs", "slack", "discord", "dingtalk", "telegram", "msteams", "feishu", "matrix", "wechatwork", "packagist"}
4040
Webhook.PagingNum = sec.Key("PAGING_NUM").MustInt(10)
4141
Webhook.ProxyURL = sec.Key("PROXY_URL").MustString("")
4242
if Webhook.ProxyURL != "" {

modules/structs/hook.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ type CreateHookOptionConfig map[string]string
4040
// CreateHookOption options when create a hook
4141
type CreateHookOption struct {
4242
// required: true
43-
// enum: dingtalk,discord,gitea,gogs,msteams,slack,telegram,feishu,wechatwork,packagist
43+
// enum: forgejo,dingtalk,discord,gitea,gogs,msteams,slack,telegram,feishu,wechatwork,packagist
4444
Type string `json:"type" binding:"Required"`
4545
// required: true
4646
Config CreateHookOptionConfig `json:"config" binding:"Required"`

routers/web/repo/webhook.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,34 @@ func editWebhook(ctx *context.Context, params webhookParams) {
297297
ctx.Redirect(fmt.Sprintf("%s/%d", orCtx.Link, w.ID))
298298
}
299299

300+
// ForgejoHooksNewPost response for creating Forgejo webhook
301+
func ForgejoHooksNewPost(ctx *context.Context) {
302+
createWebhook(ctx, forgejoHookParams(ctx))
303+
}
304+
305+
// ForgejoHooksEditPost response for editing Forgejo webhook
306+
func ForgejoHooksEditPost(ctx *context.Context) {
307+
editWebhook(ctx, forgejoHookParams(ctx))
308+
}
309+
310+
func forgejoHookParams(ctx *context.Context) webhookParams {
311+
form := web.GetForm(ctx).(*forms.NewWebhookForm)
312+
313+
contentType := webhook.ContentTypeJSON
314+
if webhook.HookContentType(form.ContentType) == webhook.ContentTypeForm {
315+
contentType = webhook.ContentTypeForm
316+
}
317+
318+
return webhookParams{
319+
Type: webhook.FORGEJO,
320+
URL: form.PayloadURL,
321+
ContentType: contentType,
322+
Secret: form.Secret,
323+
HTTPMethod: form.HTTPMethod,
324+
WebhookForm: form.WebhookForm,
325+
}
326+
}
327+
300328
// GiteaHooksNewPost response for creating Gitea webhook
301329
func GiteaHooksNewPost(ctx *context.Context) {
302330
createWebhook(ctx, giteaHookParams(ctx))

routers/web/web.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,7 @@ func RegisterRoutes(m *web.Route) {
534534
m.Get("", repo.WebHooksEdit)
535535
m.Post("/replay/{uuid}", repo.ReplayWebhook)
536536
})
537+
m.Post("/forgejo/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksEditPost)
537538
m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksEditPost)
538539
m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
539540
m.Post("/slack/{id}", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksEditPost)
@@ -549,6 +550,7 @@ func RegisterRoutes(m *web.Route) {
549550

550551
m.Group("/{configType:default-hooks|system-hooks}", func() {
551552
m.Get("/{type}/new", repo.WebhooksNew)
553+
m.Post("/forgejo/new", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksNewPost)
552554
m.Post("/gitea/new", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksNewPost)
553555
m.Post("/gogs/new", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksNewPost)
554556
m.Post("/slack/new", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksNewPost)
@@ -712,6 +714,7 @@ func RegisterRoutes(m *web.Route) {
712714
m.Get("", org.Webhooks)
713715
m.Post("/delete", org.DeleteWebhook)
714716
m.Get("/{type}/new", repo.WebhooksNew)
717+
m.Post("/forgejo/new", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksNewPost)
715718
m.Post("/gitea/new", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksNewPost)
716719
m.Post("/gogs/new", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksNewPost)
717720
m.Post("/slack/new", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksNewPost)
@@ -726,6 +729,7 @@ func RegisterRoutes(m *web.Route) {
726729
m.Get("", repo.WebHooksEdit)
727730
m.Post("/replay/{uuid}", repo.ReplayWebhook)
728731
})
732+
m.Post("/forgejo/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksEditPost)
729733
m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksEditPost)
730734
m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
731735
m.Post("/slack/{id}", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksEditPost)
@@ -835,6 +839,7 @@ func RegisterRoutes(m *web.Route) {
835839
m.Get("", repo.Webhooks)
836840
m.Post("/delete", repo.DeleteWebhook)
837841
m.Get("/{type}/new", repo.WebhooksNew)
842+
m.Post("/forgejo/new", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksNewPost)
838843
m.Post("/gitea/new", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksNewPost)
839844
m.Post("/gogs/new", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksNewPost)
840845
m.Post("/slack/new", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksNewPost)
@@ -851,6 +856,7 @@ func RegisterRoutes(m *web.Route) {
851856
m.Post("/test", repo.TestWebhook)
852857
m.Post("/replay/{uuid}", repo.ReplayWebhook)
853858
})
859+
m.Post("/forgejo/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.ForgejoHooksEditPost)
854860
m.Post("/gitea/{id}", bindIgnErr(forms.NewWebhookForm{}), repo.GiteaHooksEditPost)
855861
m.Post("/gogs/{id}", bindIgnErr(forms.NewGogshookForm{}), repo.GogsHooksEditPost)
856862
m.Post("/slack/{id}", bindIgnErr(forms.NewSlackHookForm{}), repo.SlackHooksEditPost)

services/webhook/webhook.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func RegisterWebhook(name string, webhook *webhook) {
7474

7575
// IsValidHookTaskType returns true if a webhook registered
7676
func IsValidHookTaskType(name string) bool {
77-
if name == webhook_model.GITEA || name == webhook_model.GOGS {
77+
if name == webhook_model.FORGEJO || name == webhook_model.GITEA || name == webhook_model.GOGS {
7878
return true
7979
}
8080
_, ok := webhooks[name]
@@ -170,7 +170,7 @@ func PrepareWebhook(ctx context.Context, w *webhook_model.Webhook, event webhook
170170
// Avoid sending "0 new commits" to non-integration relevant webhooks (e.g. slack, discord, etc.).
171171
// Integration webhooks (e.g. drone) still receive the required data.
172172
if pushEvent, ok := p.(*api.PushPayload); ok &&
173-
w.Type != webhook_model.GITEA && w.Type != webhook_model.GOGS &&
173+
w.Type != webhook_model.FORGEJO && w.Type != webhook_model.GITEA && w.Type != webhook_model.GOGS &&
174174
len(pushEvent.Commits) == 0 {
175175
return nil
176176
}

templates/admin/hook_new.tmpl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@
1414
{{.locale.Tr "admin.defaulthooks.update_webhook"}}
1515
{{end}}
1616
<div class="ui right">
17-
{{if eq .HookType "gitea"}}
18-
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea.svg">
17+
{{if eq .HookType "forgejo"}}
18+
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/forgejo.svg">
19+
{{else if eq .HookType "gitea"}}
20+
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea-original.svg">
1921
{{else if eq .HookType "gogs"}}
2022
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gogs.ico">
2123
{{else if eq .HookType "slack"}}
@@ -40,6 +42,7 @@
4042
</div>
4143
</h4>
4244
<div class="ui attached segment">
45+
{{template "repo/settings/webhook/forgejo" .}}
4346
{{template "repo/settings/webhook/gitea" .}}
4447
{{template "repo/settings/webhook/gogs" .}}
4548
{{template "repo/settings/webhook/slack" .}}

templates/org/settings/hook_new.tmpl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@
99
<h4 class="ui top attached header">
1010
{{if .PageIsSettingsHooksNew}}{{.locale.Tr "repo.settings.add_webhook"}}{{else}}{{.locale.Tr "repo.settings.update_webhook"}}{{end}}
1111
<div class="ui right">
12-
{{if eq .HookType "gitea"}}
13-
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea.svg">
12+
{{if eq .HookType "forgejo"}}
13+
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/forgejo.svg">
14+
{{else if eq .HookType "gitea"}}
15+
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gitea-original.svg">
1416
{{else if eq .HookType "gogs"}}
1517
<img width="26" height="26" src="{{AssetUrlPrefix}}/img/gogs.ico">
1618
{{else if eq .HookType "slack"}}

templates/repo/settings/webhook/base_list.tmpl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44
<div class="ui floating1 jump dropdown">
55
<div class="ui primary tiny button">{{.locale.Tr "repo.settings.add_webhook"}}</div>
66
<div class="menu">
7+
<a class="item" href="{{.BaseLinkNew}}/forgejo/new">
8+
<img width="20" height="20" src="{{AssetUrlPrefix}}/img/forgejo.svg">{{.locale.Tr "repo.settings.web_hook_name_forgejo"}}
9+
</a>
710
<a class="item" href="{{.BaseLinkNew}}/gitea/new">
8-
<img width="20" height="20" src="{{AssetUrlPrefix}}/img/gitea.svg">{{.locale.Tr "repo.settings.web_hook_name_gitea"}}
11+
<img width="20" height="20" src="{{AssetUrlPrefix}}/img/gitea-original.svg">{{.locale.Tr "repo.settings.web_hook_name_gitea"}}
912
</a>
1013
<a class="item" href="{{.BaseLinkNew}}/gogs/new">
1114
<img width="20" height="20" src="{{AssetUrlPrefix}}/img/gogs.ico">{{.locale.Tr "repo.settings.web_hook_name_gogs"}}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
{{if eq .HookType "forgejo"}}
2+
<p>{{.locale.Tr "repo.settings.add_web_hook_desc" "https://docs.gitea.io/en-us/webhooks/" (.locale.Tr "repo.settings.web_hook_name_forgejo") | Str2html}}</p>
3+
<form class="ui form" action="{{.BaseLink}}/forgejo/{{or .Webhook.ID "new"}}" method="post">
4+
{{template "base/disable_form_autofill"}}
5+
{{.CsrfTokenHtml}}
6+
<div class="required field {{if .Err_PayloadURL}}error{{end}}">
7+
<label for="payload_url">{{.locale.Tr "repo.settings.payload_url"}}</label>
8+
<input id="payload_url" name="payload_url" type="url" value="{{.Webhook.URL}}" autofocus required>
9+
</div>
10+
<div class="field">
11+
<label>{{.locale.Tr "repo.settings.http_method"}}</label>
12+
<div class="ui selection dropdown">
13+
<input type="hidden" id="http_method" name="http_method" value="{{if .Webhook.HTTPMethod}}{{.Webhook.HTTPMethod}}{{else}}POST{{end}}">
14+
<div class="default text"></div>
15+
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
16+
<div class="menu">
17+
<div class="item" data-value="POST">POST</div>
18+
<div class="item" data-value="GET">GET</div>
19+
</div>
20+
</div>
21+
</div>
22+
<div class="field">
23+
<label>{{.locale.Tr "repo.settings.content_type"}}</label>
24+
<div class="ui selection dropdown">
25+
<input type="hidden" id="content_type" name="content_type" value="{{if .Webhook.ContentType}}{{.Webhook.ContentType}}{{else}}1{{end}}">
26+
<div class="default text"></div>
27+
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
28+
<div class="menu">
29+
<div class="item" data-value="1">application/json</div>
30+
<div class="item" data-value="2">application/x-www-form-urlencoded</div>
31+
</div>
32+
</div>
33+
</div>
34+
<div class="field {{if .Err_Secret}}error{{end}}">
35+
<label for="secret">{{.locale.Tr "repo.settings.secret"}}</label>
36+
<input id="secret" name="secret" type="password" value="{{.Webhook.Secret}}" autocomplete="off">
37+
</div>
38+
{{template "repo/settings/webhook/settings" .}}
39+
</form>
40+
{{end}}

0 commit comments

Comments
 (0)