From c50049626aa98e8b42efdd65836656f71e766633 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 30 Oct 2023 18:21:15 +0800 Subject: [PATCH 1/5] Fix package webhook --- modules/structs/package.go | 1 + services/convert/package.go | 4 ++++ services/webhook/dingtalk.go | 6 ++++++ services/webhook/discord.go | 6 ++++++ services/webhook/feishu.go | 8 +++++++- services/webhook/general.go | 18 ++++++++++++++++++ services/webhook/matrix.go | 15 +++++++++++++++ services/webhook/msteams.go | 14 ++++++++++++++ services/webhook/packagist.go | 4 ++++ services/webhook/payloader.go | 3 +++ services/webhook/slack.go | 6 ++++++ services/webhook/telegram.go | 6 ++++++ services/webhook/wechatwork.go | 6 ++++++ 13 files changed, 96 insertions(+), 1 deletion(-) diff --git a/modules/structs/package.go b/modules/structs/package.go index 0059535bea800..a9a9429de2d3a 100644 --- a/modules/structs/package.go +++ b/modules/structs/package.go @@ -16,6 +16,7 @@ type Package struct { Type string `json:"type"` Name string `json:"name"` Version string `json:"version"` + HTMLURL string `json:"html_url"` // swagger:strfmt date-time CreatedAt time.Time `json:"created_at"` } diff --git a/services/convert/package.go b/services/convert/package.go index 276856594bb4c..a1cdbce20f42c 100644 --- a/services/convert/package.go +++ b/services/convert/package.go @@ -5,10 +5,13 @@ package convert import ( "context" + "fmt" + "net/url" "code.gitea.io/gitea/models/packages" access_model "code.gitea.io/gitea/models/perm/access" user_model "code.gitea.io/gitea/models/user" + "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" ) @@ -35,6 +38,7 @@ func ToPackage(ctx context.Context, pd *packages.PackageDescriptor, doer *user_m Name: pd.Package.Name, Version: pd.Version.Version, CreatedAt: pd.Version.CreatedUnix.AsTime(), + HTMLURL: fmt.Sprintf("%s%s/-/packages/%s/%s", setting.AppURL, pd.Owner.LoginName, string(pd.Package.Type), url.PathEscape(pd.Version.Version)), }, nil } diff --git a/services/webhook/dingtalk.go b/services/webhook/dingtalk.go index c6fbe2f07656e..ad7229f6edd89 100644 --- a/services/webhook/dingtalk.go +++ b/services/webhook/dingtalk.go @@ -173,6 +173,12 @@ func (d *DingtalkPayload) Release(p *api.ReleasePayload) (api.Payloader, error) return createDingtalkPayload(text, text, "view release", p.Release.HTMLURL), nil } +func (m *DingtalkPayload) Package(p *api.PackagePayload) (api.Payloader, error) { + text, _ := getPackagePayloadInfo(p, noneLinkFormatter, true) + + return createDingtalkPayload(text, text, "view package", p.Package.HTMLURL), nil +} + func createDingtalkPayload(title, text, singleTitle, singleURL string) *DingtalkPayload { return &DingtalkPayload{ MsgType: "actionCard", diff --git a/services/webhook/discord.go b/services/webhook/discord.go index b22bb4f91210b..e2ac1410b8af2 100644 --- a/services/webhook/discord.go +++ b/services/webhook/discord.go @@ -256,6 +256,12 @@ func (d *DiscordPayload) Release(p *api.ReleasePayload) (api.Payloader, error) { return d.createPayload(p.Sender, text, p.Release.Note, p.Release.HTMLURL, color), nil } +func (d *DiscordPayload) Package(p *api.PackagePayload) (api.Payloader, error) { + text, color := getPackagePayloadInfo(p, noneLinkFormatter, false) + + return d.createPayload(p.Sender, text, "", p.Package.HTMLURL, color), nil +} + // GetDiscordPayload converts a discord webhook into a DiscordPayload func GetDiscordPayload(p api.Payloader, event webhook_module.HookEventType, meta string) (api.Payloader, error) { s := new(DiscordPayload) diff --git a/services/webhook/feishu.go b/services/webhook/feishu.go index 089f51952fd78..556443e70b7e4 100644 --- a/services/webhook/feishu.go +++ b/services/webhook/feishu.go @@ -16,7 +16,7 @@ import ( type ( // FeishuPayload represents FeishuPayload struct { - MsgType string `json:"msg_type"` // text / post / image / share_chat / interactive + MsgType string `json:"msg_type"` // text / post / image / share_chat / interactive / file /audio / media Content struct { Text string `json:"text"` } `json:"content"` @@ -175,6 +175,12 @@ func (f *FeishuPayload) Release(p *api.ReleasePayload) (api.Payloader, error) { return newFeishuTextPayload(text), nil } +func (f *FeishuPayload) Package(p *api.PackagePayload) (api.Payloader, error) { + text, _ := getPackagePayloadInfo(p, noneLinkFormatter, true) + + return newFeishuTextPayload(text), nil +} + // GetFeishuPayload converts a ding talk webhook into a FeishuPayload func GetFeishuPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { return convertPayloader(new(FeishuPayload), p, event) diff --git a/services/webhook/general.go b/services/webhook/general.go index 986467bc99dba..69b944f4bd5e6 100644 --- a/services/webhook/general.go +++ b/services/webhook/general.go @@ -293,6 +293,24 @@ func getIssueCommentPayloadInfo(p *api.IssueCommentPayload, linkFormatter linkFo return text, issueTitle, color } +func getPackagePayloadInfo(p *api.PackagePayload, linkFormatter linkFormatter, withSender bool) (text string, color int) { + refLink := linkFormatter(p.Package.HTMLURL, p.Package.Name+":"+p.Package.Version) + + switch p.Action { + case api.HookPackageCreated: + text = fmt.Sprintf("Package created: %s", refLink) + color = greenColor + case api.HookPackageDeleted: + text = fmt.Sprintf("Package deleted: %s", refLink) + color = redColor + } + if withSender { + text += fmt.Sprintf(" by %s", linkFormatter(setting.AppURL+url.PathEscape(p.Sender.UserName), p.Sender.UserName)) + } + + return text, color +} + // ToHook convert models.Webhook to api.Hook // This function is not part of the convert package to prevent an import cycle func ToHook(repoLink string, w *webhook_model.Webhook) (*api.Hook, error) { diff --git a/services/webhook/matrix.go b/services/webhook/matrix.go index a7f57f97b6a42..ab7e6b72c25f1 100644 --- a/services/webhook/matrix.go +++ b/services/webhook/matrix.go @@ -210,6 +210,21 @@ func (m *MatrixPayload) Repository(p *api.RepositoryPayload) (api.Payloader, err return getMatrixPayload(text, nil, m.MsgType), nil } +func (m *MatrixPayload) Package(p *api.PackagePayload) (api.Payloader, error) { + senderLink := MatrixLinkFormatter(setting.AppURL+p.Sender.UserName, p.Sender.UserName) + repoLink := MatrixLinkFormatter(p.Repository.HTMLURL, p.Repository.FullName) + var text string + + switch p.Action { + case api.HookPackageCreated: + text = fmt.Sprintf("[%s] Package published by %s", repoLink, senderLink) + case api.HookPackageDeleted: + text = fmt.Sprintf("[%s] Package deleted by %s", repoLink, senderLink) + } + + return getMatrixPayload(text, nil, m.MsgType), nil +} + // GetMatrixPayload converts a Matrix webhook into a MatrixPayload func GetMatrixPayload(p api.Payloader, event webhook_module.HookEventType, meta string) (api.Payloader, error) { s := new(MatrixPayload) diff --git a/services/webhook/msteams.go b/services/webhook/msteams.go index dfc1c682895ef..f58da3fe1cd6f 100644 --- a/services/webhook/msteams.go +++ b/services/webhook/msteams.go @@ -296,6 +296,20 @@ func (m *MSTeamsPayload) Release(p *api.ReleasePayload) (api.Payloader, error) { ), nil } +func (m *MSTeamsPayload) Package(p *api.PackagePayload) (api.Payloader, error) { + title, color := getPackagePayloadInfo(p, noneLinkFormatter, false) + + return createMSTeamsPayload( + p.Repository, + p.Sender, + title, + "", + p.Package.HTMLURL, + color, + &MSTeamsFact{"Package:", p.Package.Name}, + ), nil +} + // GetMSTeamsPayload converts a MSTeams webhook into a MSTeamsPayload func GetMSTeamsPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { return convertPayloader(new(MSTeamsPayload), p, event) diff --git a/services/webhook/packagist.go b/services/webhook/packagist.go index e47e7d32850f4..714a4c076ef17 100644 --- a/services/webhook/packagist.go +++ b/services/webhook/packagist.go @@ -104,6 +104,10 @@ func (f *PackagistPayload) Release(_ *api.ReleasePayload) (api.Payloader, error) return nil, nil } +func (f *PackagistPayload) Package(_ *api.PackagePayload) (api.Payloader, error) { + return nil, nil +} + // GetPackagistPayload converts a packagist webhook into a PackagistPayload func GetPackagistPayload(p api.Payloader, event webhook_module.HookEventType, meta string) (api.Payloader, error) { s := new(PackagistPayload) diff --git a/services/webhook/payloader.go b/services/webhook/payloader.go index d53e65fa5ee47..bd482c04ead4f 100644 --- a/services/webhook/payloader.go +++ b/services/webhook/payloader.go @@ -22,6 +22,7 @@ type PayloadConvertor interface { Repository(*api.RepositoryPayload) (api.Payloader, error) Release(*api.ReleasePayload) (api.Payloader, error) Wiki(*api.WikiPayload) (api.Payloader, error) + Package(*api.PackagePayload) (api.Payloader, error) } func convertPayloader(s PayloadConvertor, p api.Payloader, event webhook_module.HookEventType) (api.Payloader, error) { @@ -53,6 +54,8 @@ func convertPayloader(s PayloadConvertor, p api.Payloader, event webhook_module. return s.Release(p.(*api.ReleasePayload)) case webhook_module.HookEventWiki: return s.Wiki(p.(*api.WikiPayload)) + case webhook_module.HookEventPackage: + return s.Package(p.(*api.PackagePayload)) } return s, nil } diff --git a/services/webhook/slack.go b/services/webhook/slack.go index 75079d0fdf158..ac27b5bc71bcd 100644 --- a/services/webhook/slack.go +++ b/services/webhook/slack.go @@ -171,6 +171,12 @@ func (s *SlackPayload) Release(p *api.ReleasePayload) (api.Payloader, error) { return s.createPayload(text, nil), nil } +func (s *SlackPayload) Package(p *api.PackagePayload) (api.Payloader, error) { + text, _ := getPackagePayloadInfo(p, SlackLinkFormatter, true) + + return s.createPayload(text, nil), nil +} + // Push implements PayloadConvertor Push method func (s *SlackPayload) Push(p *api.PushPayload) (api.Payloader, error) { // n new commits diff --git a/services/webhook/telegram.go b/services/webhook/telegram.go index ea7e8185defdd..1bdc74e183a81 100644 --- a/services/webhook/telegram.go +++ b/services/webhook/telegram.go @@ -186,6 +186,12 @@ func (t *TelegramPayload) Release(p *api.ReleasePayload) (api.Payloader, error) return createTelegramPayload(text), nil } +func (t *TelegramPayload) Package(p *api.PackagePayload) (api.Payloader, error) { + text, _ := getPackagePayloadInfo(p, htmlLinkFormatter, true) + + return createTelegramPayload(text), nil +} + // GetTelegramPayload converts a telegram webhook into a TelegramPayload func GetTelegramPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { return convertPayloader(new(TelegramPayload), p, event) diff --git a/services/webhook/wechatwork.go b/services/webhook/wechatwork.go index a7680f1c67112..80245c7e77333 100644 --- a/services/webhook/wechatwork.go +++ b/services/webhook/wechatwork.go @@ -179,6 +179,12 @@ func (f *WechatworkPayload) Release(p *api.ReleasePayload) (api.Payloader, error return newWechatworkMarkdownPayload(text), nil } +func (f *WechatworkPayload) Package(p *api.PackagePayload) (api.Payloader, error) { + text, _ := getPackagePayloadInfo(p, noneLinkFormatter, true) + + return newWechatworkMarkdownPayload(text), nil +} + // GetWechatworkPayload GetWechatworkPayload converts a ding talk webhook into a WechatworkPayload func GetWechatworkPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { return convertPayloader(new(WechatworkPayload), p, event) From 810df6a17b45b5d125fbe4267209c0ba7aeb1ab9 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 30 Oct 2023 19:25:38 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20package.go?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: KN4CK3R --- services/convert/package.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/convert/package.go b/services/convert/package.go index a1cdbce20f42c..c5b806c79c1a5 100644 --- a/services/convert/package.go +++ b/services/convert/package.go @@ -38,7 +38,7 @@ func ToPackage(ctx context.Context, pd *packages.PackageDescriptor, doer *user_m Name: pd.Package.Name, Version: pd.Version.Version, CreatedAt: pd.Version.CreatedUnix.AsTime(), - HTMLURL: fmt.Sprintf("%s%s/-/packages/%s/%s", setting.AppURL, pd.Owner.LoginName, string(pd.Package.Type), url.PathEscape(pd.Version.Version)), + HTMLURL: pd.FullWebLink(), }, nil } From ef02a230a8aa4e4abefdc3413246a944145a4f75 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 30 Oct 2023 19:42:15 +0800 Subject: [PATCH 3/5] fix lint --- services/convert/package.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/services/convert/package.go b/services/convert/package.go index c5b806c79c1a5..e90ce8a00f848 100644 --- a/services/convert/package.go +++ b/services/convert/package.go @@ -5,13 +5,10 @@ package convert import ( "context" - "fmt" - "net/url" "code.gitea.io/gitea/models/packages" access_model "code.gitea.io/gitea/models/perm/access" user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/setting" api "code.gitea.io/gitea/modules/structs" ) From 945661e1e153d4fe07c2b0b88c0af357dd50773d Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 30 Oct 2023 20:26:25 +0800 Subject: [PATCH 4/5] Fix lint --- services/webhook/dingtalk.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/webhook/dingtalk.go b/services/webhook/dingtalk.go index ad7229f6edd89..d615e7254f874 100644 --- a/services/webhook/dingtalk.go +++ b/services/webhook/dingtalk.go @@ -173,7 +173,7 @@ func (d *DingtalkPayload) Release(p *api.ReleasePayload) (api.Payloader, error) return createDingtalkPayload(text, text, "view release", p.Release.HTMLURL), nil } -func (m *DingtalkPayload) Package(p *api.PackagePayload) (api.Payloader, error) { +func (d *DingtalkPayload) Package(p *api.PackagePayload) (api.Payloader, error) { text, _ := getPackagePayloadInfo(p, noneLinkFormatter, true) return createDingtalkPayload(text, text, "view package", p.Package.HTMLURL), nil From a7972478dafd66958fb4ec1d98ff51d6709e333b Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 30 Oct 2023 21:13:38 +0800 Subject: [PATCH 5/5] Fix swagger --- templates/swagger/v1_json.tmpl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl index 2389ec3beee33..75a45dc68ac56 100644 --- a/templates/swagger/v1_json.tmpl +++ b/templates/swagger/v1_json.tmpl @@ -21123,6 +21123,10 @@ "creator": { "$ref": "#/definitions/User" }, + "html_url": { + "type": "string", + "x-go-name": "HTMLURL" + }, "id": { "type": "integer", "format": "int64",