mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08: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 (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	"code.gitea.io/gitea/modules/json"
 | 
			
		||||
	"code.gitea.io/gitea/modules/secret"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
@@ -57,7 +56,7 @@ func AddHeaderAuthorizationEncryptedColWebhook(x *xorm.Engine) error {
 | 
			
		||||
	// Add the column to the table
 | 
			
		||||
	type Webhook struct {
 | 
			
		||||
		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
 | 
			
		||||
 | 
			
		||||
		// HeaderAuthorizationEncrypted should be accessed using HeaderAuthorization() and SetHeaderAuthorization()
 | 
			
		||||
 
 | 
			
		||||
@@ -7,10 +7,10 @@ import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/migrations/base"
 | 
			
		||||
	"code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	"code.gitea.io/gitea/modules/json"
 | 
			
		||||
	"code.gitea.io/gitea/modules/secret"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
@@ -19,7 +19,7 @@ func Test_AddHeaderAuthorizationEncryptedColWebhook(t *testing.T) {
 | 
			
		||||
	// Create Webhook table
 | 
			
		||||
	type Webhook struct {
 | 
			
		||||
		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
 | 
			
		||||
 | 
			
		||||
		// HeaderAuthorizationEncrypted should be accessed using HeaderAuthorization() and SetHeaderAuthorization()
 | 
			
		||||
 
 | 
			
		||||
@@ -12,6 +12,7 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
 | 
			
		||||
	gouuid "github.com/google/uuid"
 | 
			
		||||
)
 | 
			
		||||
@@ -107,7 +108,7 @@ type HookTask struct {
 | 
			
		||||
	UUID            string `xorm:"unique"`
 | 
			
		||||
	api.Payloader   `xorm:"-"`
 | 
			
		||||
	PayloadContent  string `xorm:"LONGTEXT"`
 | 
			
		||||
	EventType       HookEventType
 | 
			
		||||
	EventType       webhook_module.HookEventType
 | 
			
		||||
	IsDelivered     bool
 | 
			
		||||
	Delivered       int64
 | 
			
		||||
	DeliveredString string `xorm:"-"`
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	"code.gitea.io/gitea/modules/timeutil"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
 | 
			
		||||
	"xorm.io/builder"
 | 
			
		||||
)
 | 
			
		||||
@@ -46,7 +47,7 @@ type ErrHookTaskNotExist struct {
 | 
			
		||||
	UUID   string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsErrWebhookNotExist checks if an error is a ErrWebhookNotExist.
 | 
			
		||||
// IsErrHookTaskNotExist checks if an error is a ErrHookTaskNotExist.
 | 
			
		||||
func IsErrHookTaskNotExist(err error) bool {
 | 
			
		||||
	_, ok := err.(ErrHookTaskNotExist)
 | 
			
		||||
	return ok
 | 
			
		||||
@@ -117,68 +118,6 @@ func IsValidHookContentType(name string) bool {
 | 
			
		||||
	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.
 | 
			
		||||
type Webhook struct {
 | 
			
		||||
	ID                        int64 `xorm:"pk autoincr"`
 | 
			
		||||
@@ -190,11 +129,11 @@ type Webhook struct {
 | 
			
		||||
	ContentType               HookContentType
 | 
			
		||||
	Secret                    string `xorm:"TEXT"`
 | 
			
		||||
	Events                    string `xorm:"TEXT"`
 | 
			
		||||
	*HookEvent      `xorm:"-"`
 | 
			
		||||
	*webhook_module.HookEvent `xorm:"-"`
 | 
			
		||||
	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
 | 
			
		||||
	LastStatus      HookStatus // Last delivery status
 | 
			
		||||
	LastStatus                webhook_module.HookStatus // Last delivery status
 | 
			
		||||
 | 
			
		||||
	// HeaderAuthorizationEncrypted should be accessed using HeaderAuthorization() and SetHeaderAuthorization()
 | 
			
		||||
	HeaderAuthorizationEncrypted string `xorm:"TEXT"`
 | 
			
		||||
@@ -209,7 +148,7 @@ func init() {
 | 
			
		||||
 | 
			
		||||
// AfterLoad updates the webhook object upon setting a column
 | 
			
		||||
func (w *Webhook) AfterLoad() {
 | 
			
		||||
	w.HookEvent = &HookEvent{}
 | 
			
		||||
	w.HookEvent = &webhook_module.HookEvent{}
 | 
			
		||||
	if err := json.Unmarshal([]byte(w.Events), w.HookEvent); err != nil {
 | 
			
		||||
		log.Error("Unmarshal[%d]: %v", w.ID, err)
 | 
			
		||||
	}
 | 
			
		||||
@@ -362,34 +301,34 @@ func (w *Webhook) HasPackageEvent() bool {
 | 
			
		||||
// EventCheckers returns event checkers
 | 
			
		||||
func (w *Webhook) EventCheckers() []struct {
 | 
			
		||||
	Has  func() bool
 | 
			
		||||
	Type HookEventType
 | 
			
		||||
	Type webhook_module.HookEventType
 | 
			
		||||
} {
 | 
			
		||||
	return []struct {
 | 
			
		||||
		Has  func() bool
 | 
			
		||||
		Type HookEventType
 | 
			
		||||
		Type webhook_module.HookEventType
 | 
			
		||||
	}{
 | 
			
		||||
		{w.HasCreateEvent, HookEventCreate},
 | 
			
		||||
		{w.HasDeleteEvent, HookEventDelete},
 | 
			
		||||
		{w.HasForkEvent, HookEventFork},
 | 
			
		||||
		{w.HasPushEvent, HookEventPush},
 | 
			
		||||
		{w.HasIssuesEvent, HookEventIssues},
 | 
			
		||||
		{w.HasIssuesAssignEvent, HookEventIssueAssign},
 | 
			
		||||
		{w.HasIssuesLabelEvent, HookEventIssueLabel},
 | 
			
		||||
		{w.HasIssuesMilestoneEvent, HookEventIssueMilestone},
 | 
			
		||||
		{w.HasIssueCommentEvent, HookEventIssueComment},
 | 
			
		||||
		{w.HasPullRequestEvent, HookEventPullRequest},
 | 
			
		||||
		{w.HasPullRequestAssignEvent, HookEventPullRequestAssign},
 | 
			
		||||
		{w.HasPullRequestLabelEvent, HookEventPullRequestLabel},
 | 
			
		||||
		{w.HasPullRequestMilestoneEvent, HookEventPullRequestMilestone},
 | 
			
		||||
		{w.HasPullRequestCommentEvent, HookEventPullRequestComment},
 | 
			
		||||
		{w.HasPullRequestApprovedEvent, HookEventPullRequestReviewApproved},
 | 
			
		||||
		{w.HasPullRequestRejectedEvent, HookEventPullRequestReviewRejected},
 | 
			
		||||
		{w.HasPullRequestCommentEvent, HookEventPullRequestReviewComment},
 | 
			
		||||
		{w.HasPullRequestSyncEvent, HookEventPullRequestSync},
 | 
			
		||||
		{w.HasWikiEvent, HookEventWiki},
 | 
			
		||||
		{w.HasRepositoryEvent, HookEventRepository},
 | 
			
		||||
		{w.HasReleaseEvent, HookEventRelease},
 | 
			
		||||
		{w.HasPackageEvent, HookEventPackage},
 | 
			
		||||
		{w.HasCreateEvent, webhook_module.HookEventCreate},
 | 
			
		||||
		{w.HasDeleteEvent, webhook_module.HookEventDelete},
 | 
			
		||||
		{w.HasForkEvent, webhook_module.HookEventFork},
 | 
			
		||||
		{w.HasPushEvent, webhook_module.HookEventPush},
 | 
			
		||||
		{w.HasIssuesEvent, webhook_module.HookEventIssues},
 | 
			
		||||
		{w.HasIssuesAssignEvent, webhook_module.HookEventIssueAssign},
 | 
			
		||||
		{w.HasIssuesLabelEvent, webhook_module.HookEventIssueLabel},
 | 
			
		||||
		{w.HasIssuesMilestoneEvent, webhook_module.HookEventIssueMilestone},
 | 
			
		||||
		{w.HasIssueCommentEvent, webhook_module.HookEventIssueComment},
 | 
			
		||||
		{w.HasPullRequestEvent, webhook_module.HookEventPullRequest},
 | 
			
		||||
		{w.HasPullRequestAssignEvent, webhook_module.HookEventPullRequestAssign},
 | 
			
		||||
		{w.HasPullRequestLabelEvent, webhook_module.HookEventPullRequestLabel},
 | 
			
		||||
		{w.HasPullRequestMilestoneEvent, webhook_module.HookEventPullRequestMilestone},
 | 
			
		||||
		{w.HasPullRequestCommentEvent, webhook_module.HookEventPullRequestComment},
 | 
			
		||||
		{w.HasPullRequestApprovedEvent, webhook_module.HookEventPullRequestReviewApproved},
 | 
			
		||||
		{w.HasPullRequestRejectedEvent, webhook_module.HookEventPullRequestReviewRejected},
 | 
			
		||||
		{w.HasPullRequestCommentEvent, webhook_module.HookEventPullRequestReviewComment},
 | 
			
		||||
		{w.HasPullRequestSyncEvent, webhook_module.HookEventPullRequestSync},
 | 
			
		||||
		{w.HasWikiEvent, webhook_module.HookEventWiki},
 | 
			
		||||
		{w.HasRepositoryEvent, webhook_module.HookEventRepository},
 | 
			
		||||
		{w.HasReleaseEvent, webhook_module.HookEventRelease},
 | 
			
		||||
		{w.HasPackageEvent, webhook_module.HookEventPackage},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -453,7 +392,7 @@ func getWebhook(bean *Webhook) (*Webhook, error) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	} else if !has {
 | 
			
		||||
		return nil, ErrWebhookNotExist{bean.ID}
 | 
			
		||||
		return nil, ErrWebhookNotExist{ID: bean.ID}
 | 
			
		||||
	}
 | 
			
		||||
	return bean, nil
 | 
			
		||||
}
 | 
			
		||||
@@ -541,7 +480,7 @@ func GetSystemOrDefaultWebhook(id int64) (*Webhook, error) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	} else if !has {
 | 
			
		||||
		return nil, ErrWebhookNotExist{id}
 | 
			
		||||
		return nil, ErrWebhookNotExist{ID: id}
 | 
			
		||||
	}
 | 
			
		||||
	return webhook, nil
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/json"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
@@ -46,11 +47,11 @@ func TestWebhook_History(t *testing.T) {
 | 
			
		||||
func TestWebhook_UpdateEvent(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
	webhook := unittest.AssertExistsAndLoadBean(t, &Webhook{ID: 1})
 | 
			
		||||
	hookEvent := &HookEvent{
 | 
			
		||||
	hookEvent := &webhook_module.HookEvent{
 | 
			
		||||
		PushOnly:       true,
 | 
			
		||||
		SendEverything: false,
 | 
			
		||||
		ChooseEvents:   false,
 | 
			
		||||
		HookEvents: HookEvents{
 | 
			
		||||
		HookEvents: webhook_module.HookEvents{
 | 
			
		||||
			Create:      false,
 | 
			
		||||
			Push:        true,
 | 
			
		||||
			PullRequest: false,
 | 
			
		||||
@@ -59,7 +60,7 @@ func TestWebhook_UpdateEvent(t *testing.T) {
 | 
			
		||||
	webhook.HookEvent = hookEvent
 | 
			
		||||
	assert.NoError(t, webhook.UpdateEvent())
 | 
			
		||||
	assert.NotEmpty(t, webhook.Events)
 | 
			
		||||
	actualHookEvent := &HookEvent{}
 | 
			
		||||
	actualHookEvent := &webhook_module.HookEvent{}
 | 
			
		||||
	assert.NoError(t, json.Unmarshal([]byte(webhook.Events), actualHookEvent))
 | 
			
		||||
	assert.Equal(t, *hookEvent, *actualHookEvent)
 | 
			
		||||
}
 | 
			
		||||
@@ -74,13 +75,13 @@ func TestWebhook_EventsArray(t *testing.T) {
 | 
			
		||||
		"package",
 | 
			
		||||
	},
 | 
			
		||||
		(&Webhook{
 | 
			
		||||
			HookEvent: &HookEvent{SendEverything: true},
 | 
			
		||||
			HookEvent: &webhook_module.HookEvent{SendEverything: true},
 | 
			
		||||
		}).EventsArray(),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	assert.Equal(t, []string{"push"},
 | 
			
		||||
		(&Webhook{
 | 
			
		||||
			HookEvent: &HookEvent{PushOnly: true},
 | 
			
		||||
			HookEvent: &webhook_module.HookEvent{PushOnly: true},
 | 
			
		||||
		}).EventsArray(),
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -16,7 +16,6 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/notification/mail"
 | 
			
		||||
	"code.gitea.io/gitea/modules/notification/mirror"
 | 
			
		||||
	"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/setting"
 | 
			
		||||
)
 | 
			
		||||
@@ -36,7 +35,6 @@ func NewContext() {
 | 
			
		||||
		RegisterNotifier(mail.NewNotifier())
 | 
			
		||||
	}
 | 
			
		||||
	RegisterNotifier(indexer.NewNotifier())
 | 
			
		||||
	RegisterNotifier(webhook.NewNotifier())
 | 
			
		||||
	RegisterNotifier(action.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 (
 | 
			
		||||
	"net/http"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	webhook_model "code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	"code.gitea.io/gitea/modules/context"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	"code.gitea.io/gitea/modules/web"
 | 
			
		||||
	"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
 | 
			
		||||
@@ -39,18 +39,18 @@ func ListHooks(ctx *context.APIContext) {
 | 
			
		||||
	//   "200":
 | 
			
		||||
	//     "$ref": "#/responses/HookList"
 | 
			
		||||
 | 
			
		||||
	opts := &webhook.ListWebhookOptions{
 | 
			
		||||
	opts := &webhook_model.ListWebhookOptions{
 | 
			
		||||
		ListOptions: utils.GetListOptions(ctx),
 | 
			
		||||
		OrgID:       ctx.Org.Organization.ID,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	count, err := webhook.CountWebhooksByOpts(opts)
 | 
			
		||||
	count, err := webhook_model.CountWebhooksByOpts(opts)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.InternalServerError(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	orgHooks, err := webhook.ListWebhooksByOpts(ctx, opts)
 | 
			
		||||
	orgHooks, err := webhook_model.ListWebhooksByOpts(ctx, opts)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.InternalServerError(err)
 | 
			
		||||
		return
 | 
			
		||||
@@ -58,7 +58,7 @@ func ListHooks(ctx *context.APIContext) {
 | 
			
		||||
 | 
			
		||||
	hooks := make([]*api.Hook, len(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 {
 | 
			
		||||
			ctx.InternalServerError(err)
 | 
			
		||||
			return
 | 
			
		||||
@@ -99,7 +99,7 @@ func GetHook(ctx *context.APIContext) {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	apiHook, err := convert.ToHook(org.AsUser().HomeLink(), hook)
 | 
			
		||||
	apiHook, err := webhook_service.ToHook(org.AsUser().HomeLink(), hook)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.InternalServerError(err)
 | 
			
		||||
		return
 | 
			
		||||
@@ -200,8 +200,8 @@ func DeleteHook(ctx *context.APIContext) {
 | 
			
		||||
 | 
			
		||||
	org := ctx.Org.Organization
 | 
			
		||||
	hookID := ctx.ParamsInt64(":id")
 | 
			
		||||
	if err := webhook.DeleteWebhookByOrgID(org.ID, hookID); err != nil {
 | 
			
		||||
		if webhook.IsErrWebhookNotExist(err) {
 | 
			
		||||
	if err := webhook_model.DeleteWebhookByOrgID(org.ID, hookID); err != nil {
 | 
			
		||||
		if webhook_model.IsErrWebhookNotExist(err) {
 | 
			
		||||
			ctx.NotFound()
 | 
			
		||||
		} else {
 | 
			
		||||
			ctx.Error(http.StatusInternalServerError, "DeleteWebhookByOrgID", err)
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	"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/services/convert"
 | 
			
		||||
	webhook_service "code.gitea.io/gitea/services/webhook"
 | 
			
		||||
@@ -68,7 +69,7 @@ func ListHooks(ctx *context.APIContext) {
 | 
			
		||||
 | 
			
		||||
	apiHooks := make([]*api.Hook, len(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 {
 | 
			
		||||
			ctx.InternalServerError(err)
 | 
			
		||||
			return
 | 
			
		||||
@@ -115,7 +116,7 @@ func GetHook(ctx *context.APIContext) {
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	apiHook, err := convert.ToHook(repo.RepoLink, hook)
 | 
			
		||||
	apiHook, err := webhook_service.ToHook(repo.RepoLink, hook)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.InternalServerError(err)
 | 
			
		||||
		return
 | 
			
		||||
@@ -176,7 +177,7 @@ func TestHook(ctx *context.APIContext) {
 | 
			
		||||
	commit := convert.ToPayloadCommit(ctx.Repo.Repository, ctx.Repo.Commit)
 | 
			
		||||
 | 
			
		||||
	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,
 | 
			
		||||
		Before:       commitID,
 | 
			
		||||
		After:        commitID,
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/json"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	"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"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -98,7 +98,7 @@ func AddRepoHook(ctx *context.APIContext, form *api.CreateHookOption) {
 | 
			
		||||
// toAPIHook converts the hook to its API representation.
 | 
			
		||||
// 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) {
 | 
			
		||||
	apiHook, err := convert.ToHook(repoLink, hook)
 | 
			
		||||
	apiHook, err := webhook_service.ToHook(repoLink, hook)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		ctx.Error(http.StatusInternalServerError, "ToHook", err)
 | 
			
		||||
		return nil, false
 | 
			
		||||
@@ -127,9 +127,9 @@ func addHook(ctx *context.APIContext, form *api.CreateHookOption, orgID, repoID
 | 
			
		||||
		ContentType: webhook.ToHookContentType(form.Config["content_type"]),
 | 
			
		||||
		Secret:      form.Config["secret"],
 | 
			
		||||
		HTTPMethod:  "POST",
 | 
			
		||||
		HookEvent: &webhook.HookEvent{
 | 
			
		||||
		HookEvent: &webhook_module.HookEvent{
 | 
			
		||||
			ChooseEvents: true,
 | 
			
		||||
			HookEvents: webhook.HookEvents{
 | 
			
		||||
			HookEvents: webhook_module.HookEvents{
 | 
			
		||||
				Create:               util.IsStringInSlice(string(webhook.HookEventCreate), form.Events, true),
 | 
			
		||||
				Delete:               util.IsStringInSlice(string(webhook.HookEventDelete), 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)
 | 
			
		||||
		return nil, false
 | 
			
		||||
	}
 | 
			
		||||
	if w.Type == webhook.SLACK {
 | 
			
		||||
	if w.Type == webhook_module.SLACK {
 | 
			
		||||
		channel, ok := form.Config["channel"]
 | 
			
		||||
		if !ok {
 | 
			
		||||
			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)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if w.Type == webhook.SLACK {
 | 
			
		||||
		if w.Type == webhook_module.SLACK {
 | 
			
		||||
			if channel, ok := form.Config["channel"]; ok {
 | 
			
		||||
				meta, err := json.Marshal(&webhook_service.SlackMeta{
 | 
			
		||||
					Channel:  channel,
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,7 @@ import (
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
	"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/forms"
 | 
			
		||||
	webhook_service "code.gitea.io/gitea/services/webhook"
 | 
			
		||||
@@ -119,7 +120,7 @@ func checkHookType(ctx *context.Context) string {
 | 
			
		||||
// WebhooksNew render creating webhook page
 | 
			
		||||
func WebhooksNew(ctx *context.Context) {
 | 
			
		||||
	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)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -154,12 +155,12 @@ func WebhooksNew(ctx *context.Context) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ParseHookEvent convert web form content to webhook.HookEvent
 | 
			
		||||
func ParseHookEvent(form forms.WebhookForm) *webhook.HookEvent {
 | 
			
		||||
	return &webhook.HookEvent{
 | 
			
		||||
func ParseHookEvent(form forms.WebhookForm) *webhook_module.HookEvent {
 | 
			
		||||
	return &webhook_module.HookEvent{
 | 
			
		||||
		PushOnly:       form.PushOnly(),
 | 
			
		||||
		SendEverything: form.SendEverything(),
 | 
			
		||||
		ChooseEvents:   form.ChooseEvents(),
 | 
			
		||||
		HookEvents: webhook.HookEvents{
 | 
			
		||||
		HookEvents: webhook_module.HookEvents{
 | 
			
		||||
			Create:               form.Create,
 | 
			
		||||
			Delete:               form.Delete,
 | 
			
		||||
			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["PageIsSettingsHooks"] = 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
 | 
			
		||||
 | 
			
		||||
	orCtx, err := getOrgRepoCtx(ctx)
 | 
			
		||||
@@ -326,7 +327,7 @@ func giteaHookParams(ctx *context.Context) webhookParams {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return webhookParams{
 | 
			
		||||
		Type:        webhook.GITEA,
 | 
			
		||||
		Type:        webhook_module.GITEA,
 | 
			
		||||
		URL:         form.PayloadURL,
 | 
			
		||||
		ContentType: contentType,
 | 
			
		||||
		Secret:      form.Secret,
 | 
			
		||||
@@ -354,7 +355,7 @@ func gogsHookParams(ctx *context.Context) webhookParams {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return webhookParams{
 | 
			
		||||
		Type:        webhook.GOGS,
 | 
			
		||||
		Type:        webhook_module.GOGS,
 | 
			
		||||
		URL:         form.PayloadURL,
 | 
			
		||||
		ContentType: contentType,
 | 
			
		||||
		Secret:      form.Secret,
 | 
			
		||||
@@ -376,7 +377,7 @@ func discordHookParams(ctx *context.Context) webhookParams {
 | 
			
		||||
	form := web.GetForm(ctx).(*forms.NewDiscordHookForm)
 | 
			
		||||
 | 
			
		||||
	return webhookParams{
 | 
			
		||||
		Type:        webhook.DISCORD,
 | 
			
		||||
		Type:        webhook_module.DISCORD,
 | 
			
		||||
		URL:         form.PayloadURL,
 | 
			
		||||
		ContentType: webhook.ContentTypeJSON,
 | 
			
		||||
		WebhookForm: form.WebhookForm,
 | 
			
		||||
@@ -401,7 +402,7 @@ func dingtalkHookParams(ctx *context.Context) webhookParams {
 | 
			
		||||
	form := web.GetForm(ctx).(*forms.NewDingtalkHookForm)
 | 
			
		||||
 | 
			
		||||
	return webhookParams{
 | 
			
		||||
		Type:        webhook.DINGTALK,
 | 
			
		||||
		Type:        webhook_module.DINGTALK,
 | 
			
		||||
		URL:         form.PayloadURL,
 | 
			
		||||
		ContentType: webhook.ContentTypeJSON,
 | 
			
		||||
		WebhookForm: form.WebhookForm,
 | 
			
		||||
@@ -422,7 +423,7 @@ func telegramHookParams(ctx *context.Context) webhookParams {
 | 
			
		||||
	form := web.GetForm(ctx).(*forms.NewTelegramHookForm)
 | 
			
		||||
 | 
			
		||||
	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)),
 | 
			
		||||
		ContentType: webhook.ContentTypeJSON,
 | 
			
		||||
		WebhookForm: form.WebhookForm,
 | 
			
		||||
@@ -447,7 +448,7 @@ func matrixHookParams(ctx *context.Context) webhookParams {
 | 
			
		||||
	form := web.GetForm(ctx).(*forms.NewMatrixHookForm)
 | 
			
		||||
 | 
			
		||||
	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)),
 | 
			
		||||
		ContentType: webhook.ContentTypeJSON,
 | 
			
		||||
		HTTPMethod:  http.MethodPut,
 | 
			
		||||
@@ -474,7 +475,7 @@ func mSTeamsHookParams(ctx *context.Context) webhookParams {
 | 
			
		||||
	form := web.GetForm(ctx).(*forms.NewMSTeamsHookForm)
 | 
			
		||||
 | 
			
		||||
	return webhookParams{
 | 
			
		||||
		Type:        webhook.MSTEAMS,
 | 
			
		||||
		Type:        webhook_module.MSTEAMS,
 | 
			
		||||
		URL:         form.PayloadURL,
 | 
			
		||||
		ContentType: webhook.ContentTypeJSON,
 | 
			
		||||
		WebhookForm: form.WebhookForm,
 | 
			
		||||
@@ -495,7 +496,7 @@ func slackHookParams(ctx *context.Context) webhookParams {
 | 
			
		||||
	form := web.GetForm(ctx).(*forms.NewSlackHookForm)
 | 
			
		||||
 | 
			
		||||
	return webhookParams{
 | 
			
		||||
		Type:        webhook.SLACK,
 | 
			
		||||
		Type:        webhook_module.SLACK,
 | 
			
		||||
		URL:         form.PayloadURL,
 | 
			
		||||
		ContentType: webhook.ContentTypeJSON,
 | 
			
		||||
		WebhookForm: form.WebhookForm,
 | 
			
		||||
@@ -522,7 +523,7 @@ func feishuHookParams(ctx *context.Context) webhookParams {
 | 
			
		||||
	form := web.GetForm(ctx).(*forms.NewFeishuHookForm)
 | 
			
		||||
 | 
			
		||||
	return webhookParams{
 | 
			
		||||
		Type:        webhook.FEISHU,
 | 
			
		||||
		Type:        webhook_module.FEISHU,
 | 
			
		||||
		URL:         form.PayloadURL,
 | 
			
		||||
		ContentType: webhook.ContentTypeJSON,
 | 
			
		||||
		WebhookForm: form.WebhookForm,
 | 
			
		||||
@@ -543,7 +544,7 @@ func wechatworkHookParams(ctx *context.Context) webhookParams {
 | 
			
		||||
	form := web.GetForm(ctx).(*forms.NewWechatWorkHookForm)
 | 
			
		||||
 | 
			
		||||
	return webhookParams{
 | 
			
		||||
		Type:        webhook.WECHATWORK,
 | 
			
		||||
		Type:        webhook_module.WECHATWORK,
 | 
			
		||||
		URL:         form.PayloadURL,
 | 
			
		||||
		ContentType: webhook.ContentTypeJSON,
 | 
			
		||||
		WebhookForm: form.WebhookForm,
 | 
			
		||||
@@ -564,7 +565,7 @@ func packagistHookParams(ctx *context.Context) webhookParams {
 | 
			
		||||
	form := web.GetForm(ctx).(*forms.NewPackagistHookForm)
 | 
			
		||||
 | 
			
		||||
	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)),
 | 
			
		||||
		ContentType: webhook.ContentTypeJSON,
 | 
			
		||||
		WebhookForm: form.WebhookForm,
 | 
			
		||||
@@ -603,15 +604,15 @@ func checkWebhook(ctx *context.Context) (*orgRepoCtx, *webhook.Webhook) {
 | 
			
		||||
 | 
			
		||||
	ctx.Data["HookType"] = w.Type
 | 
			
		||||
	switch w.Type {
 | 
			
		||||
	case webhook.SLACK:
 | 
			
		||||
	case webhook_module.SLACK:
 | 
			
		||||
		ctx.Data["SlackHook"] = webhook_service.GetSlackHook(w)
 | 
			
		||||
	case webhook.DISCORD:
 | 
			
		||||
	case webhook_module.DISCORD:
 | 
			
		||||
		ctx.Data["DiscordHook"] = webhook_service.GetDiscordHook(w)
 | 
			
		||||
	case webhook.TELEGRAM:
 | 
			
		||||
	case webhook_module.TELEGRAM:
 | 
			
		||||
		ctx.Data["TelegramHook"] = webhook_service.GetTelegramHook(w)
 | 
			
		||||
	case webhook.MATRIX:
 | 
			
		||||
	case webhook_module.MATRIX:
 | 
			
		||||
		ctx.Data["MatrixHook"] = webhook_service.GetMatrixHook(w)
 | 
			
		||||
	case webhook.PACKAGIST:
 | 
			
		||||
	case webhook_module.PACKAGIST:
 | 
			
		||||
		ctx.Data["PackagistHook"] = webhook_service.GetPackagistHook(w)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -688,7 +689,7 @@ func TestWebhook(ctx *context.Context) {
 | 
			
		||||
		Pusher:       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.Status(http.StatusInternalServerError)
 | 
			
		||||
	} else {
 | 
			
		||||
 
 | 
			
		||||
@@ -22,13 +22,11 @@ import (
 | 
			
		||||
	repo_model "code.gitea.io/gitea/models/repo"
 | 
			
		||||
	"code.gitea.io/gitea/models/unit"
 | 
			
		||||
	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/log"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
	"code.gitea.io/gitea/services/gitdiff"
 | 
			
		||||
	webhook_service "code.gitea.io/gitea/services/webhook"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
func ToGitHook(h *git.Hook) *api.GitHook {
 | 
			
		||||
	return &api.GitHook{
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/proxy"
 | 
			
		||||
	"code.gitea.io/gitea/modules/queue"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
 | 
			
		||||
	"github.com/gobwas/glob"
 | 
			
		||||
)
 | 
			
		||||
@@ -89,7 +90,7 @@ func Deliver(ctx context.Context, t *webhook_model.HookTask) error {
 | 
			
		||||
		}
 | 
			
		||||
	case http.MethodPut:
 | 
			
		||||
		switch w.Type {
 | 
			
		||||
		case webhook_model.MATRIX:
 | 
			
		||||
		case webhook_module.MATRIX:
 | 
			
		||||
			txnID, err := getMatrixTxnID([]byte(t.PayloadContent))
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				return err
 | 
			
		||||
@@ -189,9 +190,9 @@ func Deliver(ctx context.Context, t *webhook_model.HookTask) error {
 | 
			
		||||
 | 
			
		||||
		// Update webhook last delivery status.
 | 
			
		||||
		if t.IsSucceed {
 | 
			
		||||
			w.LastStatus = webhook_model.HookStatusSucceed
 | 
			
		||||
			w.LastStatus = webhook_module.HookStatusSucceed
 | 
			
		||||
		} else {
 | 
			
		||||
			w.LastStatus = webhook_model.HookStatusFail
 | 
			
		||||
			w.LastStatus = webhook_module.HookStatusFail
 | 
			
		||||
		}
 | 
			
		||||
		if err = webhook_model.UpdateWebhookLastStatus(w); err != nil {
 | 
			
		||||
			log.Error("UpdateWebhookLastStatus: %v", err)
 | 
			
		||||
 
 | 
			
		||||
@@ -16,6 +16,7 @@ import (
 | 
			
		||||
	webhook_model "code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
@@ -62,14 +63,14 @@ func TestWebhookDeliverAuthorizationHeader(t *testing.T) {
 | 
			
		||||
		URL:         s.URL + "/webhook",
 | 
			
		||||
		ContentType: webhook_model.ContentTypeJSON,
 | 
			
		||||
		IsActive:    true,
 | 
			
		||||
		Type:        webhook_model.GITEA,
 | 
			
		||||
		Type:        webhook_module.GITEA,
 | 
			
		||||
	}
 | 
			
		||||
	err := hook.SetHeaderAuthorization("Bearer s3cr3t-t0ken")
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.NoError(t, webhook_model.CreateWebhook(db.DefaultContext, hook))
 | 
			
		||||
	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)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 
 | 
			
		||||
@@ -8,11 +8,11 @@ import (
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	webhook_model "code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	"code.gitea.io/gitea/modules/git"
 | 
			
		||||
	"code.gitea.io/gitea/modules/json"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/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
 | 
			
		||||
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
 | 
			
		||||
	switch p.Action {
 | 
			
		||||
	case api.HookIssueReviewed:
 | 
			
		||||
@@ -190,6 +190,6 @@ func createDingtalkPayload(title, text, singleTitle, singleURL string) *Dingtalk
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,8 +7,8 @@ import (
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	webhook_model "code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
@@ -162,7 +162,7 @@ func TestDingTalkPayload(t *testing.T) {
 | 
			
		||||
		p.Action = api.HookIssueReviewed
 | 
			
		||||
 | 
			
		||||
		d := new(DingtalkPayload)
 | 
			
		||||
		pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved)
 | 
			
		||||
		pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved)
 | 
			
		||||
		require.NoError(t, err)
 | 
			
		||||
		require.NotNil(t, pl)
 | 
			
		||||
		require.IsType(t, &DingtalkPayload{}, pl)
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
@@ -190,7 +191,7 @@ func (d *DiscordPayload) PullRequest(p *api.PullRequestPayload) (api.Payloader,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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 color int
 | 
			
		||||
	switch p.Action {
 | 
			
		||||
@@ -204,11 +205,11 @@ func (d *DiscordPayload) Review(p *api.PullRequestPayload, event webhook_model.H
 | 
			
		||||
		text = p.Review.Content
 | 
			
		||||
 | 
			
		||||
		switch event {
 | 
			
		||||
		case webhook_model.HookEventPullRequestReviewApproved:
 | 
			
		||||
		case webhook_module.HookEventPullRequestReviewApproved:
 | 
			
		||||
			color = greenColor
 | 
			
		||||
		case webhook_model.HookEventPullRequestReviewRejected:
 | 
			
		||||
		case webhook_module.HookEventPullRequestReviewRejected:
 | 
			
		||||
			color = redColor
 | 
			
		||||
		case webhook_model.HookEventPullRequestComment:
 | 
			
		||||
		case webhook_module.HookEventPullRequestComment:
 | 
			
		||||
			color = greyColor
 | 
			
		||||
		default:
 | 
			
		||||
			color = yellowColor
 | 
			
		||||
@@ -256,7 +257,7 @@ func (d *DiscordPayload) Release(p *api.ReleasePayload) (api.Payloader, error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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)
 | 
			
		||||
 | 
			
		||||
	discord := &DiscordMeta{}
 | 
			
		||||
@@ -269,14 +270,14 @@ func GetDiscordPayload(p api.Payloader, event webhook_model.HookEventType, meta
 | 
			
		||||
	return convertPayloader(s, p, event)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func parseHookPullRequestEventType(event webhook_model.HookEventType) (string, error) {
 | 
			
		||||
func parseHookPullRequestEventType(event webhook_module.HookEventType) (string, error) {
 | 
			
		||||
	switch event {
 | 
			
		||||
 | 
			
		||||
	case webhook_model.HookEventPullRequestReviewApproved:
 | 
			
		||||
	case webhook_module.HookEventPullRequestReviewApproved:
 | 
			
		||||
		return "approved", nil
 | 
			
		||||
	case webhook_model.HookEventPullRequestReviewRejected:
 | 
			
		||||
	case webhook_module.HookEventPullRequestReviewRejected:
 | 
			
		||||
		return "rejected", nil
 | 
			
		||||
	case webhook_model.HookEventPullRequestComment:
 | 
			
		||||
	case webhook_module.HookEventPullRequestComment:
 | 
			
		||||
		return "comment", nil
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
 
 | 
			
		||||
@@ -6,9 +6,9 @@ package webhook
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	webhook_model "code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
@@ -179,7 +179,7 @@ func TestDiscordPayload(t *testing.T) {
 | 
			
		||||
		p.Action = api.HookIssueReviewed
 | 
			
		||||
 | 
			
		||||
		d := new(DiscordPayload)
 | 
			
		||||
		pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved)
 | 
			
		||||
		pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved)
 | 
			
		||||
		require.NoError(t, err)
 | 
			
		||||
		require.NotNil(t, pl)
 | 
			
		||||
		require.IsType(t, &DiscordPayload{}, pl)
 | 
			
		||||
 
 | 
			
		||||
@@ -7,10 +7,10 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	webhook_model "code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	"code.gitea.io/gitea/modules/git"
 | 
			
		||||
	"code.gitea.io/gitea/modules/json"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
@@ -117,7 +117,7 @@ func (f *FeishuPayload) PullRequest(p *api.PullRequestPayload) (api.Payloader, e
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		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
 | 
			
		||||
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)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,8 +6,8 @@ package webhook
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	webhook_model "code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
@@ -124,7 +124,7 @@ func TestFeishuPayload(t *testing.T) {
 | 
			
		||||
		p.Action = api.HookIssueReviewed
 | 
			
		||||
 | 
			
		||||
		d := new(FeishuPayload)
 | 
			
		||||
		pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved)
 | 
			
		||||
		pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved)
 | 
			
		||||
		require.NoError(t, err)
 | 
			
		||||
		require.NotNil(t, pl)
 | 
			
		||||
		require.IsType(t, &FeishuPayload{}, pl)
 | 
			
		||||
 
 | 
			
		||||
@@ -9,9 +9,11 @@ import (
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	webhook_model "code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type linkFormatter = func(string, string) string
 | 
			
		||||
@@ -223,3 +225,36 @@ func getIssueCommentPayloadInfo(p *api.IssueCommentPayload, linkFormatter linkFo
 | 
			
		||||
 | 
			
		||||
	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"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const matrixPayloadSizeLimit = 1024 * 64
 | 
			
		||||
@@ -173,7 +174,7 @@ func (m *MatrixPayload) PullRequest(p *api.PullRequestPayload) (api.Payloader, e
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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)
 | 
			
		||||
	title := fmt.Sprintf("#%d %s", p.Index, p.PullRequest.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
 | 
			
		||||
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)
 | 
			
		||||
 | 
			
		||||
	matrix := &MatrixMeta{}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,8 +6,8 @@ package webhook
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	webhook_model "code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
@@ -133,7 +133,7 @@ func TestMatrixPayload(t *testing.T) {
 | 
			
		||||
		p.Action = api.HookIssueReviewed
 | 
			
		||||
 | 
			
		||||
		d := new(MatrixPayload)
 | 
			
		||||
		pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved)
 | 
			
		||||
		pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved)
 | 
			
		||||
		require.NoError(t, err)
 | 
			
		||||
		require.NotNil(t, pl)
 | 
			
		||||
		require.IsType(t, &MatrixPayload{}, pl)
 | 
			
		||||
 
 | 
			
		||||
@@ -8,11 +8,11 @@ import (
 | 
			
		||||
	"net/url"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	webhook_model "code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	"code.gitea.io/gitea/modules/git"
 | 
			
		||||
	"code.gitea.io/gitea/modules/json"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
@@ -205,7 +205,7 @@ func (m *MSTeamsPayload) PullRequest(p *api.PullRequestPayload) (api.Payloader,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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 color int
 | 
			
		||||
	switch p.Action {
 | 
			
		||||
@@ -219,11 +219,11 @@ func (m *MSTeamsPayload) Review(p *api.PullRequestPayload, event webhook_model.H
 | 
			
		||||
		text = p.Review.Content
 | 
			
		||||
 | 
			
		||||
		switch event {
 | 
			
		||||
		case webhook_model.HookEventPullRequestReviewApproved:
 | 
			
		||||
		case webhook_module.HookEventPullRequestReviewApproved:
 | 
			
		||||
			color = greenColor
 | 
			
		||||
		case webhook_model.HookEventPullRequestReviewRejected:
 | 
			
		||||
		case webhook_module.HookEventPullRequestReviewRejected:
 | 
			
		||||
			color = redColor
 | 
			
		||||
		case webhook_model.HookEventPullRequestComment:
 | 
			
		||||
		case webhook_module.HookEventPullRequestComment:
 | 
			
		||||
			color = greyColor
 | 
			
		||||
		default:
 | 
			
		||||
			color = yellowColor
 | 
			
		||||
@@ -297,7 +297,7 @@ func (m *MSTeamsPayload) Release(p *api.ReleasePayload) (api.Payloader, error) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,8 +6,8 @@ package webhook
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	webhook_model "code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
@@ -277,7 +277,7 @@ func TestMSTeamsPayload(t *testing.T) {
 | 
			
		||||
		p.Action = api.HookIssueReviewed
 | 
			
		||||
 | 
			
		||||
		d := new(MSTeamsPayload)
 | 
			
		||||
		pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved)
 | 
			
		||||
		pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved)
 | 
			
		||||
		require.NoError(t, err)
 | 
			
		||||
		require.NotNil(t, pl)
 | 
			
		||||
		require.IsType(t, &MSTeamsPayload{}, pl)
 | 
			
		||||
 
 | 
			
		||||
@@ -13,17 +13,21 @@ import (
 | 
			
		||||
	repo_model "code.gitea.io/gitea/models/repo"
 | 
			
		||||
	"code.gitea.io/gitea/models/unit"
 | 
			
		||||
	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/log"
 | 
			
		||||
	"code.gitea.io/gitea/modules/notification"
 | 
			
		||||
	"code.gitea.io/gitea/modules/notification/base"
 | 
			
		||||
	"code.gitea.io/gitea/modules/repository"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
	"code.gitea.io/gitea/services/convert"
 | 
			
		||||
	webhook_services "code.gitea.io/gitea/services/webhook"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	notification.RegisterNotifier(&webhookNotifier{})
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type webhookNotifier struct {
 | 
			
		||||
	base.NullNotifier
 | 
			
		||||
}
 | 
			
		||||
@@ -54,7 +58,7 @@ func (m *webhookNotifier) NotifyIssueClearLabels(ctx context.Context, doer *user
 | 
			
		||||
			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,
 | 
			
		||||
			Index:       issue.Index,
 | 
			
		||||
			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),
 | 
			
		||||
		})
 | 
			
		||||
	} 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,
 | 
			
		||||
			Index:      issue.Index,
 | 
			
		||||
			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)
 | 
			
		||||
 | 
			
		||||
	// 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),
 | 
			
		||||
		Repo:   convert.ToRepo(ctx, repo, mode),
 | 
			
		||||
		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.
 | 
			
		||||
	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,
 | 
			
		||||
			Repository:   convert.ToRepo(ctx, repo, perm.AccessModeOwner),
 | 
			
		||||
			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) {
 | 
			
		||||
	// 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,
 | 
			
		||||
		Repository:   convert.ToRepo(ctx, repo, perm.AccessModeOwner),
 | 
			
		||||
		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) {
 | 
			
		||||
	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,
 | 
			
		||||
		Repository:   convert.ToRepo(ctx, repo, perm.AccessModeOwner),
 | 
			
		||||
		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) {
 | 
			
		||||
	// 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,
 | 
			
		||||
		Repository:   convert.ToRepo(ctx, repo, perm.AccessModeOwner),
 | 
			
		||||
		Organization: convert.ToUser(u, nil),
 | 
			
		||||
@@ -159,7 +163,7 @@ func (m *webhookNotifier) NotifyIssueChangeAssignee(ctx context.Context, doer *u
 | 
			
		||||
			apiPullRequest.Action = api.HookIssueAssigned
 | 
			
		||||
		}
 | 
			
		||||
		// 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)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
@@ -177,7 +181,7 @@ func (m *webhookNotifier) NotifyIssueChangeAssignee(ctx context.Context, doer *u
 | 
			
		||||
			apiIssue.Action = api.HookIssueAssigned
 | 
			
		||||
		}
 | 
			
		||||
		// 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)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
@@ -193,7 +197,7 @@ func (m *webhookNotifier) NotifyIssueChangeTitle(ctx context.Context, doer *user
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		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,
 | 
			
		||||
			Index:  issue.Index,
 | 
			
		||||
			Changes: &api.ChangesPayload{
 | 
			
		||||
@@ -206,7 +210,7 @@ func (m *webhookNotifier) NotifyIssueChangeTitle(ctx context.Context, doer *user
 | 
			
		||||
			Sender:      convert.ToUser(doer, nil),
 | 
			
		||||
		})
 | 
			
		||||
	} 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,
 | 
			
		||||
			Index:  issue.Index,
 | 
			
		||||
			Changes: &api.ChangesPayload{
 | 
			
		||||
@@ -245,7 +249,7 @@ func (m *webhookNotifier) NotifyIssueChangeStatus(ctx context.Context, doer *use
 | 
			
		||||
		} else {
 | 
			
		||||
			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 {
 | 
			
		||||
		apiIssue := &api.IssuePayload{
 | 
			
		||||
			Index:      issue.Index,
 | 
			
		||||
@@ -258,7 +262,7 @@ func (m *webhookNotifier) NotifyIssueChangeStatus(ctx context.Context, doer *use
 | 
			
		||||
		} else {
 | 
			
		||||
			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 {
 | 
			
		||||
		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)
 | 
			
		||||
	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,
 | 
			
		||||
		Index:      issue.Index,
 | 
			
		||||
		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)
 | 
			
		||||
	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,
 | 
			
		||||
		Index:       pull.Issue.Index,
 | 
			
		||||
		PullRequest: convert.ToAPIPullRequest(ctx, pull, nil),
 | 
			
		||||
@@ -323,7 +327,7 @@ func (m *webhookNotifier) NotifyIssueChangeContent(ctx context.Context, doer *us
 | 
			
		||||
	var err error
 | 
			
		||||
	if issue.IsPull {
 | 
			
		||||
		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,
 | 
			
		||||
			Index:  issue.Index,
 | 
			
		||||
			Changes: &api.ChangesPayload{
 | 
			
		||||
@@ -336,7 +340,7 @@ func (m *webhookNotifier) NotifyIssueChangeContent(ctx context.Context, doer *us
 | 
			
		||||
			Sender:      convert.ToUser(doer, nil),
 | 
			
		||||
		})
 | 
			
		||||
	} 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,
 | 
			
		||||
			Index:  issue.Index,
 | 
			
		||||
			Changes: &api.ChangesPayload{
 | 
			
		||||
@@ -369,15 +373,15 @@ func (m *webhookNotifier) NotifyUpdateComment(ctx context.Context, doer *user_mo
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var eventType webhook.HookEventType
 | 
			
		||||
	var eventType webhook_module.HookEventType
 | 
			
		||||
	if c.Issue.IsPull {
 | 
			
		||||
		eventType = webhook.HookEventPullRequestComment
 | 
			
		||||
		eventType = webhook_module.HookEventPullRequestComment
 | 
			
		||||
	} else {
 | 
			
		||||
		eventType = webhook.HookEventIssueComment
 | 
			
		||||
		eventType = webhook_module.HookEventIssueComment
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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,
 | 
			
		||||
		Issue:   convert.ToAPIIssue(ctx, c.Issue),
 | 
			
		||||
		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,
 | 
			
		||||
	issue *issues_model.Issue, comment *issues_model.Comment, mentions []*user_model.User,
 | 
			
		||||
) {
 | 
			
		||||
	var eventType webhook.HookEventType
 | 
			
		||||
	var eventType webhook_module.HookEventType
 | 
			
		||||
	if issue.IsPull {
 | 
			
		||||
		eventType = webhook.HookEventPullRequestComment
 | 
			
		||||
		eventType = webhook_module.HookEventPullRequestComment
 | 
			
		||||
	} else {
 | 
			
		||||
		eventType = webhook.HookEventIssueComment
 | 
			
		||||
		eventType = webhook_module.HookEventIssueComment
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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,
 | 
			
		||||
		Issue:      convert.ToAPIIssue(ctx, issue),
 | 
			
		||||
		Comment:    convert.ToComment(comment),
 | 
			
		||||
@@ -434,15 +438,15 @@ func (m *webhookNotifier) NotifyDeleteComment(ctx context.Context, doer *user_mo
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var eventType webhook.HookEventType
 | 
			
		||||
	var eventType webhook_module.HookEventType
 | 
			
		||||
	if comment.Issue.IsPull {
 | 
			
		||||
		eventType = webhook.HookEventPullRequestComment
 | 
			
		||||
		eventType = webhook_module.HookEventPullRequestComment
 | 
			
		||||
	} else {
 | 
			
		||||
		eventType = webhook.HookEventIssueComment
 | 
			
		||||
		eventType = webhook_module.HookEventIssueComment
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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,
 | 
			
		||||
		Issue:      convert.ToAPIIssue(ctx, comment.Issue),
 | 
			
		||||
		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) {
 | 
			
		||||
	// 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,
 | 
			
		||||
		Repository: convert.ToRepo(ctx, repo, perm.AccessModeOwner),
 | 
			
		||||
		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) {
 | 
			
		||||
	// 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,
 | 
			
		||||
		Repository: convert.ToRepo(ctx, repo, perm.AccessModeOwner),
 | 
			
		||||
		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) {
 | 
			
		||||
	// 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,
 | 
			
		||||
		Repository: convert.ToRepo(ctx, repo, perm.AccessModeOwner),
 | 
			
		||||
		Sender:     convert.ToUser(doer, nil),
 | 
			
		||||
@@ -517,7 +521,7 @@ func (m *webhookNotifier) NotifyIssueChangeLabels(ctx context.Context, doer *use
 | 
			
		||||
			log.Error("LoadIssue: %v", err)
 | 
			
		||||
			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,
 | 
			
		||||
			Index:       issue.Index,
 | 
			
		||||
			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),
 | 
			
		||||
		})
 | 
			
		||||
	} 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,
 | 
			
		||||
			Index:      issue.Index,
 | 
			
		||||
			Issue:      convert.ToAPIIssue(ctx, issue),
 | 
			
		||||
@@ -559,7 +563,7 @@ func (m *webhookNotifier) NotifyIssueChangeMilestone(ctx context.Context, doer *
 | 
			
		||||
			log.Error("LoadIssue: %v", err)
 | 
			
		||||
			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,
 | 
			
		||||
			Index:       issue.Index,
 | 
			
		||||
			PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil),
 | 
			
		||||
@@ -567,7 +571,7 @@ func (m *webhookNotifier) NotifyIssueChangeMilestone(ctx context.Context, doer *
 | 
			
		||||
			Sender:      convert.ToUser(doer, nil),
 | 
			
		||||
		})
 | 
			
		||||
	} 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,
 | 
			
		||||
			Index:      issue.Index,
 | 
			
		||||
			Issue:      convert.ToAPIIssue(ctx, issue),
 | 
			
		||||
@@ -588,7 +592,7 @@ func (m *webhookNotifier) NotifyPushCommits(ctx context.Context, pusher *user_mo
 | 
			
		||||
		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,
 | 
			
		||||
		Before:       opts.OldCommitID,
 | 
			
		||||
		After:        opts.NewCommitID,
 | 
			
		||||
@@ -641,7 +645,7 @@ func (*webhookNotifier) NotifyMergePullRequest(ctx context.Context, doer *user_m
 | 
			
		||||
		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)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -655,7 +659,7 @@ func (m *webhookNotifier) NotifyPullRequestChangeTargetBranch(ctx context.Contex
 | 
			
		||||
	issue := pr.Issue
 | 
			
		||||
 | 
			
		||||
	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,
 | 
			
		||||
		Index:  issue.Index,
 | 
			
		||||
		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) {
 | 
			
		||||
	var reviewHookType webhook.HookEventType
 | 
			
		||||
	var reviewHookType webhook_module.HookEventType
 | 
			
		||||
 | 
			
		||||
	switch review.Type {
 | 
			
		||||
	case issues_model.ReviewTypeApprove:
 | 
			
		||||
		reviewHookType = webhook.HookEventPullRequestReviewApproved
 | 
			
		||||
		reviewHookType = webhook_module.HookEventPullRequestReviewApproved
 | 
			
		||||
	case issues_model.ReviewTypeComment:
 | 
			
		||||
		reviewHookType = webhook.HookEventPullRequestComment
 | 
			
		||||
		reviewHookType = webhook_module.HookEventPullRequestComment
 | 
			
		||||
	case issues_model.ReviewTypeReject:
 | 
			
		||||
		reviewHookType = webhook.HookEventPullRequestReviewRejected
 | 
			
		||||
		reviewHookType = webhook_module.HookEventPullRequestReviewRejected
 | 
			
		||||
	default:
 | 
			
		||||
		// unsupported review webhook type here
 | 
			
		||||
		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)
 | 
			
		||||
		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,
 | 
			
		||||
		Index:       review.Issue.Index,
 | 
			
		||||
		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)
 | 
			
		||||
	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,
 | 
			
		||||
		Sha:     refID,
 | 
			
		||||
		RefType: refType,
 | 
			
		||||
@@ -738,7 +742,7 @@ func (m *webhookNotifier) NotifyPullRequestSynchronized(ctx context.Context, doe
 | 
			
		||||
		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,
 | 
			
		||||
		Index:       pr.Issue.Index,
 | 
			
		||||
		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)
 | 
			
		||||
	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,
 | 
			
		||||
		RefType:    refType,
 | 
			
		||||
		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)
 | 
			
		||||
	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,
 | 
			
		||||
		Release:    convert.ToRelease(rel),
 | 
			
		||||
		Repository: convert.ToRepo(ctx, rel.Repo, mode),
 | 
			
		||||
@@ -802,7 +806,7 @@ func (m *webhookNotifier) NotifySyncPushCommits(ctx context.Context, pusher *use
 | 
			
		||||
		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,
 | 
			
		||||
		Before:       opts.OldCommitID,
 | 
			
		||||
		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) {
 | 
			
		||||
	source := webhook_services.EventSource{
 | 
			
		||||
	source := EventSource{
 | 
			
		||||
		Repository: pd.Repository,
 | 
			
		||||
		Owner:      pd.Owner,
 | 
			
		||||
	}
 | 
			
		||||
@@ -846,7 +850,7 @@ func notifyPackage(ctx context.Context, sender *user_model.User, pd *packages_mo
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := webhook_services.PrepareWebhooks(ctx, source, webhook.HookEventPackage, &api.PackagePayload{
 | 
			
		||||
	if err := PrepareWebhooks(ctx, source, webhook_module.HookEventPackage, &api.PackagePayload{
 | 
			
		||||
		Action:  action,
 | 
			
		||||
		Package: apiPackage,
 | 
			
		||||
		Sender:  convert.ToUser(sender, nil),
 | 
			
		||||
@@ -10,6 +10,7 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/json"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
@@ -20,7 +21,7 @@ type (
 | 
			
		||||
		} `json:"repository"`
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// PackagistMeta contains the meta data for the webhook
 | 
			
		||||
	// PackagistMeta contains the metadata for the webhook
 | 
			
		||||
	PackagistMeta struct {
 | 
			
		||||
		Username   string `json:"username"`
 | 
			
		||||
		APIToken   string `json:"api_token"`
 | 
			
		||||
@@ -49,62 +50,62 @@ func (f *PackagistPayload) JSONPayload() ([]byte, error) {
 | 
			
		||||
var _ PayloadConvertor = &PackagistPayload{}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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)
 | 
			
		||||
 | 
			
		||||
	packagist := &PackagistMeta{}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,8 +6,8 @@ package webhook
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	webhook_model "code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
@@ -101,7 +101,7 @@ func TestPackagistPayload(t *testing.T) {
 | 
			
		||||
		p.Action = api.HookIssueReviewed
 | 
			
		||||
 | 
			
		||||
		d := new(PackagistPayload)
 | 
			
		||||
		pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved)
 | 
			
		||||
		pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved)
 | 
			
		||||
		require.NoError(t, err)
 | 
			
		||||
		require.Nil(t, pl)
 | 
			
		||||
	})
 | 
			
		||||
 
 | 
			
		||||
@@ -4,8 +4,8 @@
 | 
			
		||||
package webhook
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	webhook_model "code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	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
 | 
			
		||||
@@ -18,40 +18,40 @@ type PayloadConvertor interface {
 | 
			
		||||
	IssueComment(*api.IssueCommentPayload) (api.Payloader, error)
 | 
			
		||||
	Push(*api.PushPayload) (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)
 | 
			
		||||
	Release(*api.ReleasePayload) (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 {
 | 
			
		||||
	case webhook_model.HookEventCreate:
 | 
			
		||||
	case webhook_module.HookEventCreate:
 | 
			
		||||
		return s.Create(p.(*api.CreatePayload))
 | 
			
		||||
	case webhook_model.HookEventDelete:
 | 
			
		||||
	case webhook_module.HookEventDelete:
 | 
			
		||||
		return s.Delete(p.(*api.DeletePayload))
 | 
			
		||||
	case webhook_model.HookEventFork:
 | 
			
		||||
	case webhook_module.HookEventFork:
 | 
			
		||||
		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))
 | 
			
		||||
	case webhook_model.HookEventIssueComment, webhook_model.HookEventPullRequestComment:
 | 
			
		||||
	case webhook_module.HookEventIssueComment, webhook_module.HookEventPullRequestComment:
 | 
			
		||||
		pl, ok := p.(*api.IssueCommentPayload)
 | 
			
		||||
		if ok {
 | 
			
		||||
			return s.IssueComment(pl)
 | 
			
		||||
		}
 | 
			
		||||
		return s.PullRequest(p.(*api.PullRequestPayload))
 | 
			
		||||
	case webhook_model.HookEventPush:
 | 
			
		||||
	case webhook_module.HookEventPush:
 | 
			
		||||
		return s.Push(p.(*api.PushPayload))
 | 
			
		||||
	case webhook_model.HookEventPullRequest, webhook_model.HookEventPullRequestAssign, webhook_model.HookEventPullRequestLabel,
 | 
			
		||||
		webhook_model.HookEventPullRequestMilestone, webhook_model.HookEventPullRequestSync:
 | 
			
		||||
	case webhook_module.HookEventPullRequest, webhook_module.HookEventPullRequestAssign, webhook_module.HookEventPullRequestLabel,
 | 
			
		||||
		webhook_module.HookEventPullRequestMilestone, webhook_module.HookEventPullRequestSync:
 | 
			
		||||
		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)
 | 
			
		||||
	case webhook_model.HookEventRepository:
 | 
			
		||||
	case webhook_module.HookEventRepository:
 | 
			
		||||
		return s.Repository(p.(*api.RepositoryPayload))
 | 
			
		||||
	case webhook_model.HookEventRelease:
 | 
			
		||||
	case webhook_module.HookEventRelease:
 | 
			
		||||
		return s.Release(p.(*api.ReleasePayload))
 | 
			
		||||
	case webhook_model.HookEventWiki:
 | 
			
		||||
	case webhook_module.HookEventWiki:
 | 
			
		||||
		return s.Wiki(p.(*api.WikiPayload))
 | 
			
		||||
	}
 | 
			
		||||
	return s, nil
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,7 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// SlackMeta contains the slack metadata
 | 
			
		||||
@@ -231,7 +232,7 @@ func (s *SlackPayload) PullRequest(p *api.PullRequestPayload) (api.Payloader, er
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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)
 | 
			
		||||
	title := fmt.Sprintf("#%d %s", p.Index, p.PullRequest.Title)
 | 
			
		||||
	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
 | 
			
		||||
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)
 | 
			
		||||
 | 
			
		||||
	slack := &SlackMeta{}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,8 +6,8 @@ package webhook
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	webhook_model "code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
@@ -124,7 +124,7 @@ func TestSlackPayload(t *testing.T) {
 | 
			
		||||
		p.Action = api.HookIssueReviewed
 | 
			
		||||
 | 
			
		||||
		d := new(SlackPayload)
 | 
			
		||||
		pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved)
 | 
			
		||||
		pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved)
 | 
			
		||||
		require.NoError(t, err)
 | 
			
		||||
		require.NotNil(t, pl)
 | 
			
		||||
		require.IsType(t, &SlackPayload{}, pl)
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,7 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	"code.gitea.io/gitea/modules/markup"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
@@ -140,7 +141,7 @@ func (t *TelegramPayload) PullRequest(p *api.PullRequestPayload) (api.Payloader,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
	switch p.Action {
 | 
			
		||||
	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
 | 
			
		||||
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)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,8 +6,8 @@ package webhook
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	webhook_model "code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
	"github.com/stretchr/testify/require"
 | 
			
		||||
@@ -124,7 +124,7 @@ func TestTelegramPayload(t *testing.T) {
 | 
			
		||||
		p.Action = api.HookIssueReviewed
 | 
			
		||||
 | 
			
		||||
		d := new(TelegramPayload)
 | 
			
		||||
		pl, err := d.Review(p, webhook_model.HookEventPullRequestReviewApproved)
 | 
			
		||||
		pl, err := d.Review(p, webhook_module.HookEventPullRequestReviewApproved)
 | 
			
		||||
		require.NoError(t, err)
 | 
			
		||||
		require.NotNil(t, pl)
 | 
			
		||||
		require.IsType(t, &TelegramPayload{}, pl)
 | 
			
		||||
 
 | 
			
		||||
@@ -18,62 +18,58 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	"code.gitea.io/gitea/modules/util"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
 | 
			
		||||
	"github.com/gobwas/glob"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type webhook struct {
 | 
			
		||||
	name           webhook_model.HookType
 | 
			
		||||
	payloadCreator func(p api.Payloader, event webhook_model.HookEventType, meta string) (api.Payloader, error)
 | 
			
		||||
	name           webhook_module.HookType
 | 
			
		||||
	payloadCreator func(p api.Payloader, event webhook_module.HookEventType, meta string) (api.Payloader, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var webhooks = map[webhook_model.HookType]*webhook{
 | 
			
		||||
	webhook_model.SLACK: {
 | 
			
		||||
		name:           webhook_model.SLACK,
 | 
			
		||||
var webhooks = map[webhook_module.HookType]*webhook{
 | 
			
		||||
	webhook_module.SLACK: {
 | 
			
		||||
		name:           webhook_module.SLACK,
 | 
			
		||||
		payloadCreator: GetSlackPayload,
 | 
			
		||||
	},
 | 
			
		||||
	webhook_model.DISCORD: {
 | 
			
		||||
		name:           webhook_model.DISCORD,
 | 
			
		||||
	webhook_module.DISCORD: {
 | 
			
		||||
		name:           webhook_module.DISCORD,
 | 
			
		||||
		payloadCreator: GetDiscordPayload,
 | 
			
		||||
	},
 | 
			
		||||
	webhook_model.DINGTALK: {
 | 
			
		||||
		name:           webhook_model.DINGTALK,
 | 
			
		||||
	webhook_module.DINGTALK: {
 | 
			
		||||
		name:           webhook_module.DINGTALK,
 | 
			
		||||
		payloadCreator: GetDingtalkPayload,
 | 
			
		||||
	},
 | 
			
		||||
	webhook_model.TELEGRAM: {
 | 
			
		||||
		name:           webhook_model.TELEGRAM,
 | 
			
		||||
	webhook_module.TELEGRAM: {
 | 
			
		||||
		name:           webhook_module.TELEGRAM,
 | 
			
		||||
		payloadCreator: GetTelegramPayload,
 | 
			
		||||
	},
 | 
			
		||||
	webhook_model.MSTEAMS: {
 | 
			
		||||
		name:           webhook_model.MSTEAMS,
 | 
			
		||||
	webhook_module.MSTEAMS: {
 | 
			
		||||
		name:           webhook_module.MSTEAMS,
 | 
			
		||||
		payloadCreator: GetMSTeamsPayload,
 | 
			
		||||
	},
 | 
			
		||||
	webhook_model.FEISHU: {
 | 
			
		||||
		name:           webhook_model.FEISHU,
 | 
			
		||||
	webhook_module.FEISHU: {
 | 
			
		||||
		name:           webhook_module.FEISHU,
 | 
			
		||||
		payloadCreator: GetFeishuPayload,
 | 
			
		||||
	},
 | 
			
		||||
	webhook_model.MATRIX: {
 | 
			
		||||
		name:           webhook_model.MATRIX,
 | 
			
		||||
	webhook_module.MATRIX: {
 | 
			
		||||
		name:           webhook_module.MATRIX,
 | 
			
		||||
		payloadCreator: GetMatrixPayload,
 | 
			
		||||
	},
 | 
			
		||||
	webhook_model.WECHATWORK: {
 | 
			
		||||
		name:           webhook_model.WECHATWORK,
 | 
			
		||||
	webhook_module.WECHATWORK: {
 | 
			
		||||
		name:           webhook_module.WECHATWORK,
 | 
			
		||||
		payloadCreator: GetWechatworkPayload,
 | 
			
		||||
	},
 | 
			
		||||
	webhook_model.PACKAGIST: {
 | 
			
		||||
		name:           webhook_model.PACKAGIST,
 | 
			
		||||
	webhook_module.PACKAGIST: {
 | 
			
		||||
		name:           webhook_module.PACKAGIST,
 | 
			
		||||
		payloadCreator: GetPackagistPayload,
 | 
			
		||||
	},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RegisterWebhook registers a webhook
 | 
			
		||||
func RegisterWebhook(name string, webhook *webhook) {
 | 
			
		||||
	webhooks[name] = webhook
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsValidHookTaskType returns true if a webhook registered
 | 
			
		||||
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
 | 
			
		||||
	}
 | 
			
		||||
	_, 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
 | 
			
		||||
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.
 | 
			
		||||
	if setting.DisableWebhooks {
 | 
			
		||||
		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.).
 | 
			
		||||
	// Integration webhooks (e.g. drone) still receive the required data.
 | 
			
		||||
	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 {
 | 
			
		||||
		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.
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
	var ws []*webhook_model.Webhook
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/models/unittest"
 | 
			
		||||
	webhook_model "code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
@@ -32,12 +33,12 @@ func TestPrepareWebhooks(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
 | 
			
		||||
	hookTasks := []*webhook_model.HookTask{
 | 
			
		||||
		{HookID: 1, EventType: webhook_model.HookEventPush},
 | 
			
		||||
		{HookID: 1, EventType: webhook_module.HookEventPush},
 | 
			
		||||
	}
 | 
			
		||||
	for _, hookTask := range hookTasks {
 | 
			
		||||
		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 {
 | 
			
		||||
		unittest.AssertExistsAndLoadBean(t, hookTask)
 | 
			
		||||
	}
 | 
			
		||||
@@ -48,13 +49,13 @@ func TestPrepareWebhooksBranchFilterMatch(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
 | 
			
		||||
	hookTasks := []*webhook_model.HookTask{
 | 
			
		||||
		{HookID: 4, EventType: webhook_model.HookEventPush},
 | 
			
		||||
		{HookID: 4, EventType: webhook_module.HookEventPush},
 | 
			
		||||
	}
 | 
			
		||||
	for _, hookTask := range hookTasks {
 | 
			
		||||
		unittest.AssertNotExistsBean(t, hookTask)
 | 
			
		||||
	}
 | 
			
		||||
	// 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 {
 | 
			
		||||
		unittest.AssertExistsAndLoadBean(t, hookTask)
 | 
			
		||||
	}
 | 
			
		||||
@@ -65,12 +66,12 @@ func TestPrepareWebhooksBranchFilterNoMatch(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 2})
 | 
			
		||||
	hookTasks := []*webhook_model.HookTask{
 | 
			
		||||
		{HookID: 4, EventType: webhook_model.HookEventPush},
 | 
			
		||||
		{HookID: 4, EventType: webhook_module.HookEventPush},
 | 
			
		||||
	}
 | 
			
		||||
	for _, hookTask := range hookTasks {
 | 
			
		||||
		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 {
 | 
			
		||||
		unittest.AssertNotExistsBean(t, hookTask)
 | 
			
		||||
 
 | 
			
		||||
@@ -7,10 +7,10 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	webhook_model "code.gitea.io/gitea/models/webhook"
 | 
			
		||||
	"code.gitea.io/gitea/modules/git"
 | 
			
		||||
	"code.gitea.io/gitea/modules/json"
 | 
			
		||||
	api "code.gitea.io/gitea/modules/structs"
 | 
			
		||||
	webhook_module "code.gitea.io/gitea/modules/webhook"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type (
 | 
			
		||||
@@ -135,7 +135,7 @@ func (f *WechatworkPayload) PullRequest(p *api.PullRequestPayload) (api.Payloade
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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
 | 
			
		||||
	switch p.Action {
 | 
			
		||||
	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
 | 
			
		||||
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)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user