2019-10-15 13:03:05 +08:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2019-10-15 13:03:05 +08:00
package webhook
import (
2022-11-19 09:12:33 +01:00
"context"
2022-01-19 23:26:57 +00:00
2022-06-13 17:37:59 +08:00
issues_model "code.gitea.io/gitea/models/issues"
2022-03-30 10:42:47 +02:00
packages_model "code.gitea.io/gitea/models/packages"
2021-11-28 19:58:28 +08:00
"code.gitea.io/gitea/models/perm"
2022-05-11 18:09:36 +08:00
access_model "code.gitea.io/gitea/models/perm/access"
2021-12-10 09:27:50 +08:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-10 03:57:58 +08:00
"code.gitea.io/gitea/models/unit"
2021-11-24 17:49:20 +08:00
user_model "code.gitea.io/gitea/models/user"
2019-11-06 14:43:03 +08:00
"code.gitea.io/gitea/modules/git"
2019-10-15 13:03:05 +08:00
"code.gitea.io/gitea/modules/log"
2023-01-01 16:23:15 +01:00
"code.gitea.io/gitea/modules/notification"
2019-10-15 13:03:05 +08:00
"code.gitea.io/gitea/modules/notification/base"
2020-01-10 17:34:21 +08:00
"code.gitea.io/gitea/modules/repository"
2019-11-03 14:59:26 +08:00
"code.gitea.io/gitea/modules/setting"
2019-10-15 13:03:05 +08:00
api "code.gitea.io/gitea/modules/structs"
2023-01-01 16:23:15 +01:00
webhook_module "code.gitea.io/gitea/modules/webhook"
2022-12-29 03:57:15 +01:00
"code.gitea.io/gitea/services/convert"
2019-10-15 13:03:05 +08:00
)
2023-01-01 16:23:15 +01:00
func init ( ) {
notification . RegisterNotifier ( & webhookNotifier { } )
}
2019-10-15 13:03:05 +08:00
type webhookNotifier struct {
base . NullNotifier
}
2022-01-20 18:46:10 +01:00
var _ base . Notifier = & webhookNotifier { }
2019-10-15 13:03:05 +08:00
// NewNotifier create a new webhookNotifier notifier
func NewNotifier ( ) base . Notifier {
return & webhookNotifier { }
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyIssueClearLabels ( ctx context . Context , doer * user_model . User , issue * issues_model . Issue ) {
if err := issue . LoadPoster ( ctx ) ; err != nil {
log . Error ( "LoadPoster: %v" , err )
2019-10-15 13:03:05 +08:00
return
}
2022-04-08 17:11:15 +08:00
if err := issue . LoadRepo ( ctx ) ; err != nil {
2019-10-15 13:03:05 +08:00
log . Error ( "LoadRepo: %v" , err )
return
}
2022-11-19 09:12:33 +01:00
mode , _ := access_model . AccessLevel ( ctx , issue . Poster , issue . Repo )
2019-10-15 13:03:05 +08:00
var err error
if issue . IsPull {
2022-11-19 09:12:33 +01:00
if err = issue . LoadPullRequest ( ctx ) ; err != nil {
2019-10-15 13:03:05 +08:00
log . Error ( "LoadPullRequest: %v" , err )
return
}
2023-01-01 16:23:15 +01:00
err = PrepareWebhooks ( ctx , EventSource { Repository : issue . Repo } , webhook_module . HookEventPullRequestLabel , & api . PullRequestPayload {
2019-10-15 13:03:05 +08:00
Action : api . HookIssueLabelCleared ,
Index : issue . Index ,
2022-01-19 23:26:57 +00:00
PullRequest : convert . ToAPIPullRequest ( ctx , issue . PullRequest , nil ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , issue . Repo , mode ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( doer , nil ) ,
2019-10-15 13:03:05 +08:00
} )
} else {
2023-01-01 16:23:15 +01:00
err = PrepareWebhooks ( ctx , EventSource { Repository : issue . Repo } , webhook_module . HookEventIssueLabel , & api . IssuePayload {
2019-10-15 13:03:05 +08:00
Action : api . HookIssueLabelCleared ,
Index : issue . Index ,
2022-11-19 09:12:33 +01:00
Issue : convert . ToAPIIssue ( ctx , issue ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , issue . Repo , mode ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( doer , nil ) ,
2019-10-15 13:03:05 +08:00
} )
}
if err != nil {
log . Error ( "PrepareWebhooks [is_pull: %v]: %v" , issue . IsPull , err )
}
}
2019-10-26 14:54:11 +08:00
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyForkRepository ( ctx context . Context , doer * user_model . User , oldRepo , repo * repo_model . Repository ) {
oldMode , _ := access_model . AccessLevel ( ctx , doer , oldRepo )
mode , _ := access_model . AccessLevel ( ctx , doer , repo )
2019-10-26 14:54:11 +08:00
// forked webhook
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : oldRepo } , webhook_module . HookEventFork , & api . ForkPayload {
2022-12-03 10:48:26 +08:00
Forkee : convert . ToRepo ( ctx , oldRepo , oldMode ) ,
Repo : convert . ToRepo ( ctx , repo , mode ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( doer , nil ) ,
2019-10-26 14:54:11 +08:00
} ) ; err != nil {
log . Error ( "PrepareWebhooks [repo_id: %d]: %v" , oldRepo . ID , err )
}
2022-11-19 09:12:33 +01:00
u := repo . MustOwner ( ctx )
2019-10-26 14:54:11 +08:00
// Add to hook queue for created repo after session commit.
if u . IsOrganization ( ) {
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : repo } , webhook_module . HookEventRepository , & api . RepositoryPayload {
2019-10-26 14:54:11 +08:00
Action : api . HookRepoCreated ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , repo , perm . AccessModeOwner ) ,
2021-03-27 17:45:26 +01:00
Organization : convert . ToUser ( u , nil ) ,
Sender : convert . ToUser ( doer , nil ) ,
2019-10-26 14:54:11 +08:00
} ) ; err != nil {
log . Error ( "PrepareWebhooks [repo_id: %d]: %v" , repo . ID , err )
}
}
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyCreateRepository ( ctx context . Context , doer , u * user_model . User , repo * repo_model . Repository ) {
2019-10-26 14:54:11 +08:00
// Add to hook queue for created repo after session commit.
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : repo } , webhook_module . HookEventRepository , & api . RepositoryPayload {
2020-10-02 09:37:46 +00:00
Action : api . HookRepoCreated ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , repo , perm . AccessModeOwner ) ,
2021-03-27 17:45:26 +01:00
Organization : convert . ToUser ( u , nil ) ,
Sender : convert . ToUser ( doer , nil ) ,
2020-10-02 09:37:46 +00:00
} ) ; err != nil {
log . Error ( "PrepareWebhooks [repo_id: %d]: %v" , repo . ID , err )
2019-10-26 14:54:11 +08:00
}
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyDeleteRepository ( ctx context . Context , doer * user_model . User , repo * repo_model . Repository ) {
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : repo } , webhook_module . HookEventRepository , & api . RepositoryPayload {
2020-10-02 09:37:46 +00:00
Action : api . HookRepoDeleted ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , repo , perm . AccessModeOwner ) ,
2022-11-19 09:12:33 +01:00
Organization : convert . ToUser ( repo . MustOwner ( ctx ) , nil ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( doer , nil ) ,
2020-10-02 09:37:46 +00:00
} ) ; err != nil {
log . Error ( "PrepareWebhooks [repo_id: %d]: %v" , repo . ID , err )
2019-10-26 14:54:11 +08:00
}
}
2019-10-28 10:11:50 +08:00
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyMigrateRepository ( ctx context . Context , doer , u * user_model . User , repo * repo_model . Repository ) {
2020-12-17 12:26:22 +00:00
// Add to hook queue for created repo after session commit.
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : repo } , webhook_module . HookEventRepository , & api . RepositoryPayload {
2020-12-17 12:26:22 +00:00
Action : api . HookRepoCreated ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , repo , perm . AccessModeOwner ) ,
2021-03-27 17:45:26 +01:00
Organization : convert . ToUser ( u , nil ) ,
Sender : convert . ToUser ( doer , nil ) ,
2020-12-17 12:26:22 +00:00
} ) ; err != nil {
log . Error ( "PrepareWebhooks [repo_id: %d]: %v" , repo . ID , err )
}
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyIssueChangeAssignee ( ctx context . Context , doer * user_model . User , issue * issues_model . Issue , assignee * user_model . User , removed bool , comment * issues_model . Comment ) {
2019-10-28 10:11:50 +08:00
if issue . IsPull {
2022-11-19 09:12:33 +01:00
mode , _ := access_model . AccessLevelUnit ( ctx , doer , issue . Repo , unit . TypePullRequests )
2019-10-28 10:11:50 +08:00
2022-11-19 09:12:33 +01:00
if err := issue . LoadPullRequest ( ctx ) ; err != nil {
2019-10-28 10:11:50 +08:00
log . Error ( "LoadPullRequest failed: %v" , err )
return
}
issue . PullRequest . Issue = issue
apiPullRequest := & api . PullRequestPayload {
Index : issue . Index ,
2022-01-19 23:26:57 +00:00
PullRequest : convert . ToAPIPullRequest ( ctx , issue . PullRequest , nil ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , issue . Repo , mode ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( doer , nil ) ,
2019-10-28 10:11:50 +08:00
}
if removed {
apiPullRequest . Action = api . HookIssueUnassigned
} else {
apiPullRequest . Action = api . HookIssueAssigned
}
// Assignee comment triggers a webhook
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : issue . Repo } , webhook_module . HookEventPullRequestAssign , apiPullRequest ) ; err != nil {
2019-10-28 10:11:50 +08:00
log . Error ( "PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v" , issue . IsPull , removed , err )
return
}
} else {
2022-11-19 09:12:33 +01:00
mode , _ := access_model . AccessLevelUnit ( ctx , doer , issue . Repo , unit . TypeIssues )
2019-10-28 10:11:50 +08:00
apiIssue := & api . IssuePayload {
Index : issue . Index ,
2022-11-19 09:12:33 +01:00
Issue : convert . ToAPIIssue ( ctx , issue ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , issue . Repo , mode ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( doer , nil ) ,
2019-10-28 10:11:50 +08:00
}
if removed {
apiIssue . Action = api . HookIssueUnassigned
} else {
apiIssue . Action = api . HookIssueAssigned
}
// Assignee comment triggers a webhook
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : issue . Repo } , webhook_module . HookEventIssueAssign , apiIssue ) ; err != nil {
2019-10-28 10:11:50 +08:00
log . Error ( "PrepareWebhooks [is_pull: %v, remove_assignee: %v]: %v" , issue . IsPull , removed , err )
return
}
}
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyIssueChangeTitle ( ctx context . Context , doer * user_model . User , issue * issues_model . Issue , oldTitle string ) {
mode , _ := access_model . AccessLevel ( ctx , issue . Poster , issue . Repo )
2019-10-28 10:11:50 +08:00
var err error
if issue . IsPull {
2022-11-19 09:12:33 +01:00
if err = issue . LoadPullRequest ( ctx ) ; err != nil {
2019-10-28 10:11:50 +08:00
log . Error ( "LoadPullRequest failed: %v" , err )
return
}
issue . PullRequest . Issue = issue
2023-01-01 16:23:15 +01:00
err = PrepareWebhooks ( ctx , EventSource { Repository : issue . Repo } , webhook_module . HookEventPullRequest , & api . PullRequestPayload {
2019-10-28 10:11:50 +08:00
Action : api . HookIssueEdited ,
Index : issue . Index ,
Changes : & api . ChangesPayload {
Title : & api . ChangesFromPayload {
From : oldTitle ,
} ,
} ,
2022-01-19 23:26:57 +00:00
PullRequest : convert . ToAPIPullRequest ( ctx , issue . PullRequest , nil ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , issue . Repo , mode ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( doer , nil ) ,
2019-10-28 10:11:50 +08:00
} )
} else {
2023-01-01 16:23:15 +01:00
err = PrepareWebhooks ( ctx , EventSource { Repository : issue . Repo } , webhook_module . HookEventIssues , & api . IssuePayload {
2019-10-28 10:11:50 +08:00
Action : api . HookIssueEdited ,
Index : issue . Index ,
Changes : & api . ChangesPayload {
Title : & api . ChangesFromPayload {
From : oldTitle ,
} ,
} ,
2022-11-19 09:12:33 +01:00
Issue : convert . ToAPIIssue ( ctx , issue ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , issue . Repo , mode ) ,
2021-11-24 02:47:03 +00:00
Sender : convert . ToUser ( doer , nil ) ,
2019-10-28 10:11:50 +08:00
} )
}
if err != nil {
log . Error ( "PrepareWebhooks [is_pull: %v]: %v" , issue . IsPull , err )
}
}
2019-10-28 13:26:46 +08:00
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyIssueChangeStatus ( ctx context . Context , doer * user_model . User , issue * issues_model . Issue , actionComment * issues_model . Comment , isClosed bool ) {
mode , _ := access_model . AccessLevel ( ctx , issue . Poster , issue . Repo )
2019-10-28 13:26:46 +08:00
var err error
if issue . IsPull {
2022-11-19 09:12:33 +01:00
if err = issue . LoadPullRequest ( ctx ) ; err != nil {
2019-10-28 13:26:46 +08:00
log . Error ( "LoadPullRequest: %v" , err )
return
}
// Merge pull request calls issue.changeStatus so we need to handle separately.
apiPullRequest := & api . PullRequestPayload {
Index : issue . Index ,
2022-01-19 23:26:57 +00:00
PullRequest : convert . ToAPIPullRequest ( ctx , issue . PullRequest , nil ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , issue . Repo , mode ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( doer , nil ) ,
2019-10-28 13:26:46 +08:00
}
if isClosed {
apiPullRequest . Action = api . HookIssueClosed
} else {
apiPullRequest . Action = api . HookIssueReOpened
}
2023-01-01 16:23:15 +01:00
err = PrepareWebhooks ( ctx , EventSource { Repository : issue . Repo } , webhook_module . HookEventPullRequest , apiPullRequest )
2019-10-28 13:26:46 +08:00
} else {
apiIssue := & api . IssuePayload {
Index : issue . Index ,
2022-11-19 09:12:33 +01:00
Issue : convert . ToAPIIssue ( ctx , issue ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , issue . Repo , mode ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( doer , nil ) ,
2019-10-28 13:26:46 +08:00
}
if isClosed {
apiIssue . Action = api . HookIssueClosed
} else {
apiIssue . Action = api . HookIssueReOpened
}
2023-01-01 16:23:15 +01:00
err = PrepareWebhooks ( ctx , EventSource { Repository : issue . Repo } , webhook_module . HookEventIssues , apiIssue )
2019-10-28 13:26:46 +08:00
}
if err != nil {
log . Error ( "PrepareWebhooks [is_pull: %v, is_closed: %v]: %v" , issue . IsPull , isClosed , err )
}
}
2019-10-29 00:45:43 +08:00
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyNewIssue ( ctx context . Context , issue * issues_model . Issue , mentions [ ] * user_model . User ) {
if err := issue . LoadRepo ( ctx ) ; err != nil {
2019-11-04 04:59:09 +08:00
log . Error ( "issue.LoadRepo: %v" , err )
return
}
2022-11-19 09:12:33 +01:00
if err := issue . LoadPoster ( ctx ) ; err != nil {
2019-11-04 04:59:09 +08:00
log . Error ( "issue.LoadPoster: %v" , err )
return
}
2022-11-19 09:12:33 +01:00
mode , _ := access_model . AccessLevel ( ctx , issue . Poster , issue . Repo )
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : issue . Repo } , webhook_module . HookEventIssues , & api . IssuePayload {
2019-10-29 00:45:43 +08:00
Action : api . HookIssueOpened ,
Index : issue . Index ,
2022-11-19 09:12:33 +01:00
Issue : convert . ToAPIIssue ( ctx , issue ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , issue . Repo , mode ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( issue . Poster , nil ) ,
2019-10-29 00:45:43 +08:00
} ) ; err != nil {
log . Error ( "PrepareWebhooks: %v" , err )
}
}
2019-10-30 16:36:25 +08:00
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyNewPullRequest ( ctx context . Context , pull * issues_model . PullRequest , mentions [ ] * user_model . User ) {
if err := pull . LoadIssue ( ctx ) ; err != nil {
2019-11-04 04:59:09 +08:00
log . Error ( "pull.LoadIssue: %v" , err )
return
}
2022-04-08 17:11:15 +08:00
if err := pull . Issue . LoadRepo ( ctx ) ; err != nil {
2019-11-04 04:59:09 +08:00
log . Error ( "pull.Issue.LoadRepo: %v" , err )
return
}
2022-11-19 09:12:33 +01:00
if err := pull . Issue . LoadPoster ( ctx ) ; err != nil {
2019-11-04 04:59:09 +08:00
log . Error ( "pull.Issue.LoadPoster: %v" , err )
return
}
2022-11-19 09:12:33 +01:00
mode , _ := access_model . AccessLevel ( ctx , pull . Issue . Poster , pull . Issue . Repo )
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : pull . Issue . Repo } , webhook_module . HookEventPullRequest , & api . PullRequestPayload {
2019-11-04 04:59:09 +08:00
Action : api . HookIssueOpened ,
Index : pull . Issue . Index ,
2022-01-19 23:26:57 +00:00
PullRequest : convert . ToAPIPullRequest ( ctx , pull , nil ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , pull . Issue . Repo , mode ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( pull . Issue . Poster , nil ) ,
2019-11-04 04:59:09 +08:00
} ) ; err != nil {
log . Error ( "PrepareWebhooks: %v" , err )
}
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyIssueChangeContent ( ctx context . Context , doer * user_model . User , issue * issues_model . Issue , oldContent string ) {
2022-12-09 07:35:56 +01:00
if err := issue . LoadRepo ( ctx ) ; err != nil {
log . Error ( "LoadRepo: %v" , err )
return
}
2022-11-19 09:12:33 +01:00
mode , _ := access_model . AccessLevel ( ctx , issue . Poster , issue . Repo )
2019-10-30 16:36:25 +08:00
var err error
if issue . IsPull {
issue . PullRequest . Issue = issue
2023-01-01 16:23:15 +01:00
err = PrepareWebhooks ( ctx , EventSource { Repository : issue . Repo } , webhook_module . HookEventPullRequest , & api . PullRequestPayload {
2019-10-30 16:36:25 +08:00
Action : api . HookIssueEdited ,
Index : issue . Index ,
Changes : & api . ChangesPayload {
Body : & api . ChangesFromPayload {
From : oldContent ,
} ,
} ,
2022-01-19 23:26:57 +00:00
PullRequest : convert . ToAPIPullRequest ( ctx , issue . PullRequest , nil ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , issue . Repo , mode ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( doer , nil ) ,
2019-10-30 16:36:25 +08:00
} )
} else {
2023-01-01 16:23:15 +01:00
err = PrepareWebhooks ( ctx , EventSource { Repository : issue . Repo } , webhook_module . HookEventIssues , & api . IssuePayload {
2019-10-30 16:36:25 +08:00
Action : api . HookIssueEdited ,
Index : issue . Index ,
Changes : & api . ChangesPayload {
Body : & api . ChangesFromPayload {
From : oldContent ,
} ,
} ,
2022-11-19 09:12:33 +01:00
Issue : convert . ToAPIIssue ( ctx , issue ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , issue . Repo , mode ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( doer , nil ) ,
2019-10-30 16:36:25 +08:00
} )
}
if err != nil {
log . Error ( "PrepareWebhooks [is_pull: %v]: %v" , issue . IsPull , err )
}
}
2019-10-30 18:02:46 +08:00
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyUpdateComment ( ctx context . Context , doer * user_model . User , c * issues_model . Comment , oldContent string ) {
if err := c . LoadPoster ( ctx ) ; err != nil {
2019-10-30 18:02:46 +08:00
log . Error ( "LoadPoster: %v" , err )
return
}
2022-11-19 09:12:33 +01:00
if err := c . LoadIssue ( ctx ) ; err != nil {
2019-10-30 18:02:46 +08:00
log . Error ( "LoadIssue: %v" , err )
return
}
2022-11-19 09:12:33 +01:00
if err := c . Issue . LoadAttributes ( ctx ) ; err != nil {
2019-10-30 18:02:46 +08:00
log . Error ( "LoadAttributes: %v" , err )
return
}
2023-01-01 16:23:15 +01:00
var eventType webhook_module . HookEventType
2020-03-05 23:10:48 -06:00
if c . Issue . IsPull {
2023-01-01 16:23:15 +01:00
eventType = webhook_module . HookEventPullRequestComment
2020-03-05 23:10:48 -06:00
} else {
2023-01-01 16:23:15 +01:00
eventType = webhook_module . HookEventIssueComment
2020-03-05 23:10:48 -06:00
}
2022-11-19 09:12:33 +01:00
mode , _ := access_model . AccessLevel ( ctx , doer , c . Issue . Repo )
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : c . Issue . Repo } , eventType , & api . IssueCommentPayload {
2022-10-21 18:21:56 +02:00
Action : api . HookIssueCommentEdited ,
2022-11-19 09:12:33 +01:00
Issue : convert . ToAPIIssue ( ctx , c . Issue ) ,
2022-10-21 18:21:56 +02:00
Comment : convert . ToComment ( c ) ,
Changes : & api . ChangesPayload {
Body : & api . ChangesFromPayload {
From : oldContent ,
} ,
} ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , c . Issue . Repo , mode ) ,
2022-10-21 18:21:56 +02:00
Sender : convert . ToUser ( doer , nil ) ,
IsPull : c . Issue . IsPull ,
} ) ; err != nil {
2019-10-30 18:02:46 +08:00
log . Error ( "PrepareWebhooks [comment_id: %d]: %v" , c . ID , err )
}
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyCreateIssueComment ( ctx context . Context , doer * user_model . User , repo * repo_model . Repository ,
2022-06-13 17:37:59 +08:00
issue * issues_model . Issue , comment * issues_model . Comment , mentions [ ] * user_model . User ,
2022-02-23 21:16:07 +01:00
) {
2023-01-01 16:23:15 +01:00
var eventType webhook_module . HookEventType
2020-03-05 23:10:48 -06:00
if issue . IsPull {
2023-01-01 16:23:15 +01:00
eventType = webhook_module . HookEventPullRequestComment
2020-03-05 23:10:48 -06:00
} else {
2023-01-01 16:23:15 +01:00
eventType = webhook_module . HookEventIssueComment
2020-03-05 23:10:48 -06:00
}
2022-11-19 09:12:33 +01:00
mode , _ := access_model . AccessLevel ( ctx , doer , repo )
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : issue . Repo } , eventType , & api . IssueCommentPayload {
2022-10-21 18:21:56 +02:00
Action : api . HookIssueCommentCreated ,
2022-11-19 09:12:33 +01:00
Issue : convert . ToAPIIssue ( ctx , issue ) ,
2022-10-21 18:21:56 +02:00
Comment : convert . ToComment ( comment ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , repo , mode ) ,
2022-10-21 18:21:56 +02:00
Sender : convert . ToUser ( doer , nil ) ,
IsPull : issue . IsPull ,
} ) ; err != nil {
2019-10-30 18:02:46 +08:00
log . Error ( "PrepareWebhooks [comment_id: %d]: %v" , comment . ID , err )
}
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyDeleteComment ( ctx context . Context , doer * user_model . User , comment * issues_model . Comment ) {
2020-03-05 23:10:48 -06:00
var err error
2022-11-19 09:12:33 +01:00
if err = comment . LoadPoster ( ctx ) ; err != nil {
2019-10-30 18:02:46 +08:00
log . Error ( "LoadPoster: %v" , err )
return
}
2022-11-19 09:12:33 +01:00
if err = comment . LoadIssue ( ctx ) ; err != nil {
2019-10-30 18:02:46 +08:00
log . Error ( "LoadIssue: %v" , err )
return
}
2022-11-19 09:12:33 +01:00
if err = comment . Issue . LoadAttributes ( ctx ) ; err != nil {
2019-10-30 18:02:46 +08:00
log . Error ( "LoadAttributes: %v" , err )
return
}
2023-01-01 16:23:15 +01:00
var eventType webhook_module . HookEventType
2020-03-05 23:10:48 -06:00
if comment . Issue . IsPull {
2023-01-01 16:23:15 +01:00
eventType = webhook_module . HookEventPullRequestComment
2020-03-05 23:10:48 -06:00
} else {
2023-01-01 16:23:15 +01:00
eventType = webhook_module . HookEventIssueComment
2020-03-05 23:10:48 -06:00
}
2022-11-19 09:12:33 +01:00
mode , _ := access_model . AccessLevel ( ctx , doer , comment . Issue . Repo )
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : comment . Issue . Repo } , eventType , & api . IssueCommentPayload {
2022-10-21 18:21:56 +02:00
Action : api . HookIssueCommentDeleted ,
2022-11-19 09:12:33 +01:00
Issue : convert . ToAPIIssue ( ctx , comment . Issue ) ,
2022-10-21 18:21:56 +02:00
Comment : convert . ToComment ( comment ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , comment . Issue . Repo , mode ) ,
2022-10-21 18:21:56 +02:00
Sender : convert . ToUser ( doer , nil ) ,
IsPull : comment . Issue . IsPull ,
} ) ; err != nil {
2019-10-30 18:02:46 +08:00
log . Error ( "PrepareWebhooks [comment_id: %d]: %v" , comment . ID , err )
}
}
2019-11-02 09:49:57 +08:00
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyNewWikiPage ( ctx context . Context , doer * user_model . User , repo * repo_model . Repository , page , comment string ) {
2022-09-04 21:54:23 +02:00
// Add to hook queue for created wiki page.
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : repo } , webhook_module . HookEventWiki , & api . WikiPayload {
2022-09-04 21:54:23 +02:00
Action : api . HookWikiCreated ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , repo , perm . AccessModeOwner ) ,
2022-09-04 21:54:23 +02:00
Sender : convert . ToUser ( doer , nil ) ,
Page : page ,
Comment : comment ,
} ) ; err != nil {
log . Error ( "PrepareWebhooks [repo_id: %d]: %v" , repo . ID , err )
}
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyEditWikiPage ( ctx context . Context , doer * user_model . User , repo * repo_model . Repository , page , comment string ) {
2022-09-04 21:54:23 +02:00
// Add to hook queue for edit wiki page.
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : repo } , webhook_module . HookEventWiki , & api . WikiPayload {
2022-09-04 21:54:23 +02:00
Action : api . HookWikiEdited ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , repo , perm . AccessModeOwner ) ,
2022-09-04 21:54:23 +02:00
Sender : convert . ToUser ( doer , nil ) ,
Page : page ,
Comment : comment ,
} ) ; err != nil {
log . Error ( "PrepareWebhooks [repo_id: %d]: %v" , repo . ID , err )
}
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyDeleteWikiPage ( ctx context . Context , doer * user_model . User , repo * repo_model . Repository , page string ) {
2022-09-04 21:54:23 +02:00
// Add to hook queue for edit wiki page.
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : repo } , webhook_module . HookEventWiki , & api . WikiPayload {
2022-09-04 21:54:23 +02:00
Action : api . HookWikiDeleted ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , repo , perm . AccessModeOwner ) ,
2022-09-04 21:54:23 +02:00
Sender : convert . ToUser ( doer , nil ) ,
Page : page ,
} ) ; err != nil {
log . Error ( "PrepareWebhooks [repo_id: %d]: %v" , repo . ID , err )
}
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyIssueChangeLabels ( ctx context . Context , doer * user_model . User , issue * issues_model . Issue ,
2022-06-13 17:37:59 +08:00
addedLabels , removedLabels [ ] * issues_model . Label ,
2022-02-23 21:16:07 +01:00
) {
2019-11-02 09:49:57 +08:00
var err error
2022-04-08 17:11:15 +08:00
if err = issue . LoadRepo ( ctx ) ; err != nil {
2019-11-02 09:49:57 +08:00
log . Error ( "LoadRepo: %v" , err )
return
}
2022-11-19 09:12:33 +01:00
if err = issue . LoadPoster ( ctx ) ; err != nil {
2019-11-02 09:49:57 +08:00
log . Error ( "LoadPoster: %v" , err )
return
}
2022-11-19 09:12:33 +01:00
mode , _ := access_model . AccessLevel ( ctx , issue . Poster , issue . Repo )
2019-11-02 09:49:57 +08:00
if issue . IsPull {
2022-11-19 09:12:33 +01:00
if err = issue . LoadPullRequest ( ctx ) ; err != nil {
2019-11-02 09:49:57 +08:00
log . Error ( "loadPullRequest: %v" , err )
return
}
2022-11-19 09:12:33 +01:00
if err = issue . PullRequest . LoadIssue ( ctx ) ; err != nil {
2019-11-02 09:49:57 +08:00
log . Error ( "LoadIssue: %v" , err )
return
}
2023-01-01 16:23:15 +01:00
err = PrepareWebhooks ( ctx , EventSource { Repository : issue . Repo } , webhook_module . HookEventPullRequestLabel , & api . PullRequestPayload {
2019-11-02 09:49:57 +08:00
Action : api . HookIssueLabelUpdated ,
Index : issue . Index ,
2022-01-19 23:26:57 +00:00
PullRequest : convert . ToAPIPullRequest ( ctx , issue . PullRequest , nil ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , issue . Repo , perm . AccessModeNone ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( doer , nil ) ,
2019-11-02 09:49:57 +08:00
} )
} else {
2023-01-01 16:23:15 +01:00
err = PrepareWebhooks ( ctx , EventSource { Repository : issue . Repo } , webhook_module . HookEventIssueLabel , & api . IssuePayload {
2019-11-02 09:49:57 +08:00
Action : api . HookIssueLabelUpdated ,
Index : issue . Index ,
2022-11-19 09:12:33 +01:00
Issue : convert . ToAPIIssue ( ctx , issue ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , issue . Repo , mode ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( doer , nil ) ,
2019-11-02 09:49:57 +08:00
} )
}
if err != nil {
log . Error ( "PrepareWebhooks [is_pull: %v]: %v" , issue . IsPull , err )
}
}
2019-11-02 11:33:20 +08:00
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyIssueChangeMilestone ( ctx context . Context , doer * user_model . User , issue * issues_model . Issue , oldMilestoneID int64 ) {
2019-11-02 11:33:20 +08:00
var hookAction api . HookIssueAction
var err error
if issue . MilestoneID > 0 {
hookAction = api . HookIssueMilestoned
} else {
hookAction = api . HookIssueDemilestoned
}
2022-11-19 09:12:33 +01:00
if err = issue . LoadAttributes ( ctx ) ; err != nil {
2019-11-02 11:33:20 +08:00
log . Error ( "issue.LoadAttributes failed: %v" , err )
return
}
2022-11-19 09:12:33 +01:00
mode , _ := access_model . AccessLevel ( ctx , doer , issue . Repo )
2019-11-02 11:33:20 +08:00
if issue . IsPull {
2022-11-19 09:12:33 +01:00
err = issue . PullRequest . LoadIssue ( ctx )
2019-11-02 11:33:20 +08:00
if err != nil {
log . Error ( "LoadIssue: %v" , err )
return
}
2023-01-01 16:23:15 +01:00
err = PrepareWebhooks ( ctx , EventSource { Repository : issue . Repo } , webhook_module . HookEventPullRequestMilestone , & api . PullRequestPayload {
2019-11-02 11:33:20 +08:00
Action : hookAction ,
Index : issue . Index ,
2022-01-19 23:26:57 +00:00
PullRequest : convert . ToAPIPullRequest ( ctx , issue . PullRequest , nil ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , issue . Repo , mode ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( doer , nil ) ,
2019-11-02 11:33:20 +08:00
} )
} else {
2023-01-01 16:23:15 +01:00
err = PrepareWebhooks ( ctx , EventSource { Repository : issue . Repo } , webhook_module . HookEventIssueMilestone , & api . IssuePayload {
2019-11-02 11:33:20 +08:00
Action : hookAction ,
Index : issue . Index ,
2022-11-19 09:12:33 +01:00
Issue : convert . ToAPIIssue ( ctx , issue ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , issue . Repo , mode ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( doer , nil ) ,
2019-11-02 11:33:20 +08:00
} )
}
if err != nil {
log . Error ( "PrepareWebhooks [is_pull: %v]: %v" , issue . IsPull , err )
}
}
2019-11-03 14:59:26 +08:00
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyPushCommits ( ctx context . Context , pusher * user_model . User , repo * repo_model . Repository , opts * repository . PushUpdateOptions , commits * repository . PushCommits ) {
2021-03-27 17:45:26 +01:00
apiPusher := convert . ToUser ( pusher , nil )
2022-01-19 23:26:57 +00:00
apiCommits , apiHeadCommit , err := commits . ToAPIPayloadCommits ( ctx , repo . RepoPath ( ) , repo . HTMLURL ( ) )
2019-11-03 14:59:26 +08:00
if err != nil {
log . Error ( "commits.ToAPIPayloadCommits failed: %v" , err )
return
}
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : repo } , webhook_module . HookEventPush , & api . PushPayload {
2022-10-16 18:22:34 +02:00
Ref : opts . RefFullName ,
Before : opts . OldCommitID ,
After : opts . NewCommitID ,
CompareURL : setting . AppURL + commits . CompareURL ,
Commits : apiCommits ,
TotalCommits : commits . Len ,
HeadCommit : apiHeadCommit ,
2022-12-03 10:48:26 +08:00
Repo : convert . ToRepo ( ctx , repo , perm . AccessModeOwner ) ,
2022-10-16 18:22:34 +02:00
Pusher : apiPusher ,
Sender : apiPusher ,
2019-11-03 14:59:26 +08:00
} ) ; err != nil {
log . Error ( "PrepareWebhooks: %v" , err )
}
}
2019-11-05 19:04:08 +08:00
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyAutoMergePullRequest ( ctx context . Context , doer * user_model . User , pr * issues_model . PullRequest ) {
2022-11-03 16:49:00 +01:00
// just redirect to the NotifyMergePullRequest
2022-11-19 09:12:33 +01:00
m . NotifyMergePullRequest ( ctx , doer , pr )
2022-11-03 16:49:00 +01:00
}
2022-11-19 09:12:33 +01:00
func ( * webhookNotifier ) NotifyMergePullRequest ( ctx context . Context , doer * user_model . User , pr * issues_model . PullRequest ) {
2019-11-22 01:08:42 +08:00
// Reload pull request information.
2022-11-19 09:12:33 +01:00
if err := pr . LoadAttributes ( ctx ) ; err != nil {
2019-11-22 01:08:42 +08:00
log . Error ( "LoadAttributes: %v" , err )
return
}
2022-11-19 09:12:33 +01:00
if err := pr . LoadIssue ( ctx ) ; err != nil {
log . Error ( "LoadIssue: %v" , err )
2019-11-22 01:08:42 +08:00
return
}
2022-04-08 17:11:15 +08:00
if err := pr . Issue . LoadRepo ( ctx ) ; err != nil {
2019-11-22 01:08:42 +08:00
log . Error ( "pr.Issue.LoadRepo: %v" , err )
return
}
2022-11-19 09:12:33 +01:00
mode , err := access_model . AccessLevel ( ctx , doer , pr . Issue . Repo )
2019-11-22 01:08:42 +08:00
if err != nil {
log . Error ( "models.AccessLevel: %v" , err )
return
}
// Merge pull request calls issue.changeStatus so we need to handle separately.
apiPullRequest := & api . PullRequestPayload {
Index : pr . Issue . Index ,
2022-01-19 23:26:57 +00:00
PullRequest : convert . ToAPIPullRequest ( ctx , pr , nil ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , pr . Issue . Repo , mode ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( doer , nil ) ,
2019-11-22 01:08:42 +08:00
Action : api . HookIssueClosed ,
}
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : pr . Issue . Repo } , webhook_module . HookEventPullRequest , apiPullRequest ) ; err != nil {
2019-11-22 01:08:42 +08:00
log . Error ( "PrepareWebhooks: %v" , err )
}
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyPullRequestChangeTargetBranch ( ctx context . Context , doer * user_model . User , pr * issues_model . PullRequest , oldBranch string ) {
if err := pr . LoadIssue ( ctx ) ; err != nil {
log . Error ( "LoadIssue: %v" , err )
2019-12-16 07:20:25 +01:00
return
}
2022-11-19 09:12:33 +01:00
issue := pr . Issue
mode , _ := access_model . AccessLevel ( ctx , issue . Poster , issue . Repo )
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : issue . Repo } , webhook_module . HookEventPullRequest , & api . PullRequestPayload {
2019-12-16 07:20:25 +01:00
Action : api . HookIssueEdited ,
Index : issue . Index ,
Changes : & api . ChangesPayload {
Ref : & api . ChangesFromPayload {
From : oldBranch ,
} ,
} ,
2022-11-19 09:12:33 +01:00
PullRequest : convert . ToAPIPullRequest ( ctx , pr , nil ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , issue . Repo , mode ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( doer , nil ) ,
2022-11-19 09:12:33 +01:00
} ) ; err != nil {
log . Error ( "PrepareWebhooks [pr: %d]: %v" , pr . ID , err )
2019-12-16 07:20:25 +01:00
}
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyPullRequestReview ( ctx context . Context , pr * issues_model . PullRequest , review * issues_model . Review , comment * issues_model . Comment , mentions [ ] * user_model . User ) {
2023-01-01 16:23:15 +01:00
var reviewHookType webhook_module . HookEventType
2019-11-05 19:04:08 +08:00
switch review . Type {
2022-06-13 17:37:59 +08:00
case issues_model . ReviewTypeApprove :
2023-01-01 16:23:15 +01:00
reviewHookType = webhook_module . HookEventPullRequestReviewApproved
2022-06-13 17:37:59 +08:00
case issues_model . ReviewTypeComment :
2023-01-01 16:23:15 +01:00
reviewHookType = webhook_module . HookEventPullRequestComment
2022-06-13 17:37:59 +08:00
case issues_model . ReviewTypeReject :
2023-01-01 16:23:15 +01:00
reviewHookType = webhook_module . HookEventPullRequestReviewRejected
2019-11-05 19:04:08 +08:00
default :
// unsupported review webhook type here
log . Error ( "Unsupported review webhook type" )
return
}
2022-11-19 09:12:33 +01:00
if err := pr . LoadIssue ( ctx ) ; err != nil {
log . Error ( "LoadIssue: %v" , err )
2019-11-05 19:04:08 +08:00
return
}
2022-11-19 09:12:33 +01:00
mode , err := access_model . AccessLevel ( ctx , review . Issue . Poster , review . Issue . Repo )
2019-11-05 19:04:08 +08:00
if err != nil {
log . Error ( "models.AccessLevel: %v" , err )
return
}
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : review . Issue . Repo } , reviewHookType , & api . PullRequestPayload {
2020-03-05 23:10:48 -06:00
Action : api . HookIssueReviewed ,
2019-11-05 19:04:08 +08:00
Index : review . Issue . Index ,
2022-01-19 23:26:57 +00:00
PullRequest : convert . ToAPIPullRequest ( ctx , pr , nil ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , review . Issue . Repo , mode ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( review . Reviewer , nil ) ,
2019-11-05 19:04:08 +08:00
Review : & api . ReviewPayload {
Type : string ( reviewHookType ) ,
Content : review . Content ,
} ,
} ) ; err != nil {
log . Error ( "PrepareWebhooks: %v" , err )
}
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyCreateRef ( ctx context . Context , pusher * user_model . User , repo * repo_model . Repository , refType , refFullName , refID string ) {
2021-03-27 17:45:26 +01:00
apiPusher := convert . ToUser ( pusher , nil )
2022-12-03 10:48:26 +08:00
apiRepo := convert . ToRepo ( ctx , repo , perm . AccessModeNone )
2019-11-06 14:43:03 +08:00
refName := git . RefEndName ( refFullName )
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : repo } , webhook_module . HookEventCreate , & api . CreatePayload {
2019-11-06 14:43:03 +08:00
Ref : refName ,
2022-01-19 23:26:57 +00:00
Sha : refID ,
2019-11-06 14:43:03 +08:00
RefType : refType ,
Repo : apiRepo ,
Sender : apiPusher ,
} ) ; err != nil {
log . Error ( "PrepareWebhooks: %v" , err )
}
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyPullRequestSynchronized ( ctx context . Context , doer * user_model . User , pr * issues_model . PullRequest ) {
if err := pr . LoadIssue ( ctx ) ; err != nil {
log . Error ( "LoadIssue: %v" , err )
2019-11-05 19:04:08 +08:00
return
}
2022-11-19 09:12:33 +01:00
if err := pr . Issue . LoadAttributes ( ctx ) ; err != nil {
2019-11-05 19:04:08 +08:00
log . Error ( "LoadAttributes: %v" , err )
return
}
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : pr . Issue . Repo } , webhook_module . HookEventPullRequestSync , & api . PullRequestPayload {
2019-11-05 19:04:08 +08:00
Action : api . HookIssueSynchronized ,
Index : pr . Issue . Index ,
2022-01-19 23:26:57 +00:00
PullRequest : convert . ToAPIPullRequest ( ctx , pr , nil ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , pr . Issue . Repo , perm . AccessModeNone ) ,
2021-03-27 17:45:26 +01:00
Sender : convert . ToUser ( doer , nil ) ,
2019-11-05 19:04:08 +08:00
} ) ; err != nil {
log . Error ( "PrepareWebhooks [pull_id: %v]: %v" , pr . ID , err )
}
}
2019-11-06 14:43:03 +08:00
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyDeleteRef ( ctx context . Context , pusher * user_model . User , repo * repo_model . Repository , refType , refFullName string ) {
2021-03-27 17:45:26 +01:00
apiPusher := convert . ToUser ( pusher , nil )
2022-12-03 10:48:26 +08:00
apiRepo := convert . ToRepo ( ctx , repo , perm . AccessModeNone )
2019-11-06 14:43:03 +08:00
refName := git . RefEndName ( refFullName )
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : repo } , webhook_module . HookEventDelete , & api . DeletePayload {
2019-11-06 14:43:03 +08:00
Ref : refName ,
2020-02-24 02:49:40 +08:00
RefType : refType ,
2019-11-06 14:43:03 +08:00
PusherType : api . PusherTypeUser ,
Repo : apiRepo ,
Sender : apiPusher ,
} ) ; err != nil {
2020-02-24 02:49:40 +08:00
log . Error ( "PrepareWebhooks.(delete %s): %v" , refType , err )
2019-11-06 14:43:03 +08:00
}
}
2019-11-06 16:25:50 +08:00
2022-11-19 09:12:33 +01:00
func sendReleaseHook ( ctx context . Context , doer * user_model . User , rel * repo_model . Release , action api . HookReleaseAction ) {
if err := rel . LoadAttributes ( ctx ) ; err != nil {
2019-11-06 16:25:50 +08:00
log . Error ( "LoadAttributes: %v" , err )
return
}
2022-11-19 09:12:33 +01:00
mode , _ := access_model . AccessLevel ( ctx , doer , rel . Repo )
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : rel . Repo } , webhook_module . HookEventRelease , & api . ReleasePayload {
2019-11-06 16:25:50 +08:00
Action : action ,
2020-10-17 06:23:08 +02:00
Release : convert . ToRelease ( rel ) ,
2022-12-03 10:48:26 +08:00
Repository : convert . ToRepo ( ctx , rel . Repo , mode ) ,
2021-11-25 04:17:16 +00:00
Sender : convert . ToUser ( doer , nil ) ,
2019-11-06 16:25:50 +08:00
} ) ; err != nil {
log . Error ( "PrepareWebhooks: %v" , err )
}
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyNewRelease ( ctx context . Context , rel * repo_model . Release ) {
sendReleaseHook ( ctx , rel . Publisher , rel , api . HookReleasePublished )
2019-11-06 16:25:50 +08:00
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyUpdateRelease ( ctx context . Context , doer * user_model . User , rel * repo_model . Release ) {
sendReleaseHook ( ctx , doer , rel , api . HookReleaseUpdated )
2019-11-06 16:25:50 +08:00
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyDeleteRelease ( ctx context . Context , doer * user_model . User , rel * repo_model . Release ) {
sendReleaseHook ( ctx , doer , rel , api . HookReleaseDeleted )
2019-11-06 16:25:50 +08:00
}
2019-11-24 13:16:59 +08:00
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifySyncPushCommits ( ctx context . Context , pusher * user_model . User , repo * repo_model . Repository , opts * repository . PushUpdateOptions , commits * repository . PushCommits ) {
2021-03-27 17:45:26 +01:00
apiPusher := convert . ToUser ( pusher , nil )
2022-01-19 23:26:57 +00:00
apiCommits , apiHeadCommit , err := commits . ToAPIPayloadCommits ( ctx , repo . RepoPath ( ) , repo . HTMLURL ( ) )
2019-11-24 13:16:59 +08:00
if err != nil {
log . Error ( "commits.ToAPIPayloadCommits failed: %v" , err )
return
}
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , EventSource { Repository : repo } , webhook_module . HookEventPush , & api . PushPayload {
2022-10-16 18:22:34 +02:00
Ref : opts . RefFullName ,
Before : opts . OldCommitID ,
After : opts . NewCommitID ,
CompareURL : setting . AppURL + commits . CompareURL ,
Commits : apiCommits ,
TotalCommits : commits . Len ,
HeadCommit : apiHeadCommit ,
2022-12-03 10:48:26 +08:00
Repo : convert . ToRepo ( ctx , repo , perm . AccessModeOwner ) ,
2022-10-16 18:22:34 +02:00
Pusher : apiPusher ,
Sender : apiPusher ,
2019-11-24 13:16:59 +08:00
} ) ; err != nil {
log . Error ( "PrepareWebhooks: %v" , err )
}
}
2020-11-14 03:12:33 +08:00
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifySyncCreateRef ( ctx context . Context , pusher * user_model . User , repo * repo_model . Repository , refType , refFullName , refID string ) {
m . NotifyCreateRef ( ctx , pusher , repo , refType , refFullName , refID )
2020-11-14 03:12:33 +08:00
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifySyncDeleteRef ( ctx context . Context , pusher * user_model . User , repo * repo_model . Repository , refType , refFullName string ) {
m . NotifyDeleteRef ( ctx , pusher , repo , refType , refFullName )
2020-11-14 03:12:33 +08:00
}
2022-03-30 10:42:47 +02:00
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyPackageCreate ( ctx context . Context , doer * user_model . User , pd * packages_model . PackageDescriptor ) {
notifyPackage ( ctx , doer , pd , api . HookPackageCreated )
2022-03-30 10:42:47 +02:00
}
2022-11-19 09:12:33 +01:00
func ( m * webhookNotifier ) NotifyPackageDelete ( ctx context . Context , doer * user_model . User , pd * packages_model . PackageDescriptor ) {
notifyPackage ( ctx , doer , pd , api . HookPackageDeleted )
2022-03-30 10:42:47 +02:00
}
2022-11-19 09:12:33 +01:00
func notifyPackage ( ctx context . Context , sender * user_model . User , pd * packages_model . PackageDescriptor , action api . HookPackageAction ) {
2023-01-01 16:23:15 +01:00
source := EventSource {
2022-10-21 18:21:56 +02:00
Repository : pd . Repository ,
Owner : pd . Owner ,
2022-03-30 10:42:47 +02:00
}
2022-05-07 18:21:15 +02:00
apiPackage , err := convert . ToPackage ( ctx , pd , sender )
if err != nil {
log . Error ( "Error converting package: %v" , err )
return
2022-03-30 10:42:47 +02:00
}
2023-01-01 16:23:15 +01:00
if err := PrepareWebhooks ( ctx , source , webhook_module . HookEventPackage , & api . PackagePayload {
2022-05-07 18:21:15 +02:00
Action : action ,
Package : apiPackage ,
Sender : convert . ToUser ( sender , nil ) ,
2022-03-30 10:42:47 +02:00
} ) ; err != nil {
log . Error ( "PrepareWebhooks: %v" , err )
}
}