mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 11:28:24 +00:00 
			
		
		
		
	Backport #27839 by @lunny Fix #23742 Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: KN4CK3R <admin@oldschoolhack.me>
This commit is contained in:
		| @@ -16,6 +16,7 @@ type Package struct { | |||||||
| 	Type       string      `json:"type"` | 	Type       string      `json:"type"` | ||||||
| 	Name       string      `json:"name"` | 	Name       string      `json:"name"` | ||||||
| 	Version    string      `json:"version"` | 	Version    string      `json:"version"` | ||||||
|  | 	HTMLURL    string      `json:"html_url"` | ||||||
| 	// swagger:strfmt date-time | 	// swagger:strfmt date-time | ||||||
| 	CreatedAt time.Time `json:"created_at"` | 	CreatedAt time.Time `json:"created_at"` | ||||||
| } | } | ||||||
|   | |||||||
| @@ -35,6 +35,7 @@ func ToPackage(ctx context.Context, pd *packages.PackageDescriptor, doer *user_m | |||||||
| 		Name:       pd.Package.Name, | 		Name:       pd.Package.Name, | ||||||
| 		Version:    pd.Version.Version, | 		Version:    pd.Version.Version, | ||||||
| 		CreatedAt:  pd.Version.CreatedUnix.AsTime(), | 		CreatedAt:  pd.Version.CreatedUnix.AsTime(), | ||||||
|  | 		HTMLURL:    pd.FullWebLink(), | ||||||
| 	}, nil | 	}, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -173,6 +173,12 @@ func (d *DingtalkPayload) Release(p *api.ReleasePayload) (api.Payloader, error) | |||||||
| 	return createDingtalkPayload(text, text, "view release", p.Release.HTMLURL), nil | 	return createDingtalkPayload(text, text, "view release", p.Release.HTMLURL), nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | 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 | ||||||
|  | } | ||||||
|  |  | ||||||
| func createDingtalkPayload(title, text, singleTitle, singleURL string) *DingtalkPayload { | func createDingtalkPayload(title, text, singleTitle, singleURL string) *DingtalkPayload { | ||||||
| 	return &DingtalkPayload{ | 	return &DingtalkPayload{ | ||||||
| 		MsgType: "actionCard", | 		MsgType: "actionCard", | ||||||
|   | |||||||
| @@ -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 | 	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 | // GetDiscordPayload converts a discord webhook into a DiscordPayload | ||||||
| func GetDiscordPayload(p api.Payloader, event webhook_module.HookEventType, meta string) (api.Payloader, error) { | func GetDiscordPayload(p api.Payloader, event webhook_module.HookEventType, meta string) (api.Payloader, error) { | ||||||
| 	s := new(DiscordPayload) | 	s := new(DiscordPayload) | ||||||
|   | |||||||
| @@ -16,7 +16,7 @@ import ( | |||||||
| type ( | type ( | ||||||
| 	// FeishuPayload represents | 	// FeishuPayload represents | ||||||
| 	FeishuPayload struct { | 	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 { | 		Content struct { | ||||||
| 			Text string `json:"text"` | 			Text string `json:"text"` | ||||||
| 		} `json:"content"` | 		} `json:"content"` | ||||||
| @@ -175,6 +175,12 @@ func (f *FeishuPayload) Release(p *api.ReleasePayload) (api.Payloader, error) { | |||||||
| 	return newFeishuTextPayload(text), nil | 	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 | // GetFeishuPayload converts a ding talk webhook into a FeishuPayload | ||||||
| func GetFeishuPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { | func GetFeishuPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { | ||||||
| 	return convertPayloader(new(FeishuPayload), p, event) | 	return convertPayloader(new(FeishuPayload), p, event) | ||||||
|   | |||||||
| @@ -293,6 +293,24 @@ func getIssueCommentPayloadInfo(p *api.IssueCommentPayload, linkFormatter linkFo | |||||||
| 	return text, issueTitle, color | 	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 | // ToHook convert models.Webhook to api.Hook | ||||||
| // This function is not part of the convert package to prevent an import cycle | // 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) { | func ToHook(repoLink string, w *webhook_model.Webhook) (*api.Hook, error) { | ||||||
|   | |||||||
| @@ -210,6 +210,21 @@ func (m *MatrixPayload) Repository(p *api.RepositoryPayload) (api.Payloader, err | |||||||
| 	return getMatrixPayload(text, nil, m.MsgType), nil | 	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 | // GetMatrixPayload converts a Matrix webhook into a MatrixPayload | ||||||
| func GetMatrixPayload(p api.Payloader, event webhook_module.HookEventType, meta string) (api.Payloader, error) { | func GetMatrixPayload(p api.Payloader, event webhook_module.HookEventType, meta string) (api.Payloader, error) { | ||||||
| 	s := new(MatrixPayload) | 	s := new(MatrixPayload) | ||||||
|   | |||||||
| @@ -296,6 +296,20 @@ func (m *MSTeamsPayload) Release(p *api.ReleasePayload) (api.Payloader, error) { | |||||||
| 	), nil | 	), 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 | // GetMSTeamsPayload converts a MSTeams webhook into a MSTeamsPayload | ||||||
| func GetMSTeamsPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { | func GetMSTeamsPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { | ||||||
| 	return convertPayloader(new(MSTeamsPayload), p, event) | 	return convertPayloader(new(MSTeamsPayload), p, event) | ||||||
|   | |||||||
| @@ -104,6 +104,10 @@ func (f *PackagistPayload) Release(_ *api.ReleasePayload) (api.Payloader, error) | |||||||
| 	return nil, nil | 	return nil, nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (f *PackagistPayload) Package(_ *api.PackagePayload) (api.Payloader, error) { | ||||||
|  | 	return nil, nil | ||||||
|  | } | ||||||
|  |  | ||||||
| // GetPackagistPayload converts a packagist webhook into a PackagistPayload | // GetPackagistPayload converts a packagist webhook into a PackagistPayload | ||||||
| func GetPackagistPayload(p api.Payloader, event webhook_module.HookEventType, meta string) (api.Payloader, error) { | func GetPackagistPayload(p api.Payloader, event webhook_module.HookEventType, meta string) (api.Payloader, error) { | ||||||
| 	s := new(PackagistPayload) | 	s := new(PackagistPayload) | ||||||
|   | |||||||
| @@ -22,6 +22,7 @@ type PayloadConvertor interface { | |||||||
| 	Repository(*api.RepositoryPayload) (api.Payloader, error) | 	Repository(*api.RepositoryPayload) (api.Payloader, error) | ||||||
| 	Release(*api.ReleasePayload) (api.Payloader, error) | 	Release(*api.ReleasePayload) (api.Payloader, error) | ||||||
| 	Wiki(*api.WikiPayload) (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) { | 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)) | 		return s.Release(p.(*api.ReleasePayload)) | ||||||
| 	case webhook_module.HookEventWiki: | 	case webhook_module.HookEventWiki: | ||||||
| 		return s.Wiki(p.(*api.WikiPayload)) | 		return s.Wiki(p.(*api.WikiPayload)) | ||||||
|  | 	case webhook_module.HookEventPackage: | ||||||
|  | 		return s.Package(p.(*api.PackagePayload)) | ||||||
| 	} | 	} | ||||||
| 	return s, nil | 	return s, nil | ||||||
| } | } | ||||||
|   | |||||||
| @@ -171,6 +171,12 @@ func (s *SlackPayload) Release(p *api.ReleasePayload) (api.Payloader, error) { | |||||||
| 	return s.createPayload(text, nil), nil | 	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 | // Push implements PayloadConvertor Push method | ||||||
| func (s *SlackPayload) Push(p *api.PushPayload) (api.Payloader, error) { | func (s *SlackPayload) Push(p *api.PushPayload) (api.Payloader, error) { | ||||||
| 	// n new commits | 	// n new commits | ||||||
|   | |||||||
| @@ -186,6 +186,12 @@ func (t *TelegramPayload) Release(p *api.ReleasePayload) (api.Payloader, error) | |||||||
| 	return createTelegramPayload(text), nil | 	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 | // GetTelegramPayload converts a telegram webhook into a TelegramPayload | ||||||
| func GetTelegramPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { | func GetTelegramPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { | ||||||
| 	return convertPayloader(new(TelegramPayload), p, event) | 	return convertPayloader(new(TelegramPayload), p, event) | ||||||
|   | |||||||
| @@ -179,6 +179,12 @@ func (f *WechatworkPayload) Release(p *api.ReleasePayload) (api.Payloader, error | |||||||
| 	return newWechatworkMarkdownPayload(text), nil | 	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 | // GetWechatworkPayload GetWechatworkPayload converts a ding talk webhook into a WechatworkPayload | ||||||
| func GetWechatworkPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { | func GetWechatworkPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { | ||||||
| 	return convertPayloader(new(WechatworkPayload), p, event) | 	return convertPayloader(new(WechatworkPayload), p, event) | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								templates/swagger/v1_json.tmpl
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								templates/swagger/v1_json.tmpl
									
									
									
										generated
									
									
									
								
							| @@ -21039,6 +21039,10 @@ | |||||||
|         "creator": { |         "creator": { | ||||||
|           "$ref": "#/definitions/User" |           "$ref": "#/definitions/User" | ||||||
|         }, |         }, | ||||||
|  |         "html_url": { | ||||||
|  |           "type": "string", | ||||||
|  |           "x-go-name": "HTMLURL" | ||||||
|  |         }, | ||||||
|         "id": { |         "id": { | ||||||
|           "type": "integer", |           "type": "integer", | ||||||
|           "format": "int64", |           "format": "int64", | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user