mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	Restructure webhook module (#22256)
				
					
				
			Previously, there was an `import services/webhooks` inside `modules/notification/webhook`. This import was removed (after fighting against many import cycles). Additionally, `modules/notification/webhook` was moved to `modules/webhook`, and a few structs/constants were extracted from `models/webhooks` to `modules/webhook`. Co-authored-by: 6543 <6543@obermui.de> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
		| @@ -6,7 +6,6 @@ package v1_19 //nolint | |||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/webhook" |  | ||||||
| 	"code.gitea.io/gitea/modules/json" | 	"code.gitea.io/gitea/modules/json" | ||||||
| 	"code.gitea.io/gitea/modules/secret" | 	"code.gitea.io/gitea/modules/secret" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| @@ -56,9 +55,9 @@ func batchProcess[T any](x *xorm.Engine, buf []T, query func(limit, start int) * | |||||||
| func AddHeaderAuthorizationEncryptedColWebhook(x *xorm.Engine) error { | func AddHeaderAuthorizationEncryptedColWebhook(x *xorm.Engine) error { | ||||||
| 	// Add the column to the table | 	// Add the column to the table | ||||||
| 	type Webhook struct { | 	type Webhook struct { | ||||||
| 		ID   int64            `xorm:"pk autoincr"` | 		ID   int64  `xorm:"pk autoincr"` | ||||||
| 		Type webhook.HookType `xorm:"VARCHAR(16) 'type'"` | 		Type string `xorm:"VARCHAR(16) 'type'"` | ||||||
| 		Meta string           `xorm:"TEXT"` // store hook-specific attributes | 		Meta string `xorm:"TEXT"` // store hook-specific attributes | ||||||
|  |  | ||||||
| 		// HeaderAuthorizationEncrypted should be accessed using HeaderAuthorization() and SetHeaderAuthorization() | 		// HeaderAuthorizationEncrypted should be accessed using HeaderAuthorization() and SetHeaderAuthorization() | ||||||
| 		HeaderAuthorizationEncrypted string `xorm:"TEXT"` | 		HeaderAuthorizationEncrypted string `xorm:"TEXT"` | ||||||
|   | |||||||
| @@ -7,10 +7,10 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/migrations/base" | 	"code.gitea.io/gitea/models/migrations/base" | ||||||
| 	"code.gitea.io/gitea/models/webhook" |  | ||||||
| 	"code.gitea.io/gitea/modules/json" | 	"code.gitea.io/gitea/modules/json" | ||||||
| 	"code.gitea.io/gitea/modules/secret" | 	"code.gitea.io/gitea/modules/secret" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| ) | ) | ||||||
| @@ -18,9 +18,9 @@ import ( | |||||||
| func Test_AddHeaderAuthorizationEncryptedColWebhook(t *testing.T) { | func Test_AddHeaderAuthorizationEncryptedColWebhook(t *testing.T) { | ||||||
| 	// Create Webhook table | 	// Create Webhook table | ||||||
| 	type Webhook struct { | 	type Webhook struct { | ||||||
| 		ID   int64            `xorm:"pk autoincr"` | 		ID   int64                   `xorm:"pk autoincr"` | ||||||
| 		Type webhook.HookType `xorm:"VARCHAR(16) 'type'"` | 		Type webhook_module.HookType `xorm:"VARCHAR(16) 'type'"` | ||||||
| 		Meta string           `xorm:"TEXT"` // store hook-specific attributes | 		Meta string                  `xorm:"TEXT"` // store hook-specific attributes | ||||||
|  |  | ||||||
| 		// HeaderAuthorizationEncrypted should be accessed using HeaderAuthorization() and SetHeaderAuthorization() | 		// HeaderAuthorizationEncrypted should be accessed using HeaderAuthorization() and SetHeaderAuthorization() | ||||||
| 		HeaderAuthorizationEncrypted string `xorm:"TEXT"` | 		HeaderAuthorizationEncrypted string `xorm:"TEXT"` | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
| 	gouuid "github.com/google/uuid" | 	gouuid "github.com/google/uuid" | ||||||
| ) | ) | ||||||
| @@ -107,7 +108,7 @@ type HookTask struct { | |||||||
| 	UUID            string `xorm:"unique"` | 	UUID            string `xorm:"unique"` | ||||||
| 	api.Payloader   `xorm:"-"` | 	api.Payloader   `xorm:"-"` | ||||||
| 	PayloadContent  string `xorm:"LONGTEXT"` | 	PayloadContent  string `xorm:"LONGTEXT"` | ||||||
| 	EventType       HookEventType | 	EventType       webhook_module.HookEventType | ||||||
| 	IsDelivered     bool | 	IsDelivered     bool | ||||||
| 	Delivered       int64 | 	Delivered       int64 | ||||||
| 	DeliveredString string `xorm:"-"` | 	DeliveredString string `xorm:"-"` | ||||||
|   | |||||||
| @@ -16,6 +16,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	"code.gitea.io/gitea/modules/timeutil" | 	"code.gitea.io/gitea/modules/timeutil" | ||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
| 	"xorm.io/builder" | 	"xorm.io/builder" | ||||||
| ) | ) | ||||||
| @@ -46,7 +47,7 @@ type ErrHookTaskNotExist struct { | |||||||
| 	UUID   string | 	UUID   string | ||||||
| } | } | ||||||
|  |  | ||||||
| // IsErrWebhookNotExist checks if an error is a ErrWebhookNotExist. | // IsErrHookTaskNotExist checks if an error is a ErrHookTaskNotExist. | ||||||
| func IsErrHookTaskNotExist(err error) bool { | func IsErrHookTaskNotExist(err error) bool { | ||||||
| 	_, ok := err.(ErrHookTaskNotExist) | 	_, ok := err.(ErrHookTaskNotExist) | ||||||
| 	return ok | 	return ok | ||||||
| @@ -117,84 +118,22 @@ func IsValidHookContentType(name string) bool { | |||||||
| 	return ok | 	return ok | ||||||
| } | } | ||||||
|  |  | ||||||
| // HookEvents is a set of web hook events |  | ||||||
| type HookEvents struct { |  | ||||||
| 	Create               bool `json:"create"` |  | ||||||
| 	Delete               bool `json:"delete"` |  | ||||||
| 	Fork                 bool `json:"fork"` |  | ||||||
| 	Issues               bool `json:"issues"` |  | ||||||
| 	IssueAssign          bool `json:"issue_assign"` |  | ||||||
| 	IssueLabel           bool `json:"issue_label"` |  | ||||||
| 	IssueMilestone       bool `json:"issue_milestone"` |  | ||||||
| 	IssueComment         bool `json:"issue_comment"` |  | ||||||
| 	Push                 bool `json:"push"` |  | ||||||
| 	PullRequest          bool `json:"pull_request"` |  | ||||||
| 	PullRequestAssign    bool `json:"pull_request_assign"` |  | ||||||
| 	PullRequestLabel     bool `json:"pull_request_label"` |  | ||||||
| 	PullRequestMilestone bool `json:"pull_request_milestone"` |  | ||||||
| 	PullRequestComment   bool `json:"pull_request_comment"` |  | ||||||
| 	PullRequestReview    bool `json:"pull_request_review"` |  | ||||||
| 	PullRequestSync      bool `json:"pull_request_sync"` |  | ||||||
| 	Wiki                 bool `json:"wiki"` |  | ||||||
| 	Repository           bool `json:"repository"` |  | ||||||
| 	Release              bool `json:"release"` |  | ||||||
| 	Package              bool `json:"package"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // HookEvent represents events that will delivery hook. |  | ||||||
| type HookEvent struct { |  | ||||||
| 	PushOnly       bool   `json:"push_only"` |  | ||||||
| 	SendEverything bool   `json:"send_everything"` |  | ||||||
| 	ChooseEvents   bool   `json:"choose_events"` |  | ||||||
| 	BranchFilter   string `json:"branch_filter"` |  | ||||||
|  |  | ||||||
| 	HookEvents `json:"events"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // HookType is the type of a webhook |  | ||||||
| type HookType = string |  | ||||||
|  |  | ||||||
| // Types of webhooks |  | ||||||
| const ( |  | ||||||
| 	GITEA      HookType = "gitea" |  | ||||||
| 	GOGS       HookType = "gogs" |  | ||||||
| 	SLACK      HookType = "slack" |  | ||||||
| 	DISCORD    HookType = "discord" |  | ||||||
| 	DINGTALK   HookType = "dingtalk" |  | ||||||
| 	TELEGRAM   HookType = "telegram" |  | ||||||
| 	MSTEAMS    HookType = "msteams" |  | ||||||
| 	FEISHU     HookType = "feishu" |  | ||||||
| 	MATRIX     HookType = "matrix" |  | ||||||
| 	WECHATWORK HookType = "wechatwork" |  | ||||||
| 	PACKAGIST  HookType = "packagist" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // HookStatus is the status of a web hook |  | ||||||
| type HookStatus int |  | ||||||
|  |  | ||||||
| // Possible statuses of a web hook |  | ||||||
| const ( |  | ||||||
| 	HookStatusNone = iota |  | ||||||
| 	HookStatusSucceed |  | ||||||
| 	HookStatusFail |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| // Webhook represents a web hook object. | // Webhook represents a web hook object. | ||||||
| type Webhook struct { | type Webhook struct { | ||||||
| 	ID              int64 `xorm:"pk autoincr"` | 	ID                        int64 `xorm:"pk autoincr"` | ||||||
| 	RepoID          int64 `xorm:"INDEX"` // An ID of 0 indicates either a default or system webhook | 	RepoID                    int64 `xorm:"INDEX"` // An ID of 0 indicates either a default or system webhook | ||||||
| 	OrgID           int64 `xorm:"INDEX"` | 	OrgID                     int64 `xorm:"INDEX"` | ||||||
| 	IsSystemWebhook bool | 	IsSystemWebhook           bool | ||||||
| 	URL             string `xorm:"url TEXT"` | 	URL                       string `xorm:"url TEXT"` | ||||||
| 	HTTPMethod      string `xorm:"http_method"` | 	HTTPMethod                string `xorm:"http_method"` | ||||||
| 	ContentType     HookContentType | 	ContentType               HookContentType | ||||||
| 	Secret          string `xorm:"TEXT"` | 	Secret                    string `xorm:"TEXT"` | ||||||
| 	Events          string `xorm:"TEXT"` | 	Events                    string `xorm:"TEXT"` | ||||||
| 	*HookEvent      `xorm:"-"` | 	*webhook_module.HookEvent `xorm:"-"` | ||||||
| 	IsActive        bool       `xorm:"INDEX"` | 	IsActive                  bool                      `xorm:"INDEX"` | ||||||
| 	Type            HookType   `xorm:"VARCHAR(16) 'type'"` | 	Type                      webhook_module.HookType   `xorm:"VARCHAR(16) 'type'"` | ||||||
| 	Meta            string     `xorm:"TEXT"` // store hook-specific attributes | 	Meta                      string                    `xorm:"TEXT"` // store hook-specific attributes | ||||||
| 	LastStatus      HookStatus // Last delivery status | 	LastStatus                webhook_module.HookStatus // Last delivery status | ||||||
|  |  | ||||||
| 	// HeaderAuthorizationEncrypted should be accessed using HeaderAuthorization() and SetHeaderAuthorization() | 	// HeaderAuthorizationEncrypted should be accessed using HeaderAuthorization() and SetHeaderAuthorization() | ||||||
| 	HeaderAuthorizationEncrypted string `xorm:"TEXT"` | 	HeaderAuthorizationEncrypted string `xorm:"TEXT"` | ||||||
| @@ -209,7 +148,7 @@ func init() { | |||||||
|  |  | ||||||
| // AfterLoad updates the webhook object upon setting a column | // AfterLoad updates the webhook object upon setting a column | ||||||
| func (w *Webhook) AfterLoad() { | func (w *Webhook) AfterLoad() { | ||||||
| 	w.HookEvent = &HookEvent{} | 	w.HookEvent = &webhook_module.HookEvent{} | ||||||
| 	if err := json.Unmarshal([]byte(w.Events), w.HookEvent); err != nil { | 	if err := json.Unmarshal([]byte(w.Events), w.HookEvent); err != nil { | ||||||
| 		log.Error("Unmarshal[%d]: %v", w.ID, err) | 		log.Error("Unmarshal[%d]: %v", w.ID, err) | ||||||
| 	} | 	} | ||||||
| @@ -362,34 +301,34 @@ func (w *Webhook) HasPackageEvent() bool { | |||||||
| // EventCheckers returns event checkers | // EventCheckers returns event checkers | ||||||
| func (w *Webhook) EventCheckers() []struct { | func (w *Webhook) EventCheckers() []struct { | ||||||
| 	Has  func() bool | 	Has  func() bool | ||||||
| 	Type HookEventType | 	Type webhook_module.HookEventType | ||||||
| } { | } { | ||||||
| 	return []struct { | 	return []struct { | ||||||
| 		Has  func() bool | 		Has  func() bool | ||||||
| 		Type HookEventType | 		Type webhook_module.HookEventType | ||||||
| 	}{ | 	}{ | ||||||
| 		{w.HasCreateEvent, HookEventCreate}, | 		{w.HasCreateEvent, webhook_module.HookEventCreate}, | ||||||
| 		{w.HasDeleteEvent, HookEventDelete}, | 		{w.HasDeleteEvent, webhook_module.HookEventDelete}, | ||||||
| 		{w.HasForkEvent, HookEventFork}, | 		{w.HasForkEvent, webhook_module.HookEventFork}, | ||||||
| 		{w.HasPushEvent, HookEventPush}, | 		{w.HasPushEvent, webhook_module.HookEventPush}, | ||||||
| 		{w.HasIssuesEvent, HookEventIssues}, | 		{w.HasIssuesEvent, webhook_module.HookEventIssues}, | ||||||
| 		{w.HasIssuesAssignEvent, HookEventIssueAssign}, | 		{w.HasIssuesAssignEvent, webhook_module.HookEventIssueAssign}, | ||||||
| 		{w.HasIssuesLabelEvent, HookEventIssueLabel}, | 		{w.HasIssuesLabelEvent, webhook_module.HookEventIssueLabel}, | ||||||
| 		{w.HasIssuesMilestoneEvent, HookEventIssueMilestone}, | 		{w.HasIssuesMilestoneEvent, webhook_module.HookEventIssueMilestone}, | ||||||
| 		{w.HasIssueCommentEvent, HookEventIssueComment}, | 		{w.HasIssueCommentEvent, webhook_module.HookEventIssueComment}, | ||||||
| 		{w.HasPullRequestEvent, HookEventPullRequest}, | 		{w.HasPullRequestEvent, webhook_module.HookEventPullRequest}, | ||||||
| 		{w.HasPullRequestAssignEvent, HookEventPullRequestAssign}, | 		{w.HasPullRequestAssignEvent, webhook_module.HookEventPullRequestAssign}, | ||||||
| 		{w.HasPullRequestLabelEvent, HookEventPullRequestLabel}, | 		{w.HasPullRequestLabelEvent, webhook_module.HookEventPullRequestLabel}, | ||||||
| 		{w.HasPullRequestMilestoneEvent, HookEventPullRequestMilestone}, | 		{w.HasPullRequestMilestoneEvent, webhook_module.HookEventPullRequestMilestone}, | ||||||
| 		{w.HasPullRequestCommentEvent, HookEventPullRequestComment}, | 		{w.HasPullRequestCommentEvent, webhook_module.HookEventPullRequestComment}, | ||||||
| 		{w.HasPullRequestApprovedEvent, HookEventPullRequestReviewApproved}, | 		{w.HasPullRequestApprovedEvent, webhook_module.HookEventPullRequestReviewApproved}, | ||||||
| 		{w.HasPullRequestRejectedEvent, HookEventPullRequestReviewRejected}, | 		{w.HasPullRequestRejectedEvent, webhook_module.HookEventPullRequestReviewRejected}, | ||||||
| 		{w.HasPullRequestCommentEvent, HookEventPullRequestReviewComment}, | 		{w.HasPullRequestCommentEvent, webhook_module.HookEventPullRequestReviewComment}, | ||||||
| 		{w.HasPullRequestSyncEvent, HookEventPullRequestSync}, | 		{w.HasPullRequestSyncEvent, webhook_module.HookEventPullRequestSync}, | ||||||
| 		{w.HasWikiEvent, HookEventWiki}, | 		{w.HasWikiEvent, webhook_module.HookEventWiki}, | ||||||
| 		{w.HasRepositoryEvent, HookEventRepository}, | 		{w.HasRepositoryEvent, webhook_module.HookEventRepository}, | ||||||
| 		{w.HasReleaseEvent, HookEventRelease}, | 		{w.HasReleaseEvent, webhook_module.HookEventRelease}, | ||||||
| 		{w.HasPackageEvent, HookEventPackage}, | 		{w.HasPackageEvent, webhook_module.HookEventPackage}, | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -453,7 +392,7 @@ func getWebhook(bean *Webhook) (*Webhook, error) { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} else if !has { | 	} else if !has { | ||||||
| 		return nil, ErrWebhookNotExist{bean.ID} | 		return nil, ErrWebhookNotExist{ID: bean.ID} | ||||||
| 	} | 	} | ||||||
| 	return bean, nil | 	return bean, nil | ||||||
| } | } | ||||||
| @@ -541,7 +480,7 @@ func GetSystemOrDefaultWebhook(id int64) (*Webhook, error) { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} else if !has { | 	} else if !has { | ||||||
| 		return nil, ErrWebhookNotExist{id} | 		return nil, ErrWebhookNotExist{ID: id} | ||||||
| 	} | 	} | ||||||
| 	return webhook, nil | 	return webhook, nil | ||||||
| } | } | ||||||
|   | |||||||
| @@ -13,6 +13,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/json" | 	"code.gitea.io/gitea/modules/json" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| ) | ) | ||||||
| @@ -46,11 +47,11 @@ func TestWebhook_History(t *testing.T) { | |||||||
| func TestWebhook_UpdateEvent(t *testing.T) { | func TestWebhook_UpdateEvent(t *testing.T) { | ||||||
| 	assert.NoError(t, unittest.PrepareTestDatabase()) | 	assert.NoError(t, unittest.PrepareTestDatabase()) | ||||||
| 	webhook := unittest.AssertExistsAndLoadBean(t, &Webhook{ID: 1}) | 	webhook := unittest.AssertExistsAndLoadBean(t, &Webhook{ID: 1}) | ||||||
| 	hookEvent := &HookEvent{ | 	hookEvent := &webhook_module.HookEvent{ | ||||||
| 		PushOnly:       true, | 		PushOnly:       true, | ||||||
| 		SendEverything: false, | 		SendEverything: false, | ||||||
| 		ChooseEvents:   false, | 		ChooseEvents:   false, | ||||||
| 		HookEvents: HookEvents{ | 		HookEvents: webhook_module.HookEvents{ | ||||||
| 			Create:      false, | 			Create:      false, | ||||||
| 			Push:        true, | 			Push:        true, | ||||||
| 			PullRequest: false, | 			PullRequest: false, | ||||||
| @@ -59,7 +60,7 @@ func TestWebhook_UpdateEvent(t *testing.T) { | |||||||
| 	webhook.HookEvent = hookEvent | 	webhook.HookEvent = hookEvent | ||||||
| 	assert.NoError(t, webhook.UpdateEvent()) | 	assert.NoError(t, webhook.UpdateEvent()) | ||||||
| 	assert.NotEmpty(t, webhook.Events) | 	assert.NotEmpty(t, webhook.Events) | ||||||
| 	actualHookEvent := &HookEvent{} | 	actualHookEvent := &webhook_module.HookEvent{} | ||||||
| 	assert.NoError(t, json.Unmarshal([]byte(webhook.Events), actualHookEvent)) | 	assert.NoError(t, json.Unmarshal([]byte(webhook.Events), actualHookEvent)) | ||||||
| 	assert.Equal(t, *hookEvent, *actualHookEvent) | 	assert.Equal(t, *hookEvent, *actualHookEvent) | ||||||
| } | } | ||||||
| @@ -74,13 +75,13 @@ func TestWebhook_EventsArray(t *testing.T) { | |||||||
| 		"package", | 		"package", | ||||||
| 	}, | 	}, | ||||||
| 		(&Webhook{ | 		(&Webhook{ | ||||||
| 			HookEvent: &HookEvent{SendEverything: true}, | 			HookEvent: &webhook_module.HookEvent{SendEverything: true}, | ||||||
| 		}).EventsArray(), | 		}).EventsArray(), | ||||||
| 	) | 	) | ||||||
|  |  | ||||||
| 	assert.Equal(t, []string{"push"}, | 	assert.Equal(t, []string{"push"}, | ||||||
| 		(&Webhook{ | 		(&Webhook{ | ||||||
| 			HookEvent: &HookEvent{PushOnly: true}, | 			HookEvent: &webhook_module.HookEvent{PushOnly: true}, | ||||||
| 		}).EventsArray(), | 		}).EventsArray(), | ||||||
| 	) | 	) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -16,7 +16,6 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/notification/mail" | 	"code.gitea.io/gitea/modules/notification/mail" | ||||||
| 	"code.gitea.io/gitea/modules/notification/mirror" | 	"code.gitea.io/gitea/modules/notification/mirror" | ||||||
| 	"code.gitea.io/gitea/modules/notification/ui" | 	"code.gitea.io/gitea/modules/notification/ui" | ||||||
| 	"code.gitea.io/gitea/modules/notification/webhook" |  | ||||||
| 	"code.gitea.io/gitea/modules/repository" | 	"code.gitea.io/gitea/modules/repository" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| ) | ) | ||||||
| @@ -36,7 +35,6 @@ func NewContext() { | |||||||
| 		RegisterNotifier(mail.NewNotifier()) | 		RegisterNotifier(mail.NewNotifier()) | ||||||
| 	} | 	} | ||||||
| 	RegisterNotifier(indexer.NewNotifier()) | 	RegisterNotifier(indexer.NewNotifier()) | ||||||
| 	RegisterNotifier(webhook.NewNotifier()) |  | ||||||
| 	RegisterNotifier(action.NewNotifier()) | 	RegisterNotifier(action.NewNotifier()) | ||||||
| 	RegisterNotifier(mirror.NewNotifier()) | 	RegisterNotifier(mirror.NewNotifier()) | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										38
									
								
								modules/webhook/structs.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								modules/webhook/structs.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,38 @@ | |||||||
|  | // Copyright 2022 The Gitea Authors. All rights reserved. | ||||||
|  | // SPDX-License-Identifier: MIT | ||||||
|  |  | ||||||
|  | package webhook | ||||||
|  |  | ||||||
|  | // HookEvents is a set of web hook events | ||||||
|  | type HookEvents struct { | ||||||
|  | 	Create               bool `json:"create"` | ||||||
|  | 	Delete               bool `json:"delete"` | ||||||
|  | 	Fork                 bool `json:"fork"` | ||||||
|  | 	Issues               bool `json:"issues"` | ||||||
|  | 	IssueAssign          bool `json:"issue_assign"` | ||||||
|  | 	IssueLabel           bool `json:"issue_label"` | ||||||
|  | 	IssueMilestone       bool `json:"issue_milestone"` | ||||||
|  | 	IssueComment         bool `json:"issue_comment"` | ||||||
|  | 	Push                 bool `json:"push"` | ||||||
|  | 	PullRequest          bool `json:"pull_request"` | ||||||
|  | 	PullRequestAssign    bool `json:"pull_request_assign"` | ||||||
|  | 	PullRequestLabel     bool `json:"pull_request_label"` | ||||||
|  | 	PullRequestMilestone bool `json:"pull_request_milestone"` | ||||||
|  | 	PullRequestComment   bool `json:"pull_request_comment"` | ||||||
|  | 	PullRequestReview    bool `json:"pull_request_review"` | ||||||
|  | 	PullRequestSync      bool `json:"pull_request_sync"` | ||||||
|  | 	Wiki                 bool `json:"wiki"` | ||||||
|  | 	Repository           bool `json:"repository"` | ||||||
|  | 	Release              bool `json:"release"` | ||||||
|  | 	Package              bool `json:"package"` | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // HookEvent represents events that will delivery hook. | ||||||
|  | type HookEvent struct { | ||||||
|  | 	PushOnly       bool   `json:"push_only"` | ||||||
|  | 	SendEverything bool   `json:"send_everything"` | ||||||
|  | 	ChooseEvents   bool   `json:"choose_events"` | ||||||
|  | 	BranchFilter   string `json:"branch_filter"` | ||||||
|  |  | ||||||
|  | 	HookEvents `json:"events"` | ||||||
|  | } | ||||||
							
								
								
									
										95
									
								
								modules/webhook/type.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								modules/webhook/type.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | |||||||
|  | // Copyright 2022 The Gitea Authors. All rights reserved. | ||||||
|  | // SPDX-License-Identifier: MIT | ||||||
|  |  | ||||||
|  | package webhook | ||||||
|  |  | ||||||
|  | // HookEventType is the type of a hook event | ||||||
|  | type HookEventType string | ||||||
|  |  | ||||||
|  | // Types of hook events | ||||||
|  | const ( | ||||||
|  | 	HookEventCreate                    HookEventType = "create" | ||||||
|  | 	HookEventDelete                    HookEventType = "delete" | ||||||
|  | 	HookEventFork                      HookEventType = "fork" | ||||||
|  | 	HookEventPush                      HookEventType = "push" | ||||||
|  | 	HookEventIssues                    HookEventType = "issues" | ||||||
|  | 	HookEventIssueAssign               HookEventType = "issue_assign" | ||||||
|  | 	HookEventIssueLabel                HookEventType = "issue_label" | ||||||
|  | 	HookEventIssueMilestone            HookEventType = "issue_milestone" | ||||||
|  | 	HookEventIssueComment              HookEventType = "issue_comment" | ||||||
|  | 	HookEventPullRequest               HookEventType = "pull_request" | ||||||
|  | 	HookEventPullRequestAssign         HookEventType = "pull_request_assign" | ||||||
|  | 	HookEventPullRequestLabel          HookEventType = "pull_request_label" | ||||||
|  | 	HookEventPullRequestMilestone      HookEventType = "pull_request_milestone" | ||||||
|  | 	HookEventPullRequestComment        HookEventType = "pull_request_comment" | ||||||
|  | 	HookEventPullRequestReviewApproved HookEventType = "pull_request_review_approved" | ||||||
|  | 	HookEventPullRequestReviewRejected HookEventType = "pull_request_review_rejected" | ||||||
|  | 	HookEventPullRequestReviewComment  HookEventType = "pull_request_review_comment" | ||||||
|  | 	HookEventPullRequestSync           HookEventType = "pull_request_sync" | ||||||
|  | 	HookEventWiki                      HookEventType = "wiki" | ||||||
|  | 	HookEventRepository                HookEventType = "repository" | ||||||
|  | 	HookEventRelease                   HookEventType = "release" | ||||||
|  | 	HookEventPackage                   HookEventType = "package" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // Event returns the HookEventType as an event string | ||||||
|  | func (h HookEventType) Event() string { | ||||||
|  | 	switch h { | ||||||
|  | 	case HookEventCreate: | ||||||
|  | 		return "create" | ||||||
|  | 	case HookEventDelete: | ||||||
|  | 		return "delete" | ||||||
|  | 	case HookEventFork: | ||||||
|  | 		return "fork" | ||||||
|  | 	case HookEventPush: | ||||||
|  | 		return "push" | ||||||
|  | 	case HookEventIssues, HookEventIssueAssign, HookEventIssueLabel, HookEventIssueMilestone: | ||||||
|  | 		return "issues" | ||||||
|  | 	case HookEventPullRequest, HookEventPullRequestAssign, HookEventPullRequestLabel, HookEventPullRequestMilestone, | ||||||
|  | 		HookEventPullRequestSync: | ||||||
|  | 		return "pull_request" | ||||||
|  | 	case HookEventIssueComment, HookEventPullRequestComment: | ||||||
|  | 		return "issue_comment" | ||||||
|  | 	case HookEventPullRequestReviewApproved: | ||||||
|  | 		return "pull_request_approved" | ||||||
|  | 	case HookEventPullRequestReviewRejected: | ||||||
|  | 		return "pull_request_rejected" | ||||||
|  | 	case HookEventPullRequestReviewComment: | ||||||
|  | 		return "pull_request_comment" | ||||||
|  | 	case HookEventWiki: | ||||||
|  | 		return "wiki" | ||||||
|  | 	case HookEventRepository: | ||||||
|  | 		return "repository" | ||||||
|  | 	case HookEventRelease: | ||||||
|  | 		return "release" | ||||||
|  | 	} | ||||||
|  | 	return "" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // HookType is the type of a webhook | ||||||
|  | type HookType = string | ||||||
|  |  | ||||||
|  | // Types of webhooks | ||||||
|  | const ( | ||||||
|  | 	GITEA      HookType = "gitea" | ||||||
|  | 	GOGS       HookType = "gogs" | ||||||
|  | 	SLACK      HookType = "slack" | ||||||
|  | 	DISCORD    HookType = "discord" | ||||||
|  | 	DINGTALK   HookType = "dingtalk" | ||||||
|  | 	TELEGRAM   HookType = "telegram" | ||||||
|  | 	MSTEAMS    HookType = "msteams" | ||||||
|  | 	FEISHU     HookType = "feishu" | ||||||
|  | 	MATRIX     HookType = "matrix" | ||||||
|  | 	WECHATWORK HookType = "wechatwork" | ||||||
|  | 	PACKAGIST  HookType = "packagist" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // HookStatus is the status of a web hook | ||||||
|  | type HookStatus int | ||||||
|  |  | ||||||
|  | // Possible statuses of a web hook | ||||||
|  | const ( | ||||||
|  | 	HookStatusNone HookStatus = iota | ||||||
|  | 	HookStatusSucceed | ||||||
|  | 	HookStatusFail | ||||||
|  | ) | ||||||
| @@ -6,12 +6,12 @@ package org | |||||||
| import ( | import ( | ||||||
| 	"net/http" | 	"net/http" | ||||||
|  |  | ||||||
| 	"code.gitea.io/gitea/models/webhook" | 	webhook_model "code.gitea.io/gitea/models/webhook" | ||||||
| 	"code.gitea.io/gitea/modules/context" | 	"code.gitea.io/gitea/modules/context" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
| 	"code.gitea.io/gitea/modules/web" | 	"code.gitea.io/gitea/modules/web" | ||||||
| 	"code.gitea.io/gitea/routers/api/v1/utils" | 	"code.gitea.io/gitea/routers/api/v1/utils" | ||||||
| 	"code.gitea.io/gitea/services/convert" | 	webhook_service "code.gitea.io/gitea/services/webhook" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // ListHooks list an organziation's webhooks | // ListHooks list an organziation's webhooks | ||||||
| @@ -39,18 +39,18 @@ func ListHooks(ctx *context.APIContext) { | |||||||
| 	//   "200": | 	//   "200": | ||||||
| 	//     "$ref": "#/responses/HookList" | 	//     "$ref": "#/responses/HookList" | ||||||
|  |  | ||||||
| 	opts := &webhook.ListWebhookOptions{ | 	opts := &webhook_model.ListWebhookOptions{ | ||||||
| 		ListOptions: utils.GetListOptions(ctx), | 		ListOptions: utils.GetListOptions(ctx), | ||||||
| 		OrgID:       ctx.Org.Organization.ID, | 		OrgID:       ctx.Org.Organization.ID, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	count, err := webhook.CountWebhooksByOpts(opts) | 	count, err := webhook_model.CountWebhooksByOpts(opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		ctx.InternalServerError(err) | 		ctx.InternalServerError(err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	orgHooks, err := webhook.ListWebhooksByOpts(ctx, opts) | 	orgHooks, err := webhook_model.ListWebhooksByOpts(ctx, opts) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		ctx.InternalServerError(err) | 		ctx.InternalServerError(err) | ||||||
| 		return | 		return | ||||||
| @@ -58,7 +58,7 @@ func ListHooks(ctx *context.APIContext) { | |||||||
|  |  | ||||||
| 	hooks := make([]*api.Hook, len(orgHooks)) | 	hooks := make([]*api.Hook, len(orgHooks)) | ||||||
| 	for i, hook := range orgHooks { | 	for i, hook := range orgHooks { | ||||||
| 		hooks[i], err = convert.ToHook(ctx.Org.Organization.AsUser().HomeLink(), hook) | 		hooks[i], err = webhook_service.ToHook(ctx.Org.Organization.AsUser().HomeLink(), hook) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			ctx.InternalServerError(err) | 			ctx.InternalServerError(err) | ||||||
| 			return | 			return | ||||||
| @@ -99,7 +99,7 @@ func GetHook(ctx *context.APIContext) { | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	apiHook, err := convert.ToHook(org.AsUser().HomeLink(), hook) | 	apiHook, err := webhook_service.ToHook(org.AsUser().HomeLink(), hook) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		ctx.InternalServerError(err) | 		ctx.InternalServerError(err) | ||||||
| 		return | 		return | ||||||
| @@ -200,8 +200,8 @@ func DeleteHook(ctx *context.APIContext) { | |||||||
|  |  | ||||||
| 	org := ctx.Org.Organization | 	org := ctx.Org.Organization | ||||||
| 	hookID := ctx.ParamsInt64(":id") | 	hookID := ctx.ParamsInt64(":id") | ||||||
| 	if err := webhook.DeleteWebhookByOrgID(org.ID, hookID); err != nil { | 	if err := webhook_model.DeleteWebhookByOrgID(org.ID, hookID); err != nil { | ||||||
| 		if webhook.IsErrWebhookNotExist(err) { | 		if webhook_model.IsErrWebhookNotExist(err) { | ||||||
| 			ctx.NotFound() | 			ctx.NotFound() | ||||||
| 		} else { | 		} else { | ||||||
| 			ctx.Error(http.StatusInternalServerError, "DeleteWebhookByOrgID", err) | 			ctx.Error(http.StatusInternalServerError, "DeleteWebhookByOrgID", err) | ||||||
|   | |||||||
| @@ -14,6 +14,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
| 	"code.gitea.io/gitea/modules/web" | 	"code.gitea.io/gitea/modules/web" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
| 	"code.gitea.io/gitea/routers/api/v1/utils" | 	"code.gitea.io/gitea/routers/api/v1/utils" | ||||||
| 	"code.gitea.io/gitea/services/convert" | 	"code.gitea.io/gitea/services/convert" | ||||||
| 	webhook_service "code.gitea.io/gitea/services/webhook" | 	webhook_service "code.gitea.io/gitea/services/webhook" | ||||||
| @@ -68,7 +69,7 @@ func ListHooks(ctx *context.APIContext) { | |||||||
|  |  | ||||||
| 	apiHooks := make([]*api.Hook, len(hooks)) | 	apiHooks := make([]*api.Hook, len(hooks)) | ||||||
| 	for i := range hooks { | 	for i := range hooks { | ||||||
| 		apiHooks[i], err = convert.ToHook(ctx.Repo.RepoLink, hooks[i]) | 		apiHooks[i], err = webhook_service.ToHook(ctx.Repo.RepoLink, hooks[i]) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			ctx.InternalServerError(err) | 			ctx.InternalServerError(err) | ||||||
| 			return | 			return | ||||||
| @@ -115,7 +116,7 @@ func GetHook(ctx *context.APIContext) { | |||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	apiHook, err := convert.ToHook(repo.RepoLink, hook) | 	apiHook, err := webhook_service.ToHook(repo.RepoLink, hook) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		ctx.InternalServerError(err) | 		ctx.InternalServerError(err) | ||||||
| 		return | 		return | ||||||
| @@ -176,7 +177,7 @@ func TestHook(ctx *context.APIContext) { | |||||||
| 	commit := convert.ToPayloadCommit(ctx.Repo.Repository, ctx.Repo.Commit) | 	commit := convert.ToPayloadCommit(ctx.Repo.Repository, ctx.Repo.Commit) | ||||||
|  |  | ||||||
| 	commitID := ctx.Repo.Commit.ID.String() | 	commitID := ctx.Repo.Commit.ID.String() | ||||||
| 	if err := webhook_service.PrepareWebhook(ctx, hook, webhook.HookEventPush, &api.PushPayload{ | 	if err := webhook_service.PrepareWebhook(ctx, hook, webhook_module.HookEventPush, &api.PushPayload{ | ||||||
| 		Ref:          ref, | 		Ref:          ref, | ||||||
| 		Before:       commitID, | 		Before:       commitID, | ||||||
| 		After:        commitID, | 		After:        commitID, | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/json" | 	"code.gitea.io/gitea/modules/json" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
| 	"code.gitea.io/gitea/services/convert" | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
| 	webhook_service "code.gitea.io/gitea/services/webhook" | 	webhook_service "code.gitea.io/gitea/services/webhook" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -98,7 +98,7 @@ func AddRepoHook(ctx *context.APIContext, form *api.CreateHookOption) { | |||||||
| // toAPIHook converts the hook to its API representation. | // toAPIHook converts the hook to its API representation. | ||||||
| // If there is an error, write to `ctx` accordingly. Return (hook, ok) | // If there is an error, write to `ctx` accordingly. Return (hook, ok) | ||||||
| func toAPIHook(ctx *context.APIContext, repoLink string, hook *webhook.Webhook) (*api.Hook, bool) { | func toAPIHook(ctx *context.APIContext, repoLink string, hook *webhook.Webhook) (*api.Hook, bool) { | ||||||
| 	apiHook, err := convert.ToHook(repoLink, hook) | 	apiHook, err := webhook_service.ToHook(repoLink, hook) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		ctx.Error(http.StatusInternalServerError, "ToHook", err) | 		ctx.Error(http.StatusInternalServerError, "ToHook", err) | ||||||
| 		return nil, false | 		return nil, false | ||||||
| @@ -127,9 +127,9 @@ func addHook(ctx *context.APIContext, form *api.CreateHookOption, orgID, repoID | |||||||
| 		ContentType: webhook.ToHookContentType(form.Config["content_type"]), | 		ContentType: webhook.ToHookContentType(form.Config["content_type"]), | ||||||
| 		Secret:      form.Config["secret"], | 		Secret:      form.Config["secret"], | ||||||
| 		HTTPMethod:  "POST", | 		HTTPMethod:  "POST", | ||||||
| 		HookEvent: &webhook.HookEvent{ | 		HookEvent: &webhook_module.HookEvent{ | ||||||
| 			ChooseEvents: true, | 			ChooseEvents: true, | ||||||
| 			HookEvents: webhook.HookEvents{ | 			HookEvents: webhook_module.HookEvents{ | ||||||
| 				Create:               util.IsStringInSlice(string(webhook.HookEventCreate), form.Events, true), | 				Create:               util.IsStringInSlice(string(webhook.HookEventCreate), form.Events, true), | ||||||
| 				Delete:               util.IsStringInSlice(string(webhook.HookEventDelete), form.Events, true), | 				Delete:               util.IsStringInSlice(string(webhook.HookEventDelete), form.Events, true), | ||||||
| 				Fork:                 util.IsStringInSlice(string(webhook.HookEventFork), form.Events, true), | 				Fork:                 util.IsStringInSlice(string(webhook.HookEventFork), form.Events, true), | ||||||
| @@ -160,7 +160,7 @@ func addHook(ctx *context.APIContext, form *api.CreateHookOption, orgID, repoID | |||||||
| 		ctx.Error(http.StatusInternalServerError, "SetHeaderAuthorization", err) | 		ctx.Error(http.StatusInternalServerError, "SetHeaderAuthorization", err) | ||||||
| 		return nil, false | 		return nil, false | ||||||
| 	} | 	} | ||||||
| 	if w.Type == webhook.SLACK { | 	if w.Type == webhook_module.SLACK { | ||||||
| 		channel, ok := form.Config["channel"] | 		channel, ok := form.Config["channel"] | ||||||
| 		if !ok { | 		if !ok { | ||||||
| 			ctx.Error(http.StatusUnprocessableEntity, "", "Missing config option: channel") | 			ctx.Error(http.StatusUnprocessableEntity, "", "Missing config option: channel") | ||||||
| @@ -253,7 +253,7 @@ func editHook(ctx *context.APIContext, form *api.EditHookOption, w *webhook.Webh | |||||||
| 			w.ContentType = webhook.ToHookContentType(ct) | 			w.ContentType = webhook.ToHookContentType(ct) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		if w.Type == webhook.SLACK { | 		if w.Type == webhook_module.SLACK { | ||||||
| 			if channel, ok := form.Config["channel"]; ok { | 			if channel, ok := form.Config["channel"]; ok { | ||||||
| 				meta, err := json.Marshal(&webhook_service.SlackMeta{ | 				meta, err := json.Marshal(&webhook_service.SlackMeta{ | ||||||
| 					Channel:  channel, | 					Channel:  channel, | ||||||
|   | |||||||
| @@ -23,6 +23,7 @@ import ( | |||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
| 	"code.gitea.io/gitea/modules/web" | 	"code.gitea.io/gitea/modules/web" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
| 	"code.gitea.io/gitea/services/convert" | 	"code.gitea.io/gitea/services/convert" | ||||||
| 	"code.gitea.io/gitea/services/forms" | 	"code.gitea.io/gitea/services/forms" | ||||||
| 	webhook_service "code.gitea.io/gitea/services/webhook" | 	webhook_service "code.gitea.io/gitea/services/webhook" | ||||||
| @@ -119,7 +120,7 @@ func checkHookType(ctx *context.Context) string { | |||||||
| // WebhooksNew render creating webhook page | // WebhooksNew render creating webhook page | ||||||
| func WebhooksNew(ctx *context.Context) { | func WebhooksNew(ctx *context.Context) { | ||||||
| 	ctx.Data["Title"] = ctx.Tr("repo.settings.add_webhook") | 	ctx.Data["Title"] = ctx.Tr("repo.settings.add_webhook") | ||||||
| 	ctx.Data["Webhook"] = webhook.Webhook{HookEvent: &webhook.HookEvent{}} | 	ctx.Data["Webhook"] = webhook.Webhook{HookEvent: &webhook_module.HookEvent{}} | ||||||
|  |  | ||||||
| 	orCtx, err := getOrgRepoCtx(ctx) | 	orCtx, err := getOrgRepoCtx(ctx) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @@ -154,12 +155,12 @@ func WebhooksNew(ctx *context.Context) { | |||||||
| } | } | ||||||
|  |  | ||||||
| // ParseHookEvent convert web form content to webhook.HookEvent | // ParseHookEvent convert web form content to webhook.HookEvent | ||||||
| func ParseHookEvent(form forms.WebhookForm) *webhook.HookEvent { | func ParseHookEvent(form forms.WebhookForm) *webhook_module.HookEvent { | ||||||
| 	return &webhook.HookEvent{ | 	return &webhook_module.HookEvent{ | ||||||
| 		PushOnly:       form.PushOnly(), | 		PushOnly:       form.PushOnly(), | ||||||
| 		SendEverything: form.SendEverything(), | 		SendEverything: form.SendEverything(), | ||||||
| 		ChooseEvents:   form.ChooseEvents(), | 		ChooseEvents:   form.ChooseEvents(), | ||||||
| 		HookEvents: webhook.HookEvents{ | 		HookEvents: webhook_module.HookEvents{ | ||||||
| 			Create:               form.Create, | 			Create:               form.Create, | ||||||
| 			Delete:               form.Delete, | 			Delete:               form.Delete, | ||||||
| 			Fork:                 form.Fork, | 			Fork:                 form.Fork, | ||||||
| @@ -201,7 +202,7 @@ func createWebhook(ctx *context.Context, params webhookParams) { | |||||||
| 	ctx.Data["Title"] = ctx.Tr("repo.settings.add_webhook") | 	ctx.Data["Title"] = ctx.Tr("repo.settings.add_webhook") | ||||||
| 	ctx.Data["PageIsSettingsHooks"] = true | 	ctx.Data["PageIsSettingsHooks"] = true | ||||||
| 	ctx.Data["PageIsSettingsHooksNew"] = true | 	ctx.Data["PageIsSettingsHooksNew"] = true | ||||||
| 	ctx.Data["Webhook"] = webhook.Webhook{HookEvent: &webhook.HookEvent{}} | 	ctx.Data["Webhook"] = webhook.Webhook{HookEvent: &webhook_module.HookEvent{}} | ||||||
| 	ctx.Data["HookType"] = params.Type | 	ctx.Data["HookType"] = params.Type | ||||||
|  |  | ||||||
| 	orCtx, err := getOrgRepoCtx(ctx) | 	orCtx, err := getOrgRepoCtx(ctx) | ||||||
| @@ -326,7 +327,7 @@ func giteaHookParams(ctx *context.Context) webhookParams { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return webhookParams{ | 	return webhookParams{ | ||||||
| 		Type:        webhook.GITEA, | 		Type:        webhook_module.GITEA, | ||||||
| 		URL:         form.PayloadURL, | 		URL:         form.PayloadURL, | ||||||
| 		ContentType: contentType, | 		ContentType: contentType, | ||||||
| 		Secret:      form.Secret, | 		Secret:      form.Secret, | ||||||
| @@ -354,7 +355,7 @@ func gogsHookParams(ctx *context.Context) webhookParams { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return webhookParams{ | 	return webhookParams{ | ||||||
| 		Type:        webhook.GOGS, | 		Type:        webhook_module.GOGS, | ||||||
| 		URL:         form.PayloadURL, | 		URL:         form.PayloadURL, | ||||||
| 		ContentType: contentType, | 		ContentType: contentType, | ||||||
| 		Secret:      form.Secret, | 		Secret:      form.Secret, | ||||||
| @@ -376,7 +377,7 @@ func discordHookParams(ctx *context.Context) webhookParams { | |||||||
| 	form := web.GetForm(ctx).(*forms.NewDiscordHookForm) | 	form := web.GetForm(ctx).(*forms.NewDiscordHookForm) | ||||||
|  |  | ||||||
| 	return webhookParams{ | 	return webhookParams{ | ||||||
| 		Type:        webhook.DISCORD, | 		Type:        webhook_module.DISCORD, | ||||||
| 		URL:         form.PayloadURL, | 		URL:         form.PayloadURL, | ||||||
| 		ContentType: webhook.ContentTypeJSON, | 		ContentType: webhook.ContentTypeJSON, | ||||||
| 		WebhookForm: form.WebhookForm, | 		WebhookForm: form.WebhookForm, | ||||||
| @@ -401,7 +402,7 @@ func dingtalkHookParams(ctx *context.Context) webhookParams { | |||||||
| 	form := web.GetForm(ctx).(*forms.NewDingtalkHookForm) | 	form := web.GetForm(ctx).(*forms.NewDingtalkHookForm) | ||||||
|  |  | ||||||
| 	return webhookParams{ | 	return webhookParams{ | ||||||
| 		Type:        webhook.DINGTALK, | 		Type:        webhook_module.DINGTALK, | ||||||
| 		URL:         form.PayloadURL, | 		URL:         form.PayloadURL, | ||||||
| 		ContentType: webhook.ContentTypeJSON, | 		ContentType: webhook.ContentTypeJSON, | ||||||
| 		WebhookForm: form.WebhookForm, | 		WebhookForm: form.WebhookForm, | ||||||
| @@ -422,7 +423,7 @@ func telegramHookParams(ctx *context.Context) webhookParams { | |||||||
| 	form := web.GetForm(ctx).(*forms.NewTelegramHookForm) | 	form := web.GetForm(ctx).(*forms.NewTelegramHookForm) | ||||||
|  |  | ||||||
| 	return webhookParams{ | 	return webhookParams{ | ||||||
| 		Type:        webhook.TELEGRAM, | 		Type:        webhook_module.TELEGRAM, | ||||||
| 		URL:         fmt.Sprintf("https://api.telegram.org/bot%s/sendMessage?chat_id=%s", url.PathEscape(form.BotToken), url.QueryEscape(form.ChatID)), | 		URL:         fmt.Sprintf("https://api.telegram.org/bot%s/sendMessage?chat_id=%s", url.PathEscape(form.BotToken), url.QueryEscape(form.ChatID)), | ||||||
| 		ContentType: webhook.ContentTypeJSON, | 		ContentType: webhook.ContentTypeJSON, | ||||||
| 		WebhookForm: form.WebhookForm, | 		WebhookForm: form.WebhookForm, | ||||||
| @@ -447,7 +448,7 @@ func matrixHookParams(ctx *context.Context) webhookParams { | |||||||
| 	form := web.GetForm(ctx).(*forms.NewMatrixHookForm) | 	form := web.GetForm(ctx).(*forms.NewMatrixHookForm) | ||||||
|  |  | ||||||
| 	return webhookParams{ | 	return webhookParams{ | ||||||
| 		Type:        webhook.MATRIX, | 		Type:        webhook_module.MATRIX, | ||||||
| 		URL:         fmt.Sprintf("%s/_matrix/client/r0/rooms/%s/send/m.room.message", form.HomeserverURL, url.PathEscape(form.RoomID)), | 		URL:         fmt.Sprintf("%s/_matrix/client/r0/rooms/%s/send/m.room.message", form.HomeserverURL, url.PathEscape(form.RoomID)), | ||||||
| 		ContentType: webhook.ContentTypeJSON, | 		ContentType: webhook.ContentTypeJSON, | ||||||
| 		HTTPMethod:  http.MethodPut, | 		HTTPMethod:  http.MethodPut, | ||||||
| @@ -474,7 +475,7 @@ func mSTeamsHookParams(ctx *context.Context) webhookParams { | |||||||
| 	form := web.GetForm(ctx).(*forms.NewMSTeamsHookForm) | 	form := web.GetForm(ctx).(*forms.NewMSTeamsHookForm) | ||||||
|  |  | ||||||
| 	return webhookParams{ | 	return webhookParams{ | ||||||
| 		Type:        webhook.MSTEAMS, | 		Type:        webhook_module.MSTEAMS, | ||||||
| 		URL:         form.PayloadURL, | 		URL:         form.PayloadURL, | ||||||
| 		ContentType: webhook.ContentTypeJSON, | 		ContentType: webhook.ContentTypeJSON, | ||||||
| 		WebhookForm: form.WebhookForm, | 		WebhookForm: form.WebhookForm, | ||||||
| @@ -495,7 +496,7 @@ func slackHookParams(ctx *context.Context) webhookParams { | |||||||
| 	form := web.GetForm(ctx).(*forms.NewSlackHookForm) | 	form := web.GetForm(ctx).(*forms.NewSlackHookForm) | ||||||
|  |  | ||||||
| 	return webhookParams{ | 	return webhookParams{ | ||||||
| 		Type:        webhook.SLACK, | 		Type:        webhook_module.SLACK, | ||||||
| 		URL:         form.PayloadURL, | 		URL:         form.PayloadURL, | ||||||
| 		ContentType: webhook.ContentTypeJSON, | 		ContentType: webhook.ContentTypeJSON, | ||||||
| 		WebhookForm: form.WebhookForm, | 		WebhookForm: form.WebhookForm, | ||||||
| @@ -522,7 +523,7 @@ func feishuHookParams(ctx *context.Context) webhookParams { | |||||||
| 	form := web.GetForm(ctx).(*forms.NewFeishuHookForm) | 	form := web.GetForm(ctx).(*forms.NewFeishuHookForm) | ||||||
|  |  | ||||||
| 	return webhookParams{ | 	return webhookParams{ | ||||||
| 		Type:        webhook.FEISHU, | 		Type:        webhook_module.FEISHU, | ||||||
| 		URL:         form.PayloadURL, | 		URL:         form.PayloadURL, | ||||||
| 		ContentType: webhook.ContentTypeJSON, | 		ContentType: webhook.ContentTypeJSON, | ||||||
| 		WebhookForm: form.WebhookForm, | 		WebhookForm: form.WebhookForm, | ||||||
| @@ -543,7 +544,7 @@ func wechatworkHookParams(ctx *context.Context) webhookParams { | |||||||
| 	form := web.GetForm(ctx).(*forms.NewWechatWorkHookForm) | 	form := web.GetForm(ctx).(*forms.NewWechatWorkHookForm) | ||||||
|  |  | ||||||
| 	return webhookParams{ | 	return webhookParams{ | ||||||
| 		Type:        webhook.WECHATWORK, | 		Type:        webhook_module.WECHATWORK, | ||||||
| 		URL:         form.PayloadURL, | 		URL:         form.PayloadURL, | ||||||
| 		ContentType: webhook.ContentTypeJSON, | 		ContentType: webhook.ContentTypeJSON, | ||||||
| 		WebhookForm: form.WebhookForm, | 		WebhookForm: form.WebhookForm, | ||||||
| @@ -564,7 +565,7 @@ func packagistHookParams(ctx *context.Context) webhookParams { | |||||||
| 	form := web.GetForm(ctx).(*forms.NewPackagistHookForm) | 	form := web.GetForm(ctx).(*forms.NewPackagistHookForm) | ||||||
|  |  | ||||||
| 	return webhookParams{ | 	return webhookParams{ | ||||||
| 		Type:        webhook.PACKAGIST, | 		Type:        webhook_module.PACKAGIST, | ||||||
| 		URL:         fmt.Sprintf("https://packagist.org/api/update-package?username=%s&apiToken=%s", url.QueryEscape(form.Username), url.QueryEscape(form.APIToken)), | 		URL:         fmt.Sprintf("https://packagist.org/api/update-package?username=%s&apiToken=%s", url.QueryEscape(form.Username), url.QueryEscape(form.APIToken)), | ||||||
| 		ContentType: webhook.ContentTypeJSON, | 		ContentType: webhook.ContentTypeJSON, | ||||||
| 		WebhookForm: form.WebhookForm, | 		WebhookForm: form.WebhookForm, | ||||||
| @@ -603,15 +604,15 @@ func checkWebhook(ctx *context.Context) (*orgRepoCtx, *webhook.Webhook) { | |||||||
|  |  | ||||||
| 	ctx.Data["HookType"] = w.Type | 	ctx.Data["HookType"] = w.Type | ||||||
| 	switch w.Type { | 	switch w.Type { | ||||||
| 	case webhook.SLACK: | 	case webhook_module.SLACK: | ||||||
| 		ctx.Data["SlackHook"] = webhook_service.GetSlackHook(w) | 		ctx.Data["SlackHook"] = webhook_service.GetSlackHook(w) | ||||||
| 	case webhook.DISCORD: | 	case webhook_module.DISCORD: | ||||||
| 		ctx.Data["DiscordHook"] = webhook_service.GetDiscordHook(w) | 		ctx.Data["DiscordHook"] = webhook_service.GetDiscordHook(w) | ||||||
| 	case webhook.TELEGRAM: | 	case webhook_module.TELEGRAM: | ||||||
| 		ctx.Data["TelegramHook"] = webhook_service.GetTelegramHook(w) | 		ctx.Data["TelegramHook"] = webhook_service.GetTelegramHook(w) | ||||||
| 	case webhook.MATRIX: | 	case webhook_module.MATRIX: | ||||||
| 		ctx.Data["MatrixHook"] = webhook_service.GetMatrixHook(w) | 		ctx.Data["MatrixHook"] = webhook_service.GetMatrixHook(w) | ||||||
| 	case webhook.PACKAGIST: | 	case webhook_module.PACKAGIST: | ||||||
| 		ctx.Data["PackagistHook"] = webhook_service.GetPackagistHook(w) | 		ctx.Data["PackagistHook"] = webhook_service.GetPackagistHook(w) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -688,7 +689,7 @@ func TestWebhook(ctx *context.Context) { | |||||||
| 		Pusher:       apiUser, | 		Pusher:       apiUser, | ||||||
| 		Sender:       apiUser, | 		Sender:       apiUser, | ||||||
| 	} | 	} | ||||||
| 	if err := webhook_service.PrepareWebhook(ctx, w, webhook.HookEventPush, p); err != nil { | 	if err := webhook_service.PrepareWebhook(ctx, w, webhook_module.HookEventPush, p); err != nil { | ||||||
| 		ctx.Flash.Error("PrepareWebhook: " + err.Error()) | 		ctx.Flash.Error("PrepareWebhook: " + err.Error()) | ||||||
| 		ctx.Status(http.StatusInternalServerError) | 		ctx.Status(http.StatusInternalServerError) | ||||||
| 	} else { | 	} else { | ||||||
|   | |||||||
| @@ -22,13 +22,11 @@ import ( | |||||||
| 	repo_model "code.gitea.io/gitea/models/repo" | 	repo_model "code.gitea.io/gitea/models/repo" | ||||||
| 	"code.gitea.io/gitea/models/unit" | 	"code.gitea.io/gitea/models/unit" | ||||||
| 	user_model "code.gitea.io/gitea/models/user" | 	user_model "code.gitea.io/gitea/models/user" | ||||||
| 	"code.gitea.io/gitea/models/webhook" |  | ||||||
| 	"code.gitea.io/gitea/modules/git" | 	"code.gitea.io/gitea/modules/git" | ||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
| 	"code.gitea.io/gitea/services/gitdiff" | 	"code.gitea.io/gitea/services/gitdiff" | ||||||
| 	webhook_service "code.gitea.io/gitea/services/webhook" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // ToEmail convert models.EmailAddress to api.Email | // ToEmail convert models.EmailAddress to api.Email | ||||||
| @@ -242,38 +240,6 @@ func ToGPGKeyEmail(email *user_model.EmailAddress) *api.GPGKeyEmail { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| // ToHook convert models.Webhook to api.Hook |  | ||||||
| func ToHook(repoLink string, w *webhook.Webhook) (*api.Hook, error) { |  | ||||||
| 	config := map[string]string{ |  | ||||||
| 		"url":          w.URL, |  | ||||||
| 		"content_type": w.ContentType.Name(), |  | ||||||
| 	} |  | ||||||
| 	if w.Type == webhook.SLACK { |  | ||||||
| 		s := webhook_service.GetSlackHook(w) |  | ||||||
| 		config["channel"] = s.Channel |  | ||||||
| 		config["username"] = s.Username |  | ||||||
| 		config["icon_url"] = s.IconURL |  | ||||||
| 		config["color"] = s.Color |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	authorizationHeader, err := w.HeaderAuthorization() |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return &api.Hook{ |  | ||||||
| 		ID:                  w.ID, |  | ||||||
| 		Type:                w.Type, |  | ||||||
| 		URL:                 fmt.Sprintf("%s/settings/hooks/%d", repoLink, w.ID), |  | ||||||
| 		Active:              w.IsActive, |  | ||||||
| 		Config:              config, |  | ||||||
| 		Events:              w.EventsArray(), |  | ||||||
| 		AuthorizationHeader: authorizationHeader, |  | ||||||
| 		Updated:             w.UpdatedUnix.AsTime(), |  | ||||||
| 		Created:             w.CreatedUnix.AsTime(), |  | ||||||
| 	}, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // ToGitHook convert git.Hook to api.GitHook | // ToGitHook convert git.Hook to api.GitHook | ||||||
| func ToGitHook(h *git.Hook) *api.GitHook { | func ToGitHook(h *git.Hook) *api.GitHook { | ||||||
| 	return &api.GitHook{ | 	return &api.GitHook{ | ||||||
|   | |||||||
| @@ -26,6 +26,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/proxy" | 	"code.gitea.io/gitea/modules/proxy" | ||||||
| 	"code.gitea.io/gitea/modules/queue" | 	"code.gitea.io/gitea/modules/queue" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
| 	"github.com/gobwas/glob" | 	"github.com/gobwas/glob" | ||||||
| ) | ) | ||||||
| @@ -89,7 +90,7 @@ func Deliver(ctx context.Context, t *webhook_model.HookTask) error { | |||||||
| 		} | 		} | ||||||
| 	case http.MethodPut: | 	case http.MethodPut: | ||||||
| 		switch w.Type { | 		switch w.Type { | ||||||
| 		case webhook_model.MATRIX: | 		case webhook_module.MATRIX: | ||||||
| 			txnID, err := getMatrixTxnID([]byte(t.PayloadContent)) | 			txnID, err := getMatrixTxnID([]byte(t.PayloadContent)) | ||||||
| 			if err != nil { | 			if err != nil { | ||||||
| 				return err | 				return err | ||||||
| @@ -189,9 +190,9 @@ func Deliver(ctx context.Context, t *webhook_model.HookTask) error { | |||||||
|  |  | ||||||
| 		// Update webhook last delivery status. | 		// Update webhook last delivery status. | ||||||
| 		if t.IsSucceed { | 		if t.IsSucceed { | ||||||
| 			w.LastStatus = webhook_model.HookStatusSucceed | 			w.LastStatus = webhook_module.HookStatusSucceed | ||||||
| 		} else { | 		} else { | ||||||
| 			w.LastStatus = webhook_model.HookStatusFail | 			w.LastStatus = webhook_module.HookStatusFail | ||||||
| 		} | 		} | ||||||
| 		if err = webhook_model.UpdateWebhookLastStatus(w); err != nil { | 		if err = webhook_model.UpdateWebhookLastStatus(w); err != nil { | ||||||
| 			log.Error("UpdateWebhookLastStatus: %v", err) | 			log.Error("UpdateWebhookLastStatus: %v", err) | ||||||
|   | |||||||
| @@ -16,6 +16,7 @@ import ( | |||||||
| 	webhook_model "code.gitea.io/gitea/models/webhook" | 	webhook_model "code.gitea.io/gitea/models/webhook" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| ) | ) | ||||||
| @@ -62,14 +63,14 @@ func TestWebhookDeliverAuthorizationHeader(t *testing.T) { | |||||||
| 		URL:         s.URL + "/webhook", | 		URL:         s.URL + "/webhook", | ||||||
| 		ContentType: webhook_model.ContentTypeJSON, | 		ContentType: webhook_model.ContentTypeJSON, | ||||||
| 		IsActive:    true, | 		IsActive:    true, | ||||||
| 		Type:        webhook_model.GITEA, | 		Type:        webhook_module.GITEA, | ||||||
| 	} | 	} | ||||||
| 	err := hook.SetHeaderAuthorization("Bearer s3cr3t-t0ken") | 	err := hook.SetHeaderAuthorization("Bearer s3cr3t-t0ken") | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
| 	assert.NoError(t, webhook_model.CreateWebhook(db.DefaultContext, hook)) | 	assert.NoError(t, webhook_model.CreateWebhook(db.DefaultContext, hook)) | ||||||
| 	db.GetEngine(db.DefaultContext).NoAutoTime().DB().Logger.ShowSQL(true) | 	db.GetEngine(db.DefaultContext).NoAutoTime().DB().Logger.ShowSQL(true) | ||||||
|  |  | ||||||
| 	hookTask := &webhook_model.HookTask{HookID: hook.ID, EventType: webhook_model.HookEventPush, Payloader: &api.PushPayload{}} | 	hookTask := &webhook_model.HookTask{HookID: hook.ID, EventType: webhook_module.HookEventPush, Payloader: &api.PushPayload{}} | ||||||
|  |  | ||||||
| 	hookTask, err = webhook_model.CreateHookTask(db.DefaultContext, hookTask) | 	hookTask, err = webhook_model.CreateHookTask(db.DefaultContext, hookTask) | ||||||
| 	assert.NoError(t, err) | 	assert.NoError(t, err) | ||||||
|   | |||||||
| @@ -8,11 +8,11 @@ import ( | |||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| 	webhook_model "code.gitea.io/gitea/models/webhook" |  | ||||||
| 	"code.gitea.io/gitea/modules/git" | 	"code.gitea.io/gitea/modules/git" | ||||||
| 	"code.gitea.io/gitea/modules/json" | 	"code.gitea.io/gitea/modules/json" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
| 	dingtalk "gitea.com/lunny/dingtalk_webhook" | 	dingtalk "gitea.com/lunny/dingtalk_webhook" | ||||||
| ) | ) | ||||||
| @@ -129,7 +129,7 @@ func (d *DingtalkPayload) PullRequest(p *api.PullRequestPayload) (api.Payloader, | |||||||
| } | } | ||||||
|  |  | ||||||
| // Review implements PayloadConvertor Review method | // Review implements PayloadConvertor Review method | ||||||
| func (d *DingtalkPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) { | func (d *DingtalkPayload) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (api.Payloader, error) { | ||||||
| 	var text, title string | 	var text, title string | ||||||
| 	switch p.Action { | 	switch p.Action { | ||||||
| 	case api.HookIssueReviewed: | 	case api.HookIssueReviewed: | ||||||
| @@ -190,6 +190,6 @@ func createDingtalkPayload(title, text, singleTitle, singleURL string) *Dingtalk | |||||||
| } | } | ||||||
|  |  | ||||||
| // GetDingtalkPayload converts a ding talk webhook into a DingtalkPayload | // GetDingtalkPayload converts a ding talk webhook into a DingtalkPayload | ||||||
| func GetDingtalkPayload(p api.Payloader, event webhook_model.HookEventType, meta string) (api.Payloader, error) { | func GetDingtalkPayload(p api.Payloader, event webhook_module.HookEventType, _ string) (api.Payloader, error) { | ||||||
| 	return convertPayloader(new(DingtalkPayload), p, event) | 	return convertPayloader(new(DingtalkPayload), p, event) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -7,8 +7,8 @@ import ( | |||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	webhook_model "code.gitea.io/gitea/models/webhook" |  | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| 	"github.com/stretchr/testify/require" | 	"github.com/stretchr/testify/require" | ||||||
| @@ -162,7 +162,7 @@ func TestDingTalkPayload(t *testing.T) { | |||||||
| 		p.Action = api.HookIssueReviewed | 		p.Action = api.HookIssueReviewed | ||||||
|  |  | ||||||
| 		d := new(DingtalkPayload) | 		d := new(DingtalkPayload) | ||||||
| 		pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved) | 		pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved) | ||||||
| 		require.NoError(t, err) | 		require.NoError(t, err) | ||||||
| 		require.NotNil(t, pl) | 		require.NotNil(t, pl) | ||||||
| 		require.IsType(t, &DingtalkPayload{}, pl) | 		require.IsType(t, &DingtalkPayload{}, pl) | ||||||
|   | |||||||
| @@ -17,6 +17,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type ( | type ( | ||||||
| @@ -190,7 +191,7 @@ func (d *DiscordPayload) PullRequest(p *api.PullRequestPayload) (api.Payloader, | |||||||
| } | } | ||||||
|  |  | ||||||
| // Review implements PayloadConvertor Review method | // Review implements PayloadConvertor Review method | ||||||
| func (d *DiscordPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) { | func (d *DiscordPayload) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (api.Payloader, error) { | ||||||
| 	var text, title string | 	var text, title string | ||||||
| 	var color int | 	var color int | ||||||
| 	switch p.Action { | 	switch p.Action { | ||||||
| @@ -204,11 +205,11 @@ func (d *DiscordPayload) Review(p *api.PullRequestPayload, event webhook_model.H | |||||||
| 		text = p.Review.Content | 		text = p.Review.Content | ||||||
|  |  | ||||||
| 		switch event { | 		switch event { | ||||||
| 		case webhook_model.HookEventPullRequestReviewApproved: | 		case webhook_module.HookEventPullRequestReviewApproved: | ||||||
| 			color = greenColor | 			color = greenColor | ||||||
| 		case webhook_model.HookEventPullRequestReviewRejected: | 		case webhook_module.HookEventPullRequestReviewRejected: | ||||||
| 			color = redColor | 			color = redColor | ||||||
| 		case webhook_model.HookEventPullRequestComment: | 		case webhook_module.HookEventPullRequestComment: | ||||||
| 			color = greyColor | 			color = greyColor | ||||||
| 		default: | 		default: | ||||||
| 			color = yellowColor | 			color = yellowColor | ||||||
| @@ -256,7 +257,7 @@ func (d *DiscordPayload) Release(p *api.ReleasePayload) (api.Payloader, error) { | |||||||
| } | } | ||||||
|  |  | ||||||
| // GetDiscordPayload converts a discord webhook into a DiscordPayload | // GetDiscordPayload converts a discord webhook into a DiscordPayload | ||||||
| func GetDiscordPayload(p api.Payloader, event webhook_model.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) | ||||||
|  |  | ||||||
| 	discord := &DiscordMeta{} | 	discord := &DiscordMeta{} | ||||||
| @@ -269,14 +270,14 @@ func GetDiscordPayload(p api.Payloader, event webhook_model.HookEventType, meta | |||||||
| 	return convertPayloader(s, p, event) | 	return convertPayloader(s, p, event) | ||||||
| } | } | ||||||
|  |  | ||||||
| func parseHookPullRequestEventType(event webhook_model.HookEventType) (string, error) { | func parseHookPullRequestEventType(event webhook_module.HookEventType) (string, error) { | ||||||
| 	switch event { | 	switch event { | ||||||
|  |  | ||||||
| 	case webhook_model.HookEventPullRequestReviewApproved: | 	case webhook_module.HookEventPullRequestReviewApproved: | ||||||
| 		return "approved", nil | 		return "approved", nil | ||||||
| 	case webhook_model.HookEventPullRequestReviewRejected: | 	case webhook_module.HookEventPullRequestReviewRejected: | ||||||
| 		return "rejected", nil | 		return "rejected", nil | ||||||
| 	case webhook_model.HookEventPullRequestComment: | 	case webhook_module.HookEventPullRequestComment: | ||||||
| 		return "comment", nil | 		return "comment", nil | ||||||
|  |  | ||||||
| 	default: | 	default: | ||||||
|   | |||||||
| @@ -6,9 +6,9 @@ package webhook | |||||||
| import ( | import ( | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	webhook_model "code.gitea.io/gitea/models/webhook" |  | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| 	"github.com/stretchr/testify/require" | 	"github.com/stretchr/testify/require" | ||||||
| @@ -179,7 +179,7 @@ func TestDiscordPayload(t *testing.T) { | |||||||
| 		p.Action = api.HookIssueReviewed | 		p.Action = api.HookIssueReviewed | ||||||
|  |  | ||||||
| 		d := new(DiscordPayload) | 		d := new(DiscordPayload) | ||||||
| 		pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved) | 		pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved) | ||||||
| 		require.NoError(t, err) | 		require.NoError(t, err) | ||||||
| 		require.NotNil(t, pl) | 		require.NotNil(t, pl) | ||||||
| 		require.IsType(t, &DiscordPayload{}, pl) | 		require.IsType(t, &DiscordPayload{}, pl) | ||||||
|   | |||||||
| @@ -7,10 +7,10 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| 	webhook_model "code.gitea.io/gitea/models/webhook" |  | ||||||
| 	"code.gitea.io/gitea/modules/git" | 	"code.gitea.io/gitea/modules/git" | ||||||
| 	"code.gitea.io/gitea/modules/json" | 	"code.gitea.io/gitea/modules/json" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type ( | type ( | ||||||
| @@ -117,7 +117,7 @@ func (f *FeishuPayload) PullRequest(p *api.PullRequestPayload) (api.Payloader, e | |||||||
| } | } | ||||||
|  |  | ||||||
| // Review implements PayloadConvertor Review method | // Review implements PayloadConvertor Review method | ||||||
| func (f *FeishuPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) { | func (f *FeishuPayload) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (api.Payloader, error) { | ||||||
| 	action, err := parseHookPullRequestEventType(event) | 	action, err := parseHookPullRequestEventType(event) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| @@ -159,6 +159,6 @@ func (f *FeishuPayload) Release(p *api.ReleasePayload) (api.Payloader, error) { | |||||||
| } | } | ||||||
|  |  | ||||||
| // 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_model.HookEventType, meta 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) | ||||||
| } | } | ||||||
|   | |||||||
| @@ -6,8 +6,8 @@ package webhook | |||||||
| import ( | import ( | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	webhook_model "code.gitea.io/gitea/models/webhook" |  | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| 	"github.com/stretchr/testify/require" | 	"github.com/stretchr/testify/require" | ||||||
| @@ -124,7 +124,7 @@ func TestFeishuPayload(t *testing.T) { | |||||||
| 		p.Action = api.HookIssueReviewed | 		p.Action = api.HookIssueReviewed | ||||||
|  |  | ||||||
| 		d := new(FeishuPayload) | 		d := new(FeishuPayload) | ||||||
| 		pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved) | 		pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved) | ||||||
| 		require.NoError(t, err) | 		require.NoError(t, err) | ||||||
| 		require.NotNil(t, pl) | 		require.NotNil(t, pl) | ||||||
| 		require.IsType(t, &FeishuPayload{}, pl) | 		require.IsType(t, &FeishuPayload{}, pl) | ||||||
|   | |||||||
| @@ -9,9 +9,11 @@ import ( | |||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
|  | 	webhook_model "code.gitea.io/gitea/models/webhook" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type linkFormatter = func(string, string) string | type linkFormatter = func(string, string) string | ||||||
| @@ -223,3 +225,36 @@ func getIssueCommentPayloadInfo(p *api.IssueCommentPayload, linkFormatter linkFo | |||||||
|  |  | ||||||
| 	return text, issueTitle, color | 	return text, issueTitle, 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) { | ||||||
|  | 	config := map[string]string{ | ||||||
|  | 		"url":          w.URL, | ||||||
|  | 		"content_type": w.ContentType.Name(), | ||||||
|  | 	} | ||||||
|  | 	if w.Type == webhook_module.SLACK { | ||||||
|  | 		s := GetSlackHook(w) | ||||||
|  | 		config["channel"] = s.Channel | ||||||
|  | 		config["username"] = s.Username | ||||||
|  | 		config["icon_url"] = s.IconURL | ||||||
|  | 		config["color"] = s.Color | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	authorizationHeader, err := w.HeaderAuthorization() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return &api.Hook{ | ||||||
|  | 		ID:                  w.ID, | ||||||
|  | 		Type:                w.Type, | ||||||
|  | 		URL:                 fmt.Sprintf("%s/settings/hooks/%d", repoLink, w.ID), | ||||||
|  | 		Active:              w.IsActive, | ||||||
|  | 		Config:              config, | ||||||
|  | 		Events:              w.EventsArray(), | ||||||
|  | 		AuthorizationHeader: authorizationHeader, | ||||||
|  | 		Updated:             w.UpdatedUnix.AsTime(), | ||||||
|  | 		Created:             w.CreatedUnix.AsTime(), | ||||||
|  | 	}, nil | ||||||
|  | } | ||||||
|   | |||||||
| @@ -20,6 +20,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| const matrixPayloadSizeLimit = 1024 * 64 | const matrixPayloadSizeLimit = 1024 * 64 | ||||||
| @@ -173,7 +174,7 @@ func (m *MatrixPayload) PullRequest(p *api.PullRequestPayload) (api.Payloader, e | |||||||
| } | } | ||||||
|  |  | ||||||
| // Review implements PayloadConvertor Review method | // Review implements PayloadConvertor Review method | ||||||
| func (m *MatrixPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) { | func (m *MatrixPayload) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (api.Payloader, error) { | ||||||
| 	senderLink := MatrixLinkFormatter(setting.AppURL+url.PathEscape(p.Sender.UserName), p.Sender.UserName) | 	senderLink := MatrixLinkFormatter(setting.AppURL+url.PathEscape(p.Sender.UserName), p.Sender.UserName) | ||||||
| 	title := fmt.Sprintf("#%d %s", p.Index, p.PullRequest.Title) | 	title := fmt.Sprintf("#%d %s", p.Index, p.PullRequest.Title) | ||||||
| 	titleLink := MatrixLinkFormatter(p.PullRequest.URL, title) | 	titleLink := MatrixLinkFormatter(p.PullRequest.URL, title) | ||||||
| @@ -210,7 +211,7 @@ func (m *MatrixPayload) Repository(p *api.RepositoryPayload) (api.Payloader, err | |||||||
| } | } | ||||||
|  |  | ||||||
| // GetMatrixPayload converts a Matrix webhook into a MatrixPayload | // GetMatrixPayload converts a Matrix webhook into a MatrixPayload | ||||||
| func GetMatrixPayload(p api.Payloader, event webhook_model.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) | ||||||
|  |  | ||||||
| 	matrix := &MatrixMeta{} | 	matrix := &MatrixMeta{} | ||||||
|   | |||||||
| @@ -6,8 +6,8 @@ package webhook | |||||||
| import ( | import ( | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	webhook_model "code.gitea.io/gitea/models/webhook" |  | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| 	"github.com/stretchr/testify/require" | 	"github.com/stretchr/testify/require" | ||||||
| @@ -133,7 +133,7 @@ func TestMatrixPayload(t *testing.T) { | |||||||
| 		p.Action = api.HookIssueReviewed | 		p.Action = api.HookIssueReviewed | ||||||
|  |  | ||||||
| 		d := new(MatrixPayload) | 		d := new(MatrixPayload) | ||||||
| 		pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved) | 		pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved) | ||||||
| 		require.NoError(t, err) | 		require.NoError(t, err) | ||||||
| 		require.NotNil(t, pl) | 		require.NotNil(t, pl) | ||||||
| 		require.IsType(t, &MatrixPayload{}, pl) | 		require.IsType(t, &MatrixPayload{}, pl) | ||||||
|   | |||||||
| @@ -8,11 +8,11 @@ import ( | |||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| 	webhook_model "code.gitea.io/gitea/models/webhook" |  | ||||||
| 	"code.gitea.io/gitea/modules/git" | 	"code.gitea.io/gitea/modules/git" | ||||||
| 	"code.gitea.io/gitea/modules/json" | 	"code.gitea.io/gitea/modules/json" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type ( | type ( | ||||||
| @@ -205,7 +205,7 @@ func (m *MSTeamsPayload) PullRequest(p *api.PullRequestPayload) (api.Payloader, | |||||||
| } | } | ||||||
|  |  | ||||||
| // Review implements PayloadConvertor Review method | // Review implements PayloadConvertor Review method | ||||||
| func (m *MSTeamsPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) { | func (m *MSTeamsPayload) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (api.Payloader, error) { | ||||||
| 	var text, title string | 	var text, title string | ||||||
| 	var color int | 	var color int | ||||||
| 	switch p.Action { | 	switch p.Action { | ||||||
| @@ -219,11 +219,11 @@ func (m *MSTeamsPayload) Review(p *api.PullRequestPayload, event webhook_model.H | |||||||
| 		text = p.Review.Content | 		text = p.Review.Content | ||||||
|  |  | ||||||
| 		switch event { | 		switch event { | ||||||
| 		case webhook_model.HookEventPullRequestReviewApproved: | 		case webhook_module.HookEventPullRequestReviewApproved: | ||||||
| 			color = greenColor | 			color = greenColor | ||||||
| 		case webhook_model.HookEventPullRequestReviewRejected: | 		case webhook_module.HookEventPullRequestReviewRejected: | ||||||
| 			color = redColor | 			color = redColor | ||||||
| 		case webhook_model.HookEventPullRequestComment: | 		case webhook_module.HookEventPullRequestComment: | ||||||
| 			color = greyColor | 			color = greyColor | ||||||
| 		default: | 		default: | ||||||
| 			color = yellowColor | 			color = yellowColor | ||||||
| @@ -297,7 +297,7 @@ func (m *MSTeamsPayload) Release(p *api.ReleasePayload) (api.Payloader, error) { | |||||||
| } | } | ||||||
|  |  | ||||||
| // GetMSTeamsPayload converts a MSTeams webhook into a MSTeamsPayload | // GetMSTeamsPayload converts a MSTeams webhook into a MSTeamsPayload | ||||||
| func GetMSTeamsPayload(p api.Payloader, event webhook_model.HookEventType, meta 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) | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,8 +6,8 @@ package webhook | |||||||
| import ( | import ( | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	webhook_model "code.gitea.io/gitea/models/webhook" |  | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| 	"github.com/stretchr/testify/require" | 	"github.com/stretchr/testify/require" | ||||||
| @@ -277,7 +277,7 @@ func TestMSTeamsPayload(t *testing.T) { | |||||||
| 		p.Action = api.HookIssueReviewed | 		p.Action = api.HookIssueReviewed | ||||||
|  |  | ||||||
| 		d := new(MSTeamsPayload) | 		d := new(MSTeamsPayload) | ||||||
| 		pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved) | 		pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved) | ||||||
| 		require.NoError(t, err) | 		require.NoError(t, err) | ||||||
| 		require.NotNil(t, pl) | 		require.NotNil(t, pl) | ||||||
| 		require.IsType(t, &MSTeamsPayload{}, pl) | 		require.IsType(t, &MSTeamsPayload{}, pl) | ||||||
|   | |||||||
| @@ -13,17 +13,21 @@ import ( | |||||||
| 	repo_model "code.gitea.io/gitea/models/repo" | 	repo_model "code.gitea.io/gitea/models/repo" | ||||||
| 	"code.gitea.io/gitea/models/unit" | 	"code.gitea.io/gitea/models/unit" | ||||||
| 	user_model "code.gitea.io/gitea/models/user" | 	user_model "code.gitea.io/gitea/models/user" | ||||||
| 	"code.gitea.io/gitea/models/webhook" |  | ||||||
| 	"code.gitea.io/gitea/modules/git" | 	"code.gitea.io/gitea/modules/git" | ||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
|  | 	"code.gitea.io/gitea/modules/notification" | ||||||
| 	"code.gitea.io/gitea/modules/notification/base" | 	"code.gitea.io/gitea/modules/notification/base" | ||||||
| 	"code.gitea.io/gitea/modules/repository" | 	"code.gitea.io/gitea/modules/repository" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
| 	"code.gitea.io/gitea/services/convert" | 	"code.gitea.io/gitea/services/convert" | ||||||
| 	webhook_services "code.gitea.io/gitea/services/webhook" |  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | func init() { | ||||||
|  | 	notification.RegisterNotifier(&webhookNotifier{}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| type webhookNotifier struct { | type webhookNotifier struct { | ||||||
| 	base.NullNotifier | 	base.NullNotifier | ||||||
| } | } | ||||||
| @@ -54,7 +58,7 @@ func (m *webhookNotifier) NotifyIssueClearLabels(ctx context.Context, doer *user | |||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventPullRequestLabel, &api.PullRequestPayload{ | 		err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequestLabel, &api.PullRequestPayload{ | ||||||
| 			Action:      api.HookIssueLabelCleared, | 			Action:      api.HookIssueLabelCleared, | ||||||
| 			Index:       issue.Index, | 			Index:       issue.Index, | ||||||
| 			PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), | 			PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), | ||||||
| @@ -62,7 +66,7 @@ func (m *webhookNotifier) NotifyIssueClearLabels(ctx context.Context, doer *user | |||||||
| 			Sender:      convert.ToUser(doer, nil), | 			Sender:      convert.ToUser(doer, nil), | ||||||
| 		}) | 		}) | ||||||
| 	} else { | 	} else { | ||||||
| 		err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventIssueLabel, &api.IssuePayload{ | 		err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventIssueLabel, &api.IssuePayload{ | ||||||
| 			Action:     api.HookIssueLabelCleared, | 			Action:     api.HookIssueLabelCleared, | ||||||
| 			Index:      issue.Index, | 			Index:      issue.Index, | ||||||
| 			Issue:      convert.ToAPIIssue(ctx, issue), | 			Issue:      convert.ToAPIIssue(ctx, issue), | ||||||
| @@ -80,7 +84,7 @@ func (m *webhookNotifier) NotifyForkRepository(ctx context.Context, doer *user_m | |||||||
| 	mode, _ := access_model.AccessLevel(ctx, doer, repo) | 	mode, _ := access_model.AccessLevel(ctx, doer, repo) | ||||||
| 
 | 
 | ||||||
| 	// forked webhook | 	// forked webhook | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: oldRepo}, webhook.HookEventFork, &api.ForkPayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: oldRepo}, webhook_module.HookEventFork, &api.ForkPayload{ | ||||||
| 		Forkee: convert.ToRepo(ctx, oldRepo, oldMode), | 		Forkee: convert.ToRepo(ctx, oldRepo, oldMode), | ||||||
| 		Repo:   convert.ToRepo(ctx, repo, mode), | 		Repo:   convert.ToRepo(ctx, repo, mode), | ||||||
| 		Sender: convert.ToUser(doer, nil), | 		Sender: convert.ToUser(doer, nil), | ||||||
| @@ -92,7 +96,7 @@ func (m *webhookNotifier) NotifyForkRepository(ctx context.Context, doer *user_m | |||||||
| 
 | 
 | ||||||
| 	// Add to hook queue for created repo after session commit. | 	// Add to hook queue for created repo after session commit. | ||||||
| 	if u.IsOrganization() { | 	if u.IsOrganization() { | ||||||
| 		if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventRepository, &api.RepositoryPayload{ | 		if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventRepository, &api.RepositoryPayload{ | ||||||
| 			Action:       api.HookRepoCreated, | 			Action:       api.HookRepoCreated, | ||||||
| 			Repository:   convert.ToRepo(ctx, repo, perm.AccessModeOwner), | 			Repository:   convert.ToRepo(ctx, repo, perm.AccessModeOwner), | ||||||
| 			Organization: convert.ToUser(u, nil), | 			Organization: convert.ToUser(u, nil), | ||||||
| @@ -105,7 +109,7 @@ func (m *webhookNotifier) NotifyForkRepository(ctx context.Context, doer *user_m | |||||||
| 
 | 
 | ||||||
| func (m *webhookNotifier) NotifyCreateRepository(ctx context.Context, doer, u *user_model.User, repo *repo_model.Repository) { | func (m *webhookNotifier) NotifyCreateRepository(ctx context.Context, doer, u *user_model.User, repo *repo_model.Repository) { | ||||||
| 	// Add to hook queue for created repo after session commit. | 	// Add to hook queue for created repo after session commit. | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventRepository, &api.RepositoryPayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventRepository, &api.RepositoryPayload{ | ||||||
| 		Action:       api.HookRepoCreated, | 		Action:       api.HookRepoCreated, | ||||||
| 		Repository:   convert.ToRepo(ctx, repo, perm.AccessModeOwner), | 		Repository:   convert.ToRepo(ctx, repo, perm.AccessModeOwner), | ||||||
| 		Organization: convert.ToUser(u, nil), | 		Organization: convert.ToUser(u, nil), | ||||||
| @@ -116,7 +120,7 @@ func (m *webhookNotifier) NotifyCreateRepository(ctx context.Context, doer, u *u | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (m *webhookNotifier) NotifyDeleteRepository(ctx context.Context, doer *user_model.User, repo *repo_model.Repository) { | func (m *webhookNotifier) NotifyDeleteRepository(ctx context.Context, doer *user_model.User, repo *repo_model.Repository) { | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventRepository, &api.RepositoryPayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventRepository, &api.RepositoryPayload{ | ||||||
| 		Action:       api.HookRepoDeleted, | 		Action:       api.HookRepoDeleted, | ||||||
| 		Repository:   convert.ToRepo(ctx, repo, perm.AccessModeOwner), | 		Repository:   convert.ToRepo(ctx, repo, perm.AccessModeOwner), | ||||||
| 		Organization: convert.ToUser(repo.MustOwner(ctx), nil), | 		Organization: convert.ToUser(repo.MustOwner(ctx), nil), | ||||||
| @@ -128,7 +132,7 @@ func (m *webhookNotifier) NotifyDeleteRepository(ctx context.Context, doer *user | |||||||
| 
 | 
 | ||||||
| func (m *webhookNotifier) NotifyMigrateRepository(ctx context.Context, doer, u *user_model.User, repo *repo_model.Repository) { | func (m *webhookNotifier) NotifyMigrateRepository(ctx context.Context, doer, u *user_model.User, repo *repo_model.Repository) { | ||||||
| 	// Add to hook queue for created repo after session commit. | 	// Add to hook queue for created repo after session commit. | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventRepository, &api.RepositoryPayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventRepository, &api.RepositoryPayload{ | ||||||
| 		Action:       api.HookRepoCreated, | 		Action:       api.HookRepoCreated, | ||||||
| 		Repository:   convert.ToRepo(ctx, repo, perm.AccessModeOwner), | 		Repository:   convert.ToRepo(ctx, repo, perm.AccessModeOwner), | ||||||
| 		Organization: convert.ToUser(u, nil), | 		Organization: convert.ToUser(u, nil), | ||||||
| @@ -159,7 +163,7 @@ func (m *webhookNotifier) NotifyIssueChangeAssignee(ctx context.Context, doer *u | |||||||
| 			apiPullRequest.Action = api.HookIssueAssigned | 			apiPullRequest.Action = api.HookIssueAssigned | ||||||
| 		} | 		} | ||||||
| 		// Assignee comment triggers a webhook | 		// Assignee comment triggers a webhook | ||||||
| 		if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventPullRequestAssign, apiPullRequest); err != nil { | 		if err := PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequestAssign, apiPullRequest); err != nil { | ||||||
| 			log.Error("PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v", issue.IsPull, removed, err) | 			log.Error("PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v", issue.IsPull, removed, err) | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| @@ -177,7 +181,7 @@ func (m *webhookNotifier) NotifyIssueChangeAssignee(ctx context.Context, doer *u | |||||||
| 			apiIssue.Action = api.HookIssueAssigned | 			apiIssue.Action = api.HookIssueAssigned | ||||||
| 		} | 		} | ||||||
| 		// Assignee comment triggers a webhook | 		// Assignee comment triggers a webhook | ||||||
| 		if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventIssueAssign, apiIssue); err != nil { | 		if err := PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventIssueAssign, apiIssue); err != nil { | ||||||
| 			log.Error("PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v", issue.IsPull, removed, err) | 			log.Error("PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v", issue.IsPull, removed, err) | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| @@ -193,7 +197,7 @@ func (m *webhookNotifier) NotifyIssueChangeTitle(ctx context.Context, doer *user | |||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 		issue.PullRequest.Issue = issue | 		issue.PullRequest.Issue = issue | ||||||
| 		err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventPullRequest, &api.PullRequestPayload{ | 		err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequest, &api.PullRequestPayload{ | ||||||
| 			Action: api.HookIssueEdited, | 			Action: api.HookIssueEdited, | ||||||
| 			Index:  issue.Index, | 			Index:  issue.Index, | ||||||
| 			Changes: &api.ChangesPayload{ | 			Changes: &api.ChangesPayload{ | ||||||
| @@ -206,7 +210,7 @@ func (m *webhookNotifier) NotifyIssueChangeTitle(ctx context.Context, doer *user | |||||||
| 			Sender:      convert.ToUser(doer, nil), | 			Sender:      convert.ToUser(doer, nil), | ||||||
| 		}) | 		}) | ||||||
| 	} else { | 	} else { | ||||||
| 		err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventIssues, &api.IssuePayload{ | 		err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventIssues, &api.IssuePayload{ | ||||||
| 			Action: api.HookIssueEdited, | 			Action: api.HookIssueEdited, | ||||||
| 			Index:  issue.Index, | 			Index:  issue.Index, | ||||||
| 			Changes: &api.ChangesPayload{ | 			Changes: &api.ChangesPayload{ | ||||||
| @@ -245,7 +249,7 @@ func (m *webhookNotifier) NotifyIssueChangeStatus(ctx context.Context, doer *use | |||||||
| 		} else { | 		} else { | ||||||
| 			apiPullRequest.Action = api.HookIssueReOpened | 			apiPullRequest.Action = api.HookIssueReOpened | ||||||
| 		} | 		} | ||||||
| 		err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventPullRequest, apiPullRequest) | 		err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequest, apiPullRequest) | ||||||
| 	} else { | 	} else { | ||||||
| 		apiIssue := &api.IssuePayload{ | 		apiIssue := &api.IssuePayload{ | ||||||
| 			Index:      issue.Index, | 			Index:      issue.Index, | ||||||
| @@ -258,7 +262,7 @@ func (m *webhookNotifier) NotifyIssueChangeStatus(ctx context.Context, doer *use | |||||||
| 		} else { | 		} else { | ||||||
| 			apiIssue.Action = api.HookIssueReOpened | 			apiIssue.Action = api.HookIssueReOpened | ||||||
| 		} | 		} | ||||||
| 		err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventIssues, apiIssue) | 		err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventIssues, apiIssue) | ||||||
| 	} | 	} | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Error("PrepareWebhooks [is_pull: %v, is_closed: %v]: %v", issue.IsPull, isClosed, err) | 		log.Error("PrepareWebhooks [is_pull: %v, is_closed: %v]: %v", issue.IsPull, isClosed, err) | ||||||
| @@ -276,7 +280,7 @@ func (m *webhookNotifier) NotifyNewIssue(ctx context.Context, issue *issues_mode | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	mode, _ := access_model.AccessLevel(ctx, issue.Poster, issue.Repo) | 	mode, _ := access_model.AccessLevel(ctx, issue.Poster, issue.Repo) | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventIssues, &api.IssuePayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventIssues, &api.IssuePayload{ | ||||||
| 		Action:     api.HookIssueOpened, | 		Action:     api.HookIssueOpened, | ||||||
| 		Index:      issue.Index, | 		Index:      issue.Index, | ||||||
| 		Issue:      convert.ToAPIIssue(ctx, issue), | 		Issue:      convert.ToAPIIssue(ctx, issue), | ||||||
| @@ -302,7 +306,7 @@ func (m *webhookNotifier) NotifyNewPullRequest(ctx context.Context, pull *issues | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	mode, _ := access_model.AccessLevel(ctx, pull.Issue.Poster, pull.Issue.Repo) | 	mode, _ := access_model.AccessLevel(ctx, pull.Issue.Poster, pull.Issue.Repo) | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: pull.Issue.Repo}, webhook.HookEventPullRequest, &api.PullRequestPayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: pull.Issue.Repo}, webhook_module.HookEventPullRequest, &api.PullRequestPayload{ | ||||||
| 		Action:      api.HookIssueOpened, | 		Action:      api.HookIssueOpened, | ||||||
| 		Index:       pull.Issue.Index, | 		Index:       pull.Issue.Index, | ||||||
| 		PullRequest: convert.ToAPIPullRequest(ctx, pull, nil), | 		PullRequest: convert.ToAPIPullRequest(ctx, pull, nil), | ||||||
| @@ -323,7 +327,7 @@ func (m *webhookNotifier) NotifyIssueChangeContent(ctx context.Context, doer *us | |||||||
| 	var err error | 	var err error | ||||||
| 	if issue.IsPull { | 	if issue.IsPull { | ||||||
| 		issue.PullRequest.Issue = issue | 		issue.PullRequest.Issue = issue | ||||||
| 		err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventPullRequest, &api.PullRequestPayload{ | 		err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequest, &api.PullRequestPayload{ | ||||||
| 			Action: api.HookIssueEdited, | 			Action: api.HookIssueEdited, | ||||||
| 			Index:  issue.Index, | 			Index:  issue.Index, | ||||||
| 			Changes: &api.ChangesPayload{ | 			Changes: &api.ChangesPayload{ | ||||||
| @@ -336,7 +340,7 @@ func (m *webhookNotifier) NotifyIssueChangeContent(ctx context.Context, doer *us | |||||||
| 			Sender:      convert.ToUser(doer, nil), | 			Sender:      convert.ToUser(doer, nil), | ||||||
| 		}) | 		}) | ||||||
| 	} else { | 	} else { | ||||||
| 		err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventIssues, &api.IssuePayload{ | 		err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventIssues, &api.IssuePayload{ | ||||||
| 			Action: api.HookIssueEdited, | 			Action: api.HookIssueEdited, | ||||||
| 			Index:  issue.Index, | 			Index:  issue.Index, | ||||||
| 			Changes: &api.ChangesPayload{ | 			Changes: &api.ChangesPayload{ | ||||||
| @@ -369,15 +373,15 @@ func (m *webhookNotifier) NotifyUpdateComment(ctx context.Context, doer *user_mo | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var eventType webhook.HookEventType | 	var eventType webhook_module.HookEventType | ||||||
| 	if c.Issue.IsPull { | 	if c.Issue.IsPull { | ||||||
| 		eventType = webhook.HookEventPullRequestComment | 		eventType = webhook_module.HookEventPullRequestComment | ||||||
| 	} else { | 	} else { | ||||||
| 		eventType = webhook.HookEventIssueComment | 		eventType = webhook_module.HookEventIssueComment | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	mode, _ := access_model.AccessLevel(ctx, doer, c.Issue.Repo) | 	mode, _ := access_model.AccessLevel(ctx, doer, c.Issue.Repo) | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: c.Issue.Repo}, eventType, &api.IssueCommentPayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: c.Issue.Repo}, eventType, &api.IssueCommentPayload{ | ||||||
| 		Action:  api.HookIssueCommentEdited, | 		Action:  api.HookIssueCommentEdited, | ||||||
| 		Issue:   convert.ToAPIIssue(ctx, c.Issue), | 		Issue:   convert.ToAPIIssue(ctx, c.Issue), | ||||||
| 		Comment: convert.ToComment(c), | 		Comment: convert.ToComment(c), | ||||||
| @@ -397,15 +401,15 @@ func (m *webhookNotifier) NotifyUpdateComment(ctx context.Context, doer *user_mo | |||||||
| func (m *webhookNotifier) NotifyCreateIssueComment(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, | func (m *webhookNotifier) NotifyCreateIssueComment(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, | ||||||
| 	issue *issues_model.Issue, comment *issues_model.Comment, mentions []*user_model.User, | 	issue *issues_model.Issue, comment *issues_model.Comment, mentions []*user_model.User, | ||||||
| ) { | ) { | ||||||
| 	var eventType webhook.HookEventType | 	var eventType webhook_module.HookEventType | ||||||
| 	if issue.IsPull { | 	if issue.IsPull { | ||||||
| 		eventType = webhook.HookEventPullRequestComment | 		eventType = webhook_module.HookEventPullRequestComment | ||||||
| 	} else { | 	} else { | ||||||
| 		eventType = webhook.HookEventIssueComment | 		eventType = webhook_module.HookEventIssueComment | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	mode, _ := access_model.AccessLevel(ctx, doer, repo) | 	mode, _ := access_model.AccessLevel(ctx, doer, repo) | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, eventType, &api.IssueCommentPayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, eventType, &api.IssueCommentPayload{ | ||||||
| 		Action:     api.HookIssueCommentCreated, | 		Action:     api.HookIssueCommentCreated, | ||||||
| 		Issue:      convert.ToAPIIssue(ctx, issue), | 		Issue:      convert.ToAPIIssue(ctx, issue), | ||||||
| 		Comment:    convert.ToComment(comment), | 		Comment:    convert.ToComment(comment), | ||||||
| @@ -434,15 +438,15 @@ func (m *webhookNotifier) NotifyDeleteComment(ctx context.Context, doer *user_mo | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var eventType webhook.HookEventType | 	var eventType webhook_module.HookEventType | ||||||
| 	if comment.Issue.IsPull { | 	if comment.Issue.IsPull { | ||||||
| 		eventType = webhook.HookEventPullRequestComment | 		eventType = webhook_module.HookEventPullRequestComment | ||||||
| 	} else { | 	} else { | ||||||
| 		eventType = webhook.HookEventIssueComment | 		eventType = webhook_module.HookEventIssueComment | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	mode, _ := access_model.AccessLevel(ctx, doer, comment.Issue.Repo) | 	mode, _ := access_model.AccessLevel(ctx, doer, comment.Issue.Repo) | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: comment.Issue.Repo}, eventType, &api.IssueCommentPayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: comment.Issue.Repo}, eventType, &api.IssueCommentPayload{ | ||||||
| 		Action:     api.HookIssueCommentDeleted, | 		Action:     api.HookIssueCommentDeleted, | ||||||
| 		Issue:      convert.ToAPIIssue(ctx, comment.Issue), | 		Issue:      convert.ToAPIIssue(ctx, comment.Issue), | ||||||
| 		Comment:    convert.ToComment(comment), | 		Comment:    convert.ToComment(comment), | ||||||
| @@ -456,7 +460,7 @@ func (m *webhookNotifier) NotifyDeleteComment(ctx context.Context, doer *user_mo | |||||||
| 
 | 
 | ||||||
| func (m *webhookNotifier) NotifyNewWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, page, comment string) { | func (m *webhookNotifier) NotifyNewWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, page, comment string) { | ||||||
| 	// Add to hook queue for created wiki page. | 	// Add to hook queue for created wiki page. | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventWiki, &api.WikiPayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventWiki, &api.WikiPayload{ | ||||||
| 		Action:     api.HookWikiCreated, | 		Action:     api.HookWikiCreated, | ||||||
| 		Repository: convert.ToRepo(ctx, repo, perm.AccessModeOwner), | 		Repository: convert.ToRepo(ctx, repo, perm.AccessModeOwner), | ||||||
| 		Sender:     convert.ToUser(doer, nil), | 		Sender:     convert.ToUser(doer, nil), | ||||||
| @@ -469,7 +473,7 @@ func (m *webhookNotifier) NotifyNewWikiPage(ctx context.Context, doer *user_mode | |||||||
| 
 | 
 | ||||||
| func (m *webhookNotifier) NotifyEditWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, page, comment string) { | func (m *webhookNotifier) NotifyEditWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, page, comment string) { | ||||||
| 	// Add to hook queue for edit wiki page. | 	// Add to hook queue for edit wiki page. | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventWiki, &api.WikiPayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventWiki, &api.WikiPayload{ | ||||||
| 		Action:     api.HookWikiEdited, | 		Action:     api.HookWikiEdited, | ||||||
| 		Repository: convert.ToRepo(ctx, repo, perm.AccessModeOwner), | 		Repository: convert.ToRepo(ctx, repo, perm.AccessModeOwner), | ||||||
| 		Sender:     convert.ToUser(doer, nil), | 		Sender:     convert.ToUser(doer, nil), | ||||||
| @@ -482,7 +486,7 @@ func (m *webhookNotifier) NotifyEditWikiPage(ctx context.Context, doer *user_mod | |||||||
| 
 | 
 | ||||||
| func (m *webhookNotifier) NotifyDeleteWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, page string) { | func (m *webhookNotifier) NotifyDeleteWikiPage(ctx context.Context, doer *user_model.User, repo *repo_model.Repository, page string) { | ||||||
| 	// Add to hook queue for edit wiki page. | 	// Add to hook queue for edit wiki page. | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventWiki, &api.WikiPayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventWiki, &api.WikiPayload{ | ||||||
| 		Action:     api.HookWikiDeleted, | 		Action:     api.HookWikiDeleted, | ||||||
| 		Repository: convert.ToRepo(ctx, repo, perm.AccessModeOwner), | 		Repository: convert.ToRepo(ctx, repo, perm.AccessModeOwner), | ||||||
| 		Sender:     convert.ToUser(doer, nil), | 		Sender:     convert.ToUser(doer, nil), | ||||||
| @@ -517,7 +521,7 @@ func (m *webhookNotifier) NotifyIssueChangeLabels(ctx context.Context, doer *use | |||||||
| 			log.Error("LoadIssue: %v", err) | 			log.Error("LoadIssue: %v", err) | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 		err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventPullRequestLabel, &api.PullRequestPayload{ | 		err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequestLabel, &api.PullRequestPayload{ | ||||||
| 			Action:      api.HookIssueLabelUpdated, | 			Action:      api.HookIssueLabelUpdated, | ||||||
| 			Index:       issue.Index, | 			Index:       issue.Index, | ||||||
| 			PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), | 			PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), | ||||||
| @@ -525,7 +529,7 @@ func (m *webhookNotifier) NotifyIssueChangeLabels(ctx context.Context, doer *use | |||||||
| 			Sender:      convert.ToUser(doer, nil), | 			Sender:      convert.ToUser(doer, nil), | ||||||
| 		}) | 		}) | ||||||
| 	} else { | 	} else { | ||||||
| 		err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventIssueLabel, &api.IssuePayload{ | 		err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventIssueLabel, &api.IssuePayload{ | ||||||
| 			Action:     api.HookIssueLabelUpdated, | 			Action:     api.HookIssueLabelUpdated, | ||||||
| 			Index:      issue.Index, | 			Index:      issue.Index, | ||||||
| 			Issue:      convert.ToAPIIssue(ctx, issue), | 			Issue:      convert.ToAPIIssue(ctx, issue), | ||||||
| @@ -559,7 +563,7 @@ func (m *webhookNotifier) NotifyIssueChangeMilestone(ctx context.Context, doer * | |||||||
| 			log.Error("LoadIssue: %v", err) | 			log.Error("LoadIssue: %v", err) | ||||||
| 			return | 			return | ||||||
| 		} | 		} | ||||||
| 		err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventPullRequestMilestone, &api.PullRequestPayload{ | 		err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequestMilestone, &api.PullRequestPayload{ | ||||||
| 			Action:      hookAction, | 			Action:      hookAction, | ||||||
| 			Index:       issue.Index, | 			Index:       issue.Index, | ||||||
| 			PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), | 			PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil), | ||||||
| @@ -567,7 +571,7 @@ func (m *webhookNotifier) NotifyIssueChangeMilestone(ctx context.Context, doer * | |||||||
| 			Sender:      convert.ToUser(doer, nil), | 			Sender:      convert.ToUser(doer, nil), | ||||||
| 		}) | 		}) | ||||||
| 	} else { | 	} else { | ||||||
| 		err = webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventIssueMilestone, &api.IssuePayload{ | 		err = PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventIssueMilestone, &api.IssuePayload{ | ||||||
| 			Action:     hookAction, | 			Action:     hookAction, | ||||||
| 			Index:      issue.Index, | 			Index:      issue.Index, | ||||||
| 			Issue:      convert.ToAPIIssue(ctx, issue), | 			Issue:      convert.ToAPIIssue(ctx, issue), | ||||||
| @@ -588,7 +592,7 @@ func (m *webhookNotifier) NotifyPushCommits(ctx context.Context, pusher *user_mo | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventPush, &api.PushPayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventPush, &api.PushPayload{ | ||||||
| 		Ref:          opts.RefFullName, | 		Ref:          opts.RefFullName, | ||||||
| 		Before:       opts.OldCommitID, | 		Before:       opts.OldCommitID, | ||||||
| 		After:        opts.NewCommitID, | 		After:        opts.NewCommitID, | ||||||
| @@ -641,7 +645,7 @@ func (*webhookNotifier) NotifyMergePullRequest(ctx context.Context, doer *user_m | |||||||
| 		Action:      api.HookIssueClosed, | 		Action:      api.HookIssueClosed, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: pr.Issue.Repo}, webhook.HookEventPullRequest, apiPullRequest); err != nil { | 	if err := PrepareWebhooks(ctx, EventSource{Repository: pr.Issue.Repo}, webhook_module.HookEventPullRequest, apiPullRequest); err != nil { | ||||||
| 		log.Error("PrepareWebhooks: %v", err) | 		log.Error("PrepareWebhooks: %v", err) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @@ -655,7 +659,7 @@ func (m *webhookNotifier) NotifyPullRequestChangeTargetBranch(ctx context.Contex | |||||||
| 	issue := pr.Issue | 	issue := pr.Issue | ||||||
| 
 | 
 | ||||||
| 	mode, _ := access_model.AccessLevel(ctx, issue.Poster, issue.Repo) | 	mode, _ := access_model.AccessLevel(ctx, issue.Poster, issue.Repo) | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: issue.Repo}, webhook.HookEventPullRequest, &api.PullRequestPayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequest, &api.PullRequestPayload{ | ||||||
| 		Action: api.HookIssueEdited, | 		Action: api.HookIssueEdited, | ||||||
| 		Index:  issue.Index, | 		Index:  issue.Index, | ||||||
| 		Changes: &api.ChangesPayload{ | 		Changes: &api.ChangesPayload{ | ||||||
| @@ -672,15 +676,15 @@ func (m *webhookNotifier) NotifyPullRequestChangeTargetBranch(ctx context.Contex | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (m *webhookNotifier) NotifyPullRequestReview(ctx context.Context, pr *issues_model.PullRequest, review *issues_model.Review, comment *issues_model.Comment, mentions []*user_model.User) { | func (m *webhookNotifier) NotifyPullRequestReview(ctx context.Context, pr *issues_model.PullRequest, review *issues_model.Review, comment *issues_model.Comment, mentions []*user_model.User) { | ||||||
| 	var reviewHookType webhook.HookEventType | 	var reviewHookType webhook_module.HookEventType | ||||||
| 
 | 
 | ||||||
| 	switch review.Type { | 	switch review.Type { | ||||||
| 	case issues_model.ReviewTypeApprove: | 	case issues_model.ReviewTypeApprove: | ||||||
| 		reviewHookType = webhook.HookEventPullRequestReviewApproved | 		reviewHookType = webhook_module.HookEventPullRequestReviewApproved | ||||||
| 	case issues_model.ReviewTypeComment: | 	case issues_model.ReviewTypeComment: | ||||||
| 		reviewHookType = webhook.HookEventPullRequestComment | 		reviewHookType = webhook_module.HookEventPullRequestComment | ||||||
| 	case issues_model.ReviewTypeReject: | 	case issues_model.ReviewTypeReject: | ||||||
| 		reviewHookType = webhook.HookEventPullRequestReviewRejected | 		reviewHookType = webhook_module.HookEventPullRequestReviewRejected | ||||||
| 	default: | 	default: | ||||||
| 		// unsupported review webhook type here | 		// unsupported review webhook type here | ||||||
| 		log.Error("Unsupported review webhook type") | 		log.Error("Unsupported review webhook type") | ||||||
| @@ -697,7 +701,7 @@ func (m *webhookNotifier) NotifyPullRequestReview(ctx context.Context, pr *issue | |||||||
| 		log.Error("models.AccessLevel: %v", err) | 		log.Error("models.AccessLevel: %v", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: review.Issue.Repo}, reviewHookType, &api.PullRequestPayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: review.Issue.Repo}, reviewHookType, &api.PullRequestPayload{ | ||||||
| 		Action:      api.HookIssueReviewed, | 		Action:      api.HookIssueReviewed, | ||||||
| 		Index:       review.Issue.Index, | 		Index:       review.Issue.Index, | ||||||
| 		PullRequest: convert.ToAPIPullRequest(ctx, pr, nil), | 		PullRequest: convert.ToAPIPullRequest(ctx, pr, nil), | ||||||
| @@ -717,7 +721,7 @@ func (m *webhookNotifier) NotifyCreateRef(ctx context.Context, pusher *user_mode | |||||||
| 	apiRepo := convert.ToRepo(ctx, repo, perm.AccessModeNone) | 	apiRepo := convert.ToRepo(ctx, repo, perm.AccessModeNone) | ||||||
| 	refName := git.RefEndName(refFullName) | 	refName := git.RefEndName(refFullName) | ||||||
| 
 | 
 | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventCreate, &api.CreatePayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventCreate, &api.CreatePayload{ | ||||||
| 		Ref:     refName, | 		Ref:     refName, | ||||||
| 		Sha:     refID, | 		Sha:     refID, | ||||||
| 		RefType: refType, | 		RefType: refType, | ||||||
| @@ -738,7 +742,7 @@ func (m *webhookNotifier) NotifyPullRequestSynchronized(ctx context.Context, doe | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: pr.Issue.Repo}, webhook.HookEventPullRequestSync, &api.PullRequestPayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: pr.Issue.Repo}, webhook_module.HookEventPullRequestSync, &api.PullRequestPayload{ | ||||||
| 		Action:      api.HookIssueSynchronized, | 		Action:      api.HookIssueSynchronized, | ||||||
| 		Index:       pr.Issue.Index, | 		Index:       pr.Issue.Index, | ||||||
| 		PullRequest: convert.ToAPIPullRequest(ctx, pr, nil), | 		PullRequest: convert.ToAPIPullRequest(ctx, pr, nil), | ||||||
| @@ -754,7 +758,7 @@ func (m *webhookNotifier) NotifyDeleteRef(ctx context.Context, pusher *user_mode | |||||||
| 	apiRepo := convert.ToRepo(ctx, repo, perm.AccessModeNone) | 	apiRepo := convert.ToRepo(ctx, repo, perm.AccessModeNone) | ||||||
| 	refName := git.RefEndName(refFullName) | 	refName := git.RefEndName(refFullName) | ||||||
| 
 | 
 | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventDelete, &api.DeletePayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventDelete, &api.DeletePayload{ | ||||||
| 		Ref:        refName, | 		Ref:        refName, | ||||||
| 		RefType:    refType, | 		RefType:    refType, | ||||||
| 		PusherType: api.PusherTypeUser, | 		PusherType: api.PusherTypeUser, | ||||||
| @@ -772,7 +776,7 @@ func sendReleaseHook(ctx context.Context, doer *user_model.User, rel *repo_model | |||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	mode, _ := access_model.AccessLevel(ctx, doer, rel.Repo) | 	mode, _ := access_model.AccessLevel(ctx, doer, rel.Repo) | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: rel.Repo}, webhook.HookEventRelease, &api.ReleasePayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: rel.Repo}, webhook_module.HookEventRelease, &api.ReleasePayload{ | ||||||
| 		Action:     action, | 		Action:     action, | ||||||
| 		Release:    convert.ToRelease(rel), | 		Release:    convert.ToRelease(rel), | ||||||
| 		Repository: convert.ToRepo(ctx, rel.Repo, mode), | 		Repository: convert.ToRepo(ctx, rel.Repo, mode), | ||||||
| @@ -802,7 +806,7 @@ func (m *webhookNotifier) NotifySyncPushCommits(ctx context.Context, pusher *use | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, webhook_services.EventSource{Repository: repo}, webhook.HookEventPush, &api.PushPayload{ | 	if err := PrepareWebhooks(ctx, EventSource{Repository: repo}, webhook_module.HookEventPush, &api.PushPayload{ | ||||||
| 		Ref:          opts.RefFullName, | 		Ref:          opts.RefFullName, | ||||||
| 		Before:       opts.OldCommitID, | 		Before:       opts.OldCommitID, | ||||||
| 		After:        opts.NewCommitID, | 		After:        opts.NewCommitID, | ||||||
| @@ -835,7 +839,7 @@ func (m *webhookNotifier) NotifyPackageDelete(ctx context.Context, doer *user_mo | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func notifyPackage(ctx context.Context, sender *user_model.User, pd *packages_model.PackageDescriptor, action api.HookPackageAction) { | func notifyPackage(ctx context.Context, sender *user_model.User, pd *packages_model.PackageDescriptor, action api.HookPackageAction) { | ||||||
| 	source := webhook_services.EventSource{ | 	source := EventSource{ | ||||||
| 		Repository: pd.Repository, | 		Repository: pd.Repository, | ||||||
| 		Owner:      pd.Owner, | 		Owner:      pd.Owner, | ||||||
| 	} | 	} | ||||||
| @@ -846,7 +850,7 @@ func notifyPackage(ctx context.Context, sender *user_model.User, pd *packages_mo | |||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err := webhook_services.PrepareWebhooks(ctx, source, webhook.HookEventPackage, &api.PackagePayload{ | 	if err := PrepareWebhooks(ctx, source, webhook_module.HookEventPackage, &api.PackagePayload{ | ||||||
| 		Action:  action, | 		Action:  action, | ||||||
| 		Package: apiPackage, | 		Package: apiPackage, | ||||||
| 		Sender:  convert.ToUser(sender, nil), | 		Sender:  convert.ToUser(sender, nil), | ||||||
| @@ -10,6 +10,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/json" | 	"code.gitea.io/gitea/modules/json" | ||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type ( | type ( | ||||||
| @@ -20,7 +21,7 @@ type ( | |||||||
| 		} `json:"repository"` | 		} `json:"repository"` | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// PackagistMeta contains the meta data for the webhook | 	// PackagistMeta contains the metadata for the webhook | ||||||
| 	PackagistMeta struct { | 	PackagistMeta struct { | ||||||
| 		Username   string `json:"username"` | 		Username   string `json:"username"` | ||||||
| 		APIToken   string `json:"api_token"` | 		APIToken   string `json:"api_token"` | ||||||
| @@ -49,62 +50,62 @@ func (f *PackagistPayload) JSONPayload() ([]byte, error) { | |||||||
| var _ PayloadConvertor = &PackagistPayload{} | var _ PayloadConvertor = &PackagistPayload{} | ||||||
|  |  | ||||||
| // Create implements PayloadConvertor Create method | // Create implements PayloadConvertor Create method | ||||||
| func (f *PackagistPayload) Create(p *api.CreatePayload) (api.Payloader, error) { | func (f *PackagistPayload) Create(_ *api.CreatePayload) (api.Payloader, error) { | ||||||
| 	return nil, nil | 	return nil, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // Delete implements PayloadConvertor Delete method | // Delete implements PayloadConvertor Delete method | ||||||
| func (f *PackagistPayload) Delete(p *api.DeletePayload) (api.Payloader, error) { | func (f *PackagistPayload) Delete(_ *api.DeletePayload) (api.Payloader, error) { | ||||||
| 	return nil, nil | 	return nil, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // Fork implements PayloadConvertor Fork method | // Fork implements PayloadConvertor Fork method | ||||||
| func (f *PackagistPayload) Fork(p *api.ForkPayload) (api.Payloader, error) { | func (f *PackagistPayload) Fork(_ *api.ForkPayload) (api.Payloader, error) { | ||||||
| 	return nil, nil | 	return nil, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // Push implements PayloadConvertor Push method | // Push implements PayloadConvertor Push method | ||||||
| func (f *PackagistPayload) Push(p *api.PushPayload) (api.Payloader, error) { | func (f *PackagistPayload) Push(_ *api.PushPayload) (api.Payloader, error) { | ||||||
| 	return f, nil | 	return f, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // Issue implements PayloadConvertor Issue method | // Issue implements PayloadConvertor Issue method | ||||||
| func (f *PackagistPayload) Issue(p *api.IssuePayload) (api.Payloader, error) { | func (f *PackagistPayload) Issue(_ *api.IssuePayload) (api.Payloader, error) { | ||||||
| 	return nil, nil | 	return nil, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // IssueComment implements PayloadConvertor IssueComment method | // IssueComment implements PayloadConvertor IssueComment method | ||||||
| func (f *PackagistPayload) IssueComment(p *api.IssueCommentPayload) (api.Payloader, error) { | func (f *PackagistPayload) IssueComment(_ *api.IssueCommentPayload) (api.Payloader, error) { | ||||||
| 	return nil, nil | 	return nil, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // PullRequest implements PayloadConvertor PullRequest method | // PullRequest implements PayloadConvertor PullRequest method | ||||||
| func (f *PackagistPayload) PullRequest(p *api.PullRequestPayload) (api.Payloader, error) { | func (f *PackagistPayload) PullRequest(_ *api.PullRequestPayload) (api.Payloader, error) { | ||||||
| 	return nil, nil | 	return nil, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // Review implements PayloadConvertor Review method | // Review implements PayloadConvertor Review method | ||||||
| func (f *PackagistPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) { | func (f *PackagistPayload) Review(_ *api.PullRequestPayload, _ webhook_module.HookEventType) (api.Payloader, error) { | ||||||
| 	return nil, nil | 	return nil, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // Repository implements PayloadConvertor Repository method | // Repository implements PayloadConvertor Repository method | ||||||
| func (f *PackagistPayload) Repository(p *api.RepositoryPayload) (api.Payloader, error) { | func (f *PackagistPayload) Repository(_ *api.RepositoryPayload) (api.Payloader, error) { | ||||||
| 	return nil, nil | 	return nil, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // Wiki implements PayloadConvertor Wiki method | // Wiki implements PayloadConvertor Wiki method | ||||||
| func (f *PackagistPayload) Wiki(p *api.WikiPayload) (api.Payloader, error) { | func (f *PackagistPayload) Wiki(_ *api.WikiPayload) (api.Payloader, error) { | ||||||
| 	return nil, nil | 	return nil, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // Release implements PayloadConvertor Release method | // Release implements PayloadConvertor Release method | ||||||
| func (f *PackagistPayload) Release(p *api.ReleasePayload) (api.Payloader, error) { | func (f *PackagistPayload) Release(_ *api.ReleasePayload) (api.Payloader, error) { | ||||||
| 	return nil, nil | 	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_model.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) | ||||||
|  |  | ||||||
| 	packagist := &PackagistMeta{} | 	packagist := &PackagistMeta{} | ||||||
|   | |||||||
| @@ -6,8 +6,8 @@ package webhook | |||||||
| import ( | import ( | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	webhook_model "code.gitea.io/gitea/models/webhook" |  | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| 	"github.com/stretchr/testify/require" | 	"github.com/stretchr/testify/require" | ||||||
| @@ -101,7 +101,7 @@ func TestPackagistPayload(t *testing.T) { | |||||||
| 		p.Action = api.HookIssueReviewed | 		p.Action = api.HookIssueReviewed | ||||||
|  |  | ||||||
| 		d := new(PackagistPayload) | 		d := new(PackagistPayload) | ||||||
| 		pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved) | 		pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved) | ||||||
| 		require.NoError(t, err) | 		require.NoError(t, err) | ||||||
| 		require.Nil(t, pl) | 		require.Nil(t, pl) | ||||||
| 	}) | 	}) | ||||||
|   | |||||||
| @@ -4,8 +4,8 @@ | |||||||
| package webhook | package webhook | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	webhook_model "code.gitea.io/gitea/models/webhook" |  | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // PayloadConvertor defines the interface to convert system webhook payload to external payload | // PayloadConvertor defines the interface to convert system webhook payload to external payload | ||||||
| @@ -18,40 +18,40 @@ type PayloadConvertor interface { | |||||||
| 	IssueComment(*api.IssueCommentPayload) (api.Payloader, error) | 	IssueComment(*api.IssueCommentPayload) (api.Payloader, error) | ||||||
| 	Push(*api.PushPayload) (api.Payloader, error) | 	Push(*api.PushPayload) (api.Payloader, error) | ||||||
| 	PullRequest(*api.PullRequestPayload) (api.Payloader, error) | 	PullRequest(*api.PullRequestPayload) (api.Payloader, error) | ||||||
| 	Review(*api.PullRequestPayload, webhook_model.HookEventType) (api.Payloader, error) | 	Review(*api.PullRequestPayload, webhook_module.HookEventType) (api.Payloader, error) | ||||||
| 	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) | ||||||
| } | } | ||||||
|  |  | ||||||
| func convertPayloader(s PayloadConvertor, p api.Payloader, event webhook_model.HookEventType) (api.Payloader, error) { | func convertPayloader(s PayloadConvertor, p api.Payloader, event webhook_module.HookEventType) (api.Payloader, error) { | ||||||
| 	switch event { | 	switch event { | ||||||
| 	case webhook_model.HookEventCreate: | 	case webhook_module.HookEventCreate: | ||||||
| 		return s.Create(p.(*api.CreatePayload)) | 		return s.Create(p.(*api.CreatePayload)) | ||||||
| 	case webhook_model.HookEventDelete: | 	case webhook_module.HookEventDelete: | ||||||
| 		return s.Delete(p.(*api.DeletePayload)) | 		return s.Delete(p.(*api.DeletePayload)) | ||||||
| 	case webhook_model.HookEventFork: | 	case webhook_module.HookEventFork: | ||||||
| 		return s.Fork(p.(*api.ForkPayload)) | 		return s.Fork(p.(*api.ForkPayload)) | ||||||
| 	case webhook_model.HookEventIssues, webhook_model.HookEventIssueAssign, webhook_model.HookEventIssueLabel, webhook_model.HookEventIssueMilestone: | 	case webhook_module.HookEventIssues, webhook_module.HookEventIssueAssign, webhook_module.HookEventIssueLabel, webhook_module.HookEventIssueMilestone: | ||||||
| 		return s.Issue(p.(*api.IssuePayload)) | 		return s.Issue(p.(*api.IssuePayload)) | ||||||
| 	case webhook_model.HookEventIssueComment, webhook_model.HookEventPullRequestComment: | 	case webhook_module.HookEventIssueComment, webhook_module.HookEventPullRequestComment: | ||||||
| 		pl, ok := p.(*api.IssueCommentPayload) | 		pl, ok := p.(*api.IssueCommentPayload) | ||||||
| 		if ok { | 		if ok { | ||||||
| 			return s.IssueComment(pl) | 			return s.IssueComment(pl) | ||||||
| 		} | 		} | ||||||
| 		return s.PullRequest(p.(*api.PullRequestPayload)) | 		return s.PullRequest(p.(*api.PullRequestPayload)) | ||||||
| 	case webhook_model.HookEventPush: | 	case webhook_module.HookEventPush: | ||||||
| 		return s.Push(p.(*api.PushPayload)) | 		return s.Push(p.(*api.PushPayload)) | ||||||
| 	case webhook_model.HookEventPullRequest, webhook_model.HookEventPullRequestAssign, webhook_model.HookEventPullRequestLabel, | 	case webhook_module.HookEventPullRequest, webhook_module.HookEventPullRequestAssign, webhook_module.HookEventPullRequestLabel, | ||||||
| 		webhook_model.HookEventPullRequestMilestone, webhook_model.HookEventPullRequestSync: | 		webhook_module.HookEventPullRequestMilestone, webhook_module.HookEventPullRequestSync: | ||||||
| 		return s.PullRequest(p.(*api.PullRequestPayload)) | 		return s.PullRequest(p.(*api.PullRequestPayload)) | ||||||
| 	case webhook_model.HookEventPullRequestReviewApproved, webhook_model.HookEventPullRequestReviewRejected, webhook_model.HookEventPullRequestReviewComment: | 	case webhook_module.HookEventPullRequestReviewApproved, webhook_module.HookEventPullRequestReviewRejected, webhook_module.HookEventPullRequestReviewComment: | ||||||
| 		return s.Review(p.(*api.PullRequestPayload), event) | 		return s.Review(p.(*api.PullRequestPayload), event) | ||||||
| 	case webhook_model.HookEventRepository: | 	case webhook_module.HookEventRepository: | ||||||
| 		return s.Repository(p.(*api.RepositoryPayload)) | 		return s.Repository(p.(*api.RepositoryPayload)) | ||||||
| 	case webhook_model.HookEventRelease: | 	case webhook_module.HookEventRelease: | ||||||
| 		return s.Release(p.(*api.ReleasePayload)) | 		return s.Release(p.(*api.ReleasePayload)) | ||||||
| 	case webhook_model.HookEventWiki: | 	case webhook_module.HookEventWiki: | ||||||
| 		return s.Wiki(p.(*api.WikiPayload)) | 		return s.Wiki(p.(*api.WikiPayload)) | ||||||
| 	} | 	} | ||||||
| 	return s, nil | 	return s, nil | ||||||
|   | |||||||
| @@ -15,6 +15,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // SlackMeta contains the slack metadata | // SlackMeta contains the slack metadata | ||||||
| @@ -231,7 +232,7 @@ func (s *SlackPayload) PullRequest(p *api.PullRequestPayload) (api.Payloader, er | |||||||
| } | } | ||||||
|  |  | ||||||
| // Review implements PayloadConvertor Review method | // Review implements PayloadConvertor Review method | ||||||
| func (s *SlackPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) { | func (s *SlackPayload) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (api.Payloader, error) { | ||||||
| 	senderLink := SlackLinkFormatter(setting.AppURL+p.Sender.UserName, p.Sender.UserName) | 	senderLink := SlackLinkFormatter(setting.AppURL+p.Sender.UserName, p.Sender.UserName) | ||||||
| 	title := fmt.Sprintf("#%d %s", p.Index, p.PullRequest.Title) | 	title := fmt.Sprintf("#%d %s", p.Index, p.PullRequest.Title) | ||||||
| 	titleLink := fmt.Sprintf("%s/pulls/%d", p.Repository.HTMLURL, p.Index) | 	titleLink := fmt.Sprintf("%s/pulls/%d", p.Repository.HTMLURL, p.Index) | ||||||
| @@ -278,7 +279,7 @@ func (s *SlackPayload) createPayload(text string, attachments []SlackAttachment) | |||||||
| } | } | ||||||
|  |  | ||||||
| // GetSlackPayload converts a slack webhook into a SlackPayload | // GetSlackPayload converts a slack webhook into a SlackPayload | ||||||
| func GetSlackPayload(p api.Payloader, event webhook_model.HookEventType, meta string) (api.Payloader, error) { | func GetSlackPayload(p api.Payloader, event webhook_module.HookEventType, meta string) (api.Payloader, error) { | ||||||
| 	s := new(SlackPayload) | 	s := new(SlackPayload) | ||||||
|  |  | ||||||
| 	slack := &SlackMeta{} | 	slack := &SlackMeta{} | ||||||
|   | |||||||
| @@ -6,8 +6,8 @@ package webhook | |||||||
| import ( | import ( | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	webhook_model "code.gitea.io/gitea/models/webhook" |  | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| 	"github.com/stretchr/testify/require" | 	"github.com/stretchr/testify/require" | ||||||
| @@ -124,7 +124,7 @@ func TestSlackPayload(t *testing.T) { | |||||||
| 		p.Action = api.HookIssueReviewed | 		p.Action = api.HookIssueReviewed | ||||||
|  |  | ||||||
| 		d := new(SlackPayload) | 		d := new(SlackPayload) | ||||||
| 		pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved) | 		pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved) | ||||||
| 		require.NoError(t, err) | 		require.NoError(t, err) | ||||||
| 		require.NotNil(t, pl) | 		require.NotNil(t, pl) | ||||||
| 		require.IsType(t, &SlackPayload{}, pl) | 		require.IsType(t, &SlackPayload{}, pl) | ||||||
|   | |||||||
| @@ -13,6 +13,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/log" | 	"code.gitea.io/gitea/modules/log" | ||||||
| 	"code.gitea.io/gitea/modules/markup" | 	"code.gitea.io/gitea/modules/markup" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type ( | type ( | ||||||
| @@ -140,7 +141,7 @@ func (t *TelegramPayload) PullRequest(p *api.PullRequestPayload) (api.Payloader, | |||||||
| } | } | ||||||
|  |  | ||||||
| // Review implements PayloadConvertor Review method | // Review implements PayloadConvertor Review method | ||||||
| func (t *TelegramPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) { | func (t *TelegramPayload) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (api.Payloader, error) { | ||||||
| 	var text, attachmentText string | 	var text, attachmentText string | ||||||
| 	switch p.Action { | 	switch p.Action { | ||||||
| 	case api.HookIssueReviewed: | 	case api.HookIssueReviewed: | ||||||
| @@ -185,7 +186,7 @@ func (t *TelegramPayload) Release(p *api.ReleasePayload) (api.Payloader, error) | |||||||
| } | } | ||||||
|  |  | ||||||
| // GetTelegramPayload converts a telegram webhook into a TelegramPayload | // GetTelegramPayload converts a telegram webhook into a TelegramPayload | ||||||
| func GetTelegramPayload(p api.Payloader, event webhook_model.HookEventType, meta 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) | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,8 +6,8 @@ package webhook | |||||||
| import ( | import ( | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	webhook_model "code.gitea.io/gitea/models/webhook" |  | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| 	"github.com/stretchr/testify/require" | 	"github.com/stretchr/testify/require" | ||||||
| @@ -124,7 +124,7 @@ func TestTelegramPayload(t *testing.T) { | |||||||
| 		p.Action = api.HookIssueReviewed | 		p.Action = api.HookIssueReviewed | ||||||
|  |  | ||||||
| 		d := new(TelegramPayload) | 		d := new(TelegramPayload) | ||||||
| 		pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved) | 		pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved) | ||||||
| 		require.NoError(t, err) | 		require.NoError(t, err) | ||||||
| 		require.NotNil(t, pl) | 		require.NotNil(t, pl) | ||||||
| 		require.IsType(t, &TelegramPayload{}, pl) | 		require.IsType(t, &TelegramPayload{}, pl) | ||||||
|   | |||||||
| @@ -18,62 +18,58 @@ import ( | |||||||
| 	"code.gitea.io/gitea/modules/setting" | 	"code.gitea.io/gitea/modules/setting" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
| 	"code.gitea.io/gitea/modules/util" | 	"code.gitea.io/gitea/modules/util" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
| 	"github.com/gobwas/glob" | 	"github.com/gobwas/glob" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type webhook struct { | type webhook struct { | ||||||
| 	name           webhook_model.HookType | 	name           webhook_module.HookType | ||||||
| 	payloadCreator func(p api.Payloader, event webhook_model.HookEventType, meta string) (api.Payloader, error) | 	payloadCreator func(p api.Payloader, event webhook_module.HookEventType, meta string) (api.Payloader, error) | ||||||
| } | } | ||||||
|  |  | ||||||
| var webhooks = map[webhook_model.HookType]*webhook{ | var webhooks = map[webhook_module.HookType]*webhook{ | ||||||
| 	webhook_model.SLACK: { | 	webhook_module.SLACK: { | ||||||
| 		name:           webhook_model.SLACK, | 		name:           webhook_module.SLACK, | ||||||
| 		payloadCreator: GetSlackPayload, | 		payloadCreator: GetSlackPayload, | ||||||
| 	}, | 	}, | ||||||
| 	webhook_model.DISCORD: { | 	webhook_module.DISCORD: { | ||||||
| 		name:           webhook_model.DISCORD, | 		name:           webhook_module.DISCORD, | ||||||
| 		payloadCreator: GetDiscordPayload, | 		payloadCreator: GetDiscordPayload, | ||||||
| 	}, | 	}, | ||||||
| 	webhook_model.DINGTALK: { | 	webhook_module.DINGTALK: { | ||||||
| 		name:           webhook_model.DINGTALK, | 		name:           webhook_module.DINGTALK, | ||||||
| 		payloadCreator: GetDingtalkPayload, | 		payloadCreator: GetDingtalkPayload, | ||||||
| 	}, | 	}, | ||||||
| 	webhook_model.TELEGRAM: { | 	webhook_module.TELEGRAM: { | ||||||
| 		name:           webhook_model.TELEGRAM, | 		name:           webhook_module.TELEGRAM, | ||||||
| 		payloadCreator: GetTelegramPayload, | 		payloadCreator: GetTelegramPayload, | ||||||
| 	}, | 	}, | ||||||
| 	webhook_model.MSTEAMS: { | 	webhook_module.MSTEAMS: { | ||||||
| 		name:           webhook_model.MSTEAMS, | 		name:           webhook_module.MSTEAMS, | ||||||
| 		payloadCreator: GetMSTeamsPayload, | 		payloadCreator: GetMSTeamsPayload, | ||||||
| 	}, | 	}, | ||||||
| 	webhook_model.FEISHU: { | 	webhook_module.FEISHU: { | ||||||
| 		name:           webhook_model.FEISHU, | 		name:           webhook_module.FEISHU, | ||||||
| 		payloadCreator: GetFeishuPayload, | 		payloadCreator: GetFeishuPayload, | ||||||
| 	}, | 	}, | ||||||
| 	webhook_model.MATRIX: { | 	webhook_module.MATRIX: { | ||||||
| 		name:           webhook_model.MATRIX, | 		name:           webhook_module.MATRIX, | ||||||
| 		payloadCreator: GetMatrixPayload, | 		payloadCreator: GetMatrixPayload, | ||||||
| 	}, | 	}, | ||||||
| 	webhook_model.WECHATWORK: { | 	webhook_module.WECHATWORK: { | ||||||
| 		name:           webhook_model.WECHATWORK, | 		name:           webhook_module.WECHATWORK, | ||||||
| 		payloadCreator: GetWechatworkPayload, | 		payloadCreator: GetWechatworkPayload, | ||||||
| 	}, | 	}, | ||||||
| 	webhook_model.PACKAGIST: { | 	webhook_module.PACKAGIST: { | ||||||
| 		name:           webhook_model.PACKAGIST, | 		name:           webhook_module.PACKAGIST, | ||||||
| 		payloadCreator: GetPackagistPayload, | 		payloadCreator: GetPackagistPayload, | ||||||
| 	}, | 	}, | ||||||
| } | } | ||||||
|  |  | ||||||
| // RegisterWebhook registers a webhook |  | ||||||
| func RegisterWebhook(name string, webhook *webhook) { |  | ||||||
| 	webhooks[name] = webhook |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // IsValidHookTaskType returns true if a webhook registered | // IsValidHookTaskType returns true if a webhook registered | ||||||
| func IsValidHookTaskType(name string) bool { | func IsValidHookTaskType(name string) bool { | ||||||
| 	if name == webhook_model.GITEA || name == webhook_model.GOGS { | 	if name == webhook_module.GITEA || name == webhook_module.GOGS { | ||||||
| 		return true | 		return true | ||||||
| 	} | 	} | ||||||
| 	_, ok := webhooks[name] | 	_, ok := webhooks[name] | ||||||
| @@ -157,7 +153,7 @@ func checkBranch(w *webhook_model.Webhook, branch string) bool { | |||||||
| } | } | ||||||
|  |  | ||||||
| // PrepareWebhook creates a hook task and enqueues it for processing | // PrepareWebhook creates a hook task and enqueues it for processing | ||||||
| func PrepareWebhook(ctx context.Context, w *webhook_model.Webhook, event webhook_model.HookEventType, p api.Payloader) error { | func PrepareWebhook(ctx context.Context, w *webhook_model.Webhook, event webhook_module.HookEventType, p api.Payloader) error { | ||||||
| 	// Skip sending if webhooks are disabled. | 	// Skip sending if webhooks are disabled. | ||||||
| 	if setting.DisableWebhooks { | 	if setting.DisableWebhooks { | ||||||
| 		return nil | 		return nil | ||||||
| @@ -176,7 +172,7 @@ func PrepareWebhook(ctx context.Context, w *webhook_model.Webhook, event webhook | |||||||
| 	// Avoid sending "0 new commits" to non-integration relevant webhooks (e.g. slack, discord, etc.). | 	// Avoid sending "0 new commits" to non-integration relevant webhooks (e.g. slack, discord, etc.). | ||||||
| 	// Integration webhooks (e.g. drone) still receive the required data. | 	// Integration webhooks (e.g. drone) still receive the required data. | ||||||
| 	if pushEvent, ok := p.(*api.PushPayload); ok && | 	if pushEvent, ok := p.(*api.PushPayload); ok && | ||||||
| 		w.Type != webhook_model.GITEA && w.Type != webhook_model.GOGS && | 		w.Type != webhook_module.GITEA && w.Type != webhook_module.GOGS && | ||||||
| 		len(pushEvent.Commits) == 0 { | 		len(pushEvent.Commits) == 0 { | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| @@ -215,7 +211,7 @@ func PrepareWebhook(ctx context.Context, w *webhook_model.Webhook, event webhook | |||||||
| } | } | ||||||
|  |  | ||||||
| // PrepareWebhooks adds new webhooks to task queue for given payload. | // PrepareWebhooks adds new webhooks to task queue for given payload. | ||||||
| func PrepareWebhooks(ctx context.Context, source EventSource, event webhook_model.HookEventType, p api.Payloader) error { | func PrepareWebhooks(ctx context.Context, source EventSource, event webhook_module.HookEventType, p api.Payloader) error { | ||||||
| 	owner := source.Owner | 	owner := source.Owner | ||||||
|  |  | ||||||
| 	var ws []*webhook_model.Webhook | 	var ws []*webhook_model.Webhook | ||||||
|   | |||||||
| @@ -11,6 +11,7 @@ import ( | |||||||
| 	"code.gitea.io/gitea/models/unittest" | 	"code.gitea.io/gitea/models/unittest" | ||||||
| 	webhook_model "code.gitea.io/gitea/models/webhook" | 	webhook_model "code.gitea.io/gitea/models/webhook" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
|  |  | ||||||
| 	"github.com/stretchr/testify/assert" | 	"github.com/stretchr/testify/assert" | ||||||
| ) | ) | ||||||
| @@ -32,12 +33,12 @@ func TestPrepareWebhooks(t *testing.T) { | |||||||
|  |  | ||||||
| 	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) | 	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) | ||||||
| 	hookTasks := []*webhook_model.HookTask{ | 	hookTasks := []*webhook_model.HookTask{ | ||||||
| 		{HookID: 1, EventType: webhook_model.HookEventPush}, | 		{HookID: 1, EventType: webhook_module.HookEventPush}, | ||||||
| 	} | 	} | ||||||
| 	for _, hookTask := range hookTasks { | 	for _, hookTask := range hookTasks { | ||||||
| 		unittest.AssertNotExistsBean(t, hookTask) | 		unittest.AssertNotExistsBean(t, hookTask) | ||||||
| 	} | 	} | ||||||
| 	assert.NoError(t, PrepareWebhooks(db.DefaultContext, EventSource{Repository: repo}, webhook_model.HookEventPush, &api.PushPayload{Commits: []*api.PayloadCommit{{}}})) | 	assert.NoError(t, PrepareWebhooks(db.DefaultContext, EventSource{Repository: repo}, webhook_module.HookEventPush, &api.PushPayload{Commits: []*api.PayloadCommit{{}}})) | ||||||
| 	for _, hookTask := range hookTasks { | 	for _, hookTask := range hookTasks { | ||||||
| 		unittest.AssertExistsAndLoadBean(t, hookTask) | 		unittest.AssertExistsAndLoadBean(t, hookTask) | ||||||
| 	} | 	} | ||||||
| @@ -48,13 +49,13 @@ func TestPrepareWebhooksBranchFilterMatch(t *testing.T) { | |||||||
|  |  | ||||||
| 	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}) | 	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}) | ||||||
| 	hookTasks := []*webhook_model.HookTask{ | 	hookTasks := []*webhook_model.HookTask{ | ||||||
| 		{HookID: 4, EventType: webhook_model.HookEventPush}, | 		{HookID: 4, EventType: webhook_module.HookEventPush}, | ||||||
| 	} | 	} | ||||||
| 	for _, hookTask := range hookTasks { | 	for _, hookTask := range hookTasks { | ||||||
| 		unittest.AssertNotExistsBean(t, hookTask) | 		unittest.AssertNotExistsBean(t, hookTask) | ||||||
| 	} | 	} | ||||||
| 	// this test also ensures that * doesn't handle / in any special way (like shell would) | 	// this test also ensures that * doesn't handle / in any special way (like shell would) | ||||||
| 	assert.NoError(t, PrepareWebhooks(db.DefaultContext, EventSource{Repository: repo}, webhook_model.HookEventPush, &api.PushPayload{Ref: "refs/heads/feature/7791", Commits: []*api.PayloadCommit{{}}})) | 	assert.NoError(t, PrepareWebhooks(db.DefaultContext, EventSource{Repository: repo}, webhook_module.HookEventPush, &api.PushPayload{Ref: "refs/heads/feature/7791", Commits: []*api.PayloadCommit{{}}})) | ||||||
| 	for _, hookTask := range hookTasks { | 	for _, hookTask := range hookTasks { | ||||||
| 		unittest.AssertExistsAndLoadBean(t, hookTask) | 		unittest.AssertExistsAndLoadBean(t, hookTask) | ||||||
| 	} | 	} | ||||||
| @@ -65,12 +66,12 @@ func TestPrepareWebhooksBranchFilterNoMatch(t *testing.T) { | |||||||
|  |  | ||||||
| 	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}) | 	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2}) | ||||||
| 	hookTasks := []*webhook_model.HookTask{ | 	hookTasks := []*webhook_model.HookTask{ | ||||||
| 		{HookID: 4, EventType: webhook_model.HookEventPush}, | 		{HookID: 4, EventType: webhook_module.HookEventPush}, | ||||||
| 	} | 	} | ||||||
| 	for _, hookTask := range hookTasks { | 	for _, hookTask := range hookTasks { | ||||||
| 		unittest.AssertNotExistsBean(t, hookTask) | 		unittest.AssertNotExistsBean(t, hookTask) | ||||||
| 	} | 	} | ||||||
| 	assert.NoError(t, PrepareWebhooks(db.DefaultContext, EventSource{Repository: repo}, webhook_model.HookEventPush, &api.PushPayload{Ref: "refs/heads/fix_weird_bug"})) | 	assert.NoError(t, PrepareWebhooks(db.DefaultContext, EventSource{Repository: repo}, webhook_module.HookEventPush, &api.PushPayload{Ref: "refs/heads/fix_weird_bug"})) | ||||||
|  |  | ||||||
| 	for _, hookTask := range hookTasks { | 	for _, hookTask := range hookTasks { | ||||||
| 		unittest.AssertNotExistsBean(t, hookTask) | 		unittest.AssertNotExistsBean(t, hookTask) | ||||||
|   | |||||||
| @@ -7,10 +7,10 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| 	webhook_model "code.gitea.io/gitea/models/webhook" |  | ||||||
| 	"code.gitea.io/gitea/modules/git" | 	"code.gitea.io/gitea/modules/git" | ||||||
| 	"code.gitea.io/gitea/modules/json" | 	"code.gitea.io/gitea/modules/json" | ||||||
| 	api "code.gitea.io/gitea/modules/structs" | 	api "code.gitea.io/gitea/modules/structs" | ||||||
|  | 	webhook_module "code.gitea.io/gitea/modules/webhook" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type ( | type ( | ||||||
| @@ -135,7 +135,7 @@ func (f *WechatworkPayload) PullRequest(p *api.PullRequestPayload) (api.Payloade | |||||||
| } | } | ||||||
|  |  | ||||||
| // Review implements PayloadConvertor Review method | // Review implements PayloadConvertor Review method | ||||||
| func (f *WechatworkPayload) Review(p *api.PullRequestPayload, event webhook_model.HookEventType) (api.Payloader, error) { | func (f *WechatworkPayload) Review(p *api.PullRequestPayload, event webhook_module.HookEventType) (api.Payloader, error) { | ||||||
| 	var text, title string | 	var text, title string | ||||||
| 	switch p.Action { | 	switch p.Action { | ||||||
| 	case api.HookIssueReviewed: | 	case api.HookIssueReviewed: | ||||||
| @@ -180,6 +180,6 @@ func (f *WechatworkPayload) Release(p *api.ReleasePayload) (api.Payloader, error | |||||||
| } | } | ||||||
|  |  | ||||||
| // 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_model.HookEventType, meta 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) | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user