From 120fa61a0a720de8d82c4bf9e65e77d8a0bddf87 Mon Sep 17 00:00:00 2001 From: oliverpool Date: Fri, 22 Mar 2024 16:02:48 +0100 Subject: [PATCH 1/2] [REFACTOR] add Icon to webhook.Interface --- routers/web/repo/setting/webhook.go | 6 +++++- services/webhook/default.go | 10 ++++++++++ services/webhook/dingtalk.go | 3 +++ services/webhook/discord.go | 2 ++ services/webhook/feishu.go | 2 ++ services/webhook/general.go | 8 ++++++++ services/webhook/gogs.go | 2 ++ services/webhook/matrix.go | 6 ++++++ services/webhook/msteams.go | 2 ++ services/webhook/packagist.go | 2 ++ services/webhook/slack.go | 2 ++ services/webhook/telegram.go | 2 ++ services/webhook/webhook.go | 2 ++ services/webhook/wechatwork.go | 5 +++++ templates/webhook/new.tmpl | 2 +- 15 files changed, 54 insertions(+), 2 deletions(-) diff --git a/routers/web/repo/setting/webhook.go b/routers/web/repo/setting/webhook.go index bf7770bfdb..c36ebf5b14 100644 --- a/routers/web/repo/setting/webhook.go +++ b/routers/web/repo/setting/webhook.go @@ -132,11 +132,13 @@ func WebhookNew(ctx *context.Context) { } hookType := ctx.Params(":type") - if webhook_service.GetWebhookHandler(hookType) == nil { + handler := webhook_service.GetWebhookHandler(hookType) + if handler == nil { ctx.NotFound("GetWebhookHandler", nil) return } ctx.Data["HookType"] = hookType + ctx.Data["WebhookHandler"] = handler ctx.Data["BaseLink"] = orCtx.LinkNew ctx.Data["BaseLinkNew"] = orCtx.LinkNew @@ -194,6 +196,7 @@ func WebhookCreate(ctx *context.Context) { ctx.Data["PageIsSettingsHooksNew"] = true ctx.Data["Webhook"] = webhook.Webhook{HookEvent: &webhook_module.HookEvent{}} ctx.Data["HookType"] = hookType + ctx.Data["WebhookHandler"] = handler orCtx, err := getOwnerRepoCtx(ctx) if err != nil { @@ -358,6 +361,7 @@ func checkWebhook(ctx *context.Context) (*ownerRepoCtx, *webhook.Webhook) { if handler := webhook_service.GetWebhookHandler(w.Type); handler != nil { ctx.Data["HookMetadata"] = handler.Metadata(w) + ctx.Data["WebhookHandler"] = handler } ctx.Data["History"], err = w.History(ctx, 1) diff --git a/services/webhook/default.go b/services/webhook/default.go index f725f8a783..be3b9b3c73 100644 --- a/services/webhook/default.go +++ b/services/webhook/default.go @@ -10,6 +10,7 @@ import ( "crypto/sha256" "encoding/hex" "fmt" + "html/template" "io" "net/http" "net/url" @@ -17,6 +18,7 @@ import ( webhook_model "code.gitea.io/gitea/models/webhook" "code.gitea.io/gitea/modules/log" + "code.gitea.io/gitea/modules/svg" webhook_module "code.gitea.io/gitea/modules/webhook" "code.gitea.io/gitea/services/forms" ) @@ -34,6 +36,14 @@ func (dh defaultHandler) Type() webhook_module.HookType { return webhook_module.GITEA } +func (dh defaultHandler) Icon(size int) template.HTML { + if dh.forgejo { + // forgejo.svg is not in web_src/svg/, so svg.RenderHTML does not work + return imgIcon("forgejo.svg", size) + } + return svg.RenderHTML("gitea-gitea", size, "img") +} + func (defaultHandler) Metadata(*webhook_model.Webhook) any { return nil } func (defaultHandler) FormFields(bind func(any)) FormFields { diff --git a/services/webhook/dingtalk.go b/services/webhook/dingtalk.go index f4bc715e08..0a0160ac46 100644 --- a/services/webhook/dingtalk.go +++ b/services/webhook/dingtalk.go @@ -6,6 +6,7 @@ package webhook import ( "context" "fmt" + "html/template" "net/http" "net/url" "strings" @@ -22,6 +23,8 @@ type dingtalkHandler struct{} func (dingtalkHandler) Type() webhook_module.HookType { return webhook_module.DINGTALK } func (dingtalkHandler) Metadata(*webhook_model.Webhook) any { return nil } +func (dingtalkHandler) Icon(size int) template.HTML { return imgIcon("dingtalk.ico", size) } + func (dingtalkHandler) FormFields(bind func(any)) FormFields { var form struct { forms.WebhookForm diff --git a/services/webhook/discord.go b/services/webhook/discord.go index 3a0a973860..2efb46f5bb 100644 --- a/services/webhook/discord.go +++ b/services/webhook/discord.go @@ -7,6 +7,7 @@ import ( "context" "errors" "fmt" + "html/template" "net/http" "net/url" "strconv" @@ -26,6 +27,7 @@ import ( type discordHandler struct{} func (discordHandler) Type() webhook_module.HookType { return webhook_module.DISCORD } +func (discordHandler) Icon(size int) template.HTML { return imgIcon("discord.png", size) } func (discordHandler) FormFields(bind func(any)) FormFields { var form struct { diff --git a/services/webhook/feishu.go b/services/webhook/feishu.go index b27acc9070..eba54fa09b 100644 --- a/services/webhook/feishu.go +++ b/services/webhook/feishu.go @@ -6,6 +6,7 @@ package webhook import ( "context" "fmt" + "html/template" "net/http" "strings" @@ -19,6 +20,7 @@ import ( type feishuHandler struct{} func (feishuHandler) Type() webhook_module.HookType { return webhook_module.FEISHU } +func (feishuHandler) Icon(size int) template.HTML { return imgIcon("feishu.png", size) } func (feishuHandler) FormFields(bind func(any)) FormFields { var form struct { diff --git a/services/webhook/general.go b/services/webhook/general.go index c41f58fe8d..454efc6495 100644 --- a/services/webhook/general.go +++ b/services/webhook/general.go @@ -6,7 +6,9 @@ package webhook import ( "fmt" "html" + "html/template" "net/url" + "strconv" "strings" webhook_model "code.gitea.io/gitea/models/webhook" @@ -352,3 +354,9 @@ func ToHook(repoLink string, w *webhook_model.Webhook) (*api.Hook, error) { Created: w.CreatedUnix.AsTime(), }, nil } + +func imgIcon(name string, size int) template.HTML { + s := strconv.Itoa(size) + src := html.EscapeString(setting.StaticURLPrefix + "/assets/img/" + name) + return template.HTML(``) +} diff --git a/services/webhook/gogs.go b/services/webhook/gogs.go index e23673ed35..f616f5e2f3 100644 --- a/services/webhook/gogs.go +++ b/services/webhook/gogs.go @@ -4,6 +4,7 @@ package webhook import ( + "html/template" "net/http" webhook_model "code.gitea.io/gitea/models/webhook" @@ -14,6 +15,7 @@ import ( type gogsHandler struct{ defaultHandler } func (gogsHandler) Type() webhook_module.HookType { return webhook_module.GOGS } +func (gogsHandler) Icon(size int) template.HTML { return imgIcon("gogs.ico", size) } func (gogsHandler) FormFields(bind func(any)) FormFields { var form struct { diff --git a/services/webhook/matrix.go b/services/webhook/matrix.go index d04f0f367f..322b4d6665 100644 --- a/services/webhook/matrix.go +++ b/services/webhook/matrix.go @@ -9,6 +9,7 @@ import ( "crypto/sha1" "encoding/hex" "fmt" + "html/template" "net/http" "net/url" "regexp" @@ -20,6 +21,7 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" + "code.gitea.io/gitea/modules/svg" "code.gitea.io/gitea/modules/util" webhook_module "code.gitea.io/gitea/modules/webhook" "code.gitea.io/gitea/services/forms" @@ -29,6 +31,10 @@ type matrixHandler struct{} func (matrixHandler) Type() webhook_module.HookType { return webhook_module.MATRIX } +func (matrixHandler) Icon(size int) template.HTML { + return svg.RenderHTML("gitea-matrix", size, "img") +} + func (matrixHandler) FormFields(bind func(any)) FormFields { var form struct { forms.WebhookForm diff --git a/services/webhook/msteams.go b/services/webhook/msteams.go index 849093e9bf..940a6c49aa 100644 --- a/services/webhook/msteams.go +++ b/services/webhook/msteams.go @@ -6,6 +6,7 @@ package webhook import ( "context" "fmt" + "html/template" "net/http" "net/url" "strings" @@ -22,6 +23,7 @@ type msteamsHandler struct{} func (msteamsHandler) Type() webhook_module.HookType { return webhook_module.MSTEAMS } func (msteamsHandler) Metadata(*webhook_model.Webhook) any { return nil } +func (msteamsHandler) Icon(size int) template.HTML { return imgIcon("msteams.png", size) } func (msteamsHandler) FormFields(bind func(any)) FormFields { var form struct { diff --git a/services/webhook/packagist.go b/services/webhook/packagist.go index d8bf9ea23a..f1f3306109 100644 --- a/services/webhook/packagist.go +++ b/services/webhook/packagist.go @@ -6,6 +6,7 @@ package webhook import ( "context" "fmt" + "html/template" "net/http" "net/url" @@ -19,6 +20,7 @@ import ( type packagistHandler struct{} func (packagistHandler) Type() webhook_module.HookType { return webhook_module.PACKAGIST } +func (packagistHandler) Icon(size int) template.HTML { return imgIcon("packagist.png", size) } func (packagistHandler) FormFields(bind func(any)) FormFields { var form struct { diff --git a/services/webhook/slack.go b/services/webhook/slack.go index 683ef41019..0b4c4b6645 100644 --- a/services/webhook/slack.go +++ b/services/webhook/slack.go @@ -6,6 +6,7 @@ package webhook import ( "context" "fmt" + "html/template" "net/http" "regexp" "strings" @@ -26,6 +27,7 @@ import ( type slackHandler struct{} func (slackHandler) Type() webhook_module.HookType { return webhook_module.SLACK } +func (slackHandler) Icon(size int) template.HTML { return imgIcon("slack.png", size) } type slackForm struct { forms.WebhookForm diff --git a/services/webhook/telegram.go b/services/webhook/telegram.go index 2ede28dbd2..daa986bafb 100644 --- a/services/webhook/telegram.go +++ b/services/webhook/telegram.go @@ -6,6 +6,7 @@ package webhook import ( "context" "fmt" + "html/template" "net/http" "net/url" "strings" @@ -22,6 +23,7 @@ import ( type telegramHandler struct{} func (telegramHandler) Type() webhook_module.HookType { return webhook_module.TELEGRAM } +func (telegramHandler) Icon(size int) template.HTML { return imgIcon("telegram.png", size) } func (telegramHandler) FormFields(bind func(any)) FormFields { var form struct { diff --git a/services/webhook/webhook.go b/services/webhook/webhook.go index a7802d27dc..f27bffc29a 100644 --- a/services/webhook/webhook.go +++ b/services/webhook/webhook.go @@ -7,6 +7,7 @@ import ( "context" "errors" "fmt" + "html/template" "net/http" "strings" @@ -35,6 +36,7 @@ type Handler interface { // If form implements the [binding.Validator] interface, the Validate method will be called FormFields(bind func(form any)) FormFields NewRequest(context.Context, *webhook_model.Webhook, *webhook_model.HookTask) (req *http.Request, body []byte, err error) + Icon(size int) template.HTML } type FormFields struct { diff --git a/services/webhook/wechatwork.go b/services/webhook/wechatwork.go index 2ad2acd018..eff5b9b526 100644 --- a/services/webhook/wechatwork.go +++ b/services/webhook/wechatwork.go @@ -6,6 +6,7 @@ package webhook import ( "context" "fmt" + "html/template" "net/http" "strings" @@ -21,6 +22,10 @@ type wechatworkHandler struct{} func (wechatworkHandler) Type() webhook_module.HookType { return webhook_module.WECHATWORK } func (wechatworkHandler) Metadata(*webhook_model.Webhook) any { return nil } +func (wechatworkHandler) Icon(size int) template.HTML { + return imgIcon("wechatwork.png", size) +} + func (wechatworkHandler) FormFields(bind func(any)) FormFields { var form struct { forms.WebhookForm diff --git a/templates/webhook/new.tmpl b/templates/webhook/new.tmpl index 17eb578b0e..8afdb1fa5d 100644 --- a/templates/webhook/new.tmpl +++ b/templates/webhook/new.tmpl @@ -2,7 +2,7 @@ {{.CustomHeaderTitle}}