summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
author谈笑风生间 <makonike@anyview.fun>2023-05-25 04:06:27 +0200
committerGitHub <noreply@github.com>2023-05-25 04:06:27 +0200
commit309354c70ee994a1e8f261d7bc24e7473e601d02 (patch)
tree89a96f611eef8b37e17dcead9767ff8d9ba976ef /services
parentUse file filters action instead of Github's files filter (#24877) (diff)
downloadforgejo-309354c70ee994a1e8f261d7bc24e7473e601d02.tar.xz
forgejo-309354c70ee994a1e8f261d7bc24e7473e601d02.zip
New webhook trigger for receiving Pull Request review requests (#24481)
close https://github.com/go-gitea/gitea/issues/16321 Provided a webhook trigger for requesting someone to review the Pull Request. Some modifications have been made to the returned `PullRequestPayload` based on the GitHub webhook settings, including: - add a description of the current reviewer object as `RequestedReviewer` . - setting the action to either **review_requested** or **review_request_removed** based on the operation. - adding the `RequestedReviewers` field to the issues_model.PullRequest. This field will be loaded into the PullRequest through `LoadRequestedReviewers()` when `ToAPIPullRequest` is called. After the Pull Request is merged, I will supplement the relevant documentation.
Diffstat (limited to 'services')
-rw-r--r--services/convert/pull.go8
-rw-r--r--services/forms/repo_form.go49
-rw-r--r--services/webhook/notifier.go28
-rw-r--r--services/webhook/payloader.go2
4 files changed, 62 insertions, 25 deletions
diff --git a/services/convert/pull.go b/services/convert/pull.go
index 4989e82cd4..598187ca6e 100644
--- a/services/convert/pull.go
+++ b/services/convert/pull.go
@@ -88,6 +88,14 @@ func ToAPIPullRequest(ctx context.Context, pr *issues_model.PullRequest, doer *u
},
}
+ if err = pr.LoadRequestedReviewers(ctx); err != nil {
+ log.Error("LoadRequestedReviewers[%d]: %v", pr.ID, err)
+ return nil
+ }
+ for _, reviewer := range pr.RequestedReviewers {
+ apiPullRequest.RequestedReviewers = append(apiPullRequest.RequestedReviewers, ToUser(ctx, reviewer, nil))
+ }
+
if pr.Issue.ClosedUnix != 0 {
apiPullRequest.Closed = pr.Issue.ClosedUnix.AsTimePtr()
}
diff --git a/services/forms/repo_form.go b/services/forms/repo_form.go
index cacfb64b17..8108a55f7a 100644
--- a/services/forms/repo_form.go
+++ b/services/forms/repo_form.go
@@ -228,30 +228,31 @@ func (f *ProtectBranchForm) Validate(req *http.Request, errs binding.Errors) bin
// WebhookForm form for changing web hook
type WebhookForm struct {
- Events string
- Create bool
- Delete bool
- Fork bool
- Issues bool
- IssueAssign bool
- IssueLabel bool
- IssueMilestone bool
- IssueComment bool
- Release bool
- Push bool
- PullRequest bool
- PullRequestAssign bool
- PullRequestLabel bool
- PullRequestMilestone bool
- PullRequestComment bool
- PullRequestReview bool
- PullRequestSync bool
- Wiki bool
- Repository bool
- Package bool
- Active bool
- BranchFilter string `binding:"GlobPattern"`
- AuthorizationHeader string
+ Events string
+ Create bool
+ Delete bool
+ Fork bool
+ Issues bool
+ IssueAssign bool
+ IssueLabel bool
+ IssueMilestone bool
+ IssueComment bool
+ Release bool
+ Push bool
+ PullRequest bool
+ PullRequestAssign bool
+ PullRequestLabel bool
+ PullRequestMilestone bool
+ PullRequestComment bool
+ PullRequestReview bool
+ PullRequestSync bool
+ PullRequestReviewRequest bool
+ Wiki bool
+ Repository bool
+ Package bool
+ Active bool
+ BranchFilter string `binding:"GlobPattern"`
+ AuthorizationHeader string
}
// PushOnly if the hook will be triggered when push
diff --git a/services/webhook/notifier.go b/services/webhook/notifier.go
index 1f7cb8d988..bd25e20805 100644
--- a/services/webhook/notifier.go
+++ b/services/webhook/notifier.go
@@ -719,6 +719,34 @@ func (m *webhookNotifier) NotifyPullRequestReview(ctx context.Context, pr *issue
}
}
+func (m *webhookNotifier) NotifyPullReviewRequest(ctx context.Context, doer *user_model.User, issue *issues_model.Issue, reviewer *user_model.User, isRequest bool, comment *issues_model.Comment) {
+ if !issue.IsPull {
+ log.Warn("NotifyPullReviewRequest: issue is not a pull request: %v", issue.ID)
+ return
+ }
+ mode, _ := access_model.AccessLevelUnit(ctx, doer, issue.Repo, unit.TypePullRequests)
+ if err := issue.LoadPullRequest(ctx); err != nil {
+ log.Error("LoadPullRequest failed: %v", err)
+ return
+ }
+ apiPullRequest := &api.PullRequestPayload{
+ Index: issue.Index,
+ PullRequest: convert.ToAPIPullRequest(ctx, issue.PullRequest, nil),
+ RequestedReviewer: convert.ToUser(ctx, reviewer, nil),
+ Repository: convert.ToRepo(ctx, issue.Repo, mode),
+ Sender: convert.ToUser(ctx, doer, nil),
+ }
+ if isRequest {
+ apiPullRequest.Action = api.HookIssueReviewRequested
+ } else {
+ apiPullRequest.Action = api.HookIssueReviewRequestRemoved
+ }
+ if err := PrepareWebhooks(ctx, EventSource{Repository: issue.Repo}, webhook_module.HookEventPullRequestReviewRequest, apiPullRequest); err != nil {
+ log.Error("PrepareWebhooks [review_requested: %v]: %v", isRequest, err)
+ return
+ }
+}
+
func (m *webhookNotifier) NotifyCreateRef(ctx context.Context, pusher *user_model.User, repo *repo_model.Repository, refType, refFullName, refID string) {
apiPusher := convert.ToUser(ctx, pusher, nil)
apiRepo := convert.ToRepo(ctx, repo, perm.AccessModeNone)
diff --git a/services/webhook/payloader.go b/services/webhook/payloader.go
index 9eff25628b..d53e65fa5e 100644
--- a/services/webhook/payloader.go
+++ b/services/webhook/payloader.go
@@ -43,7 +43,7 @@ func convertPayloader(s PayloadConvertor, p api.Payloader, event webhook_module.
case webhook_module.HookEventPush:
return s.Push(p.(*api.PushPayload))
case webhook_module.HookEventPullRequest, webhook_module.HookEventPullRequestAssign, webhook_module.HookEventPullRequestLabel,
- webhook_module.HookEventPullRequestMilestone, webhook_module.HookEventPullRequestSync:
+ webhook_module.HookEventPullRequestMilestone, webhook_module.HookEventPullRequestSync, webhook_module.HookEventPullRequestReviewRequest:
return s.PullRequest(p.(*api.PullRequestPayload))
case webhook_module.HookEventPullRequestReviewApproved, webhook_module.HookEventPullRequestReviewRejected, webhook_module.HookEventPullRequestReviewComment:
return s.Review(p.(*api.PullRequestPayload), event)