diff options
author | 谈笑风生间 <makonike@anyview.fun> | 2023-05-25 04:06:27 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-25 04:06:27 +0200 |
commit | 309354c70ee994a1e8f261d7bc24e7473e601d02 (patch) | |
tree | 89a96f611eef8b37e17dcead9767ff8d9ba976ef /services | |
parent | Use file filters action instead of Github's files filter (#24877) (diff) | |
download | forgejo-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.go | 8 | ||||
-rw-r--r-- | services/forms/repo_form.go | 49 | ||||
-rw-r--r-- | services/webhook/notifier.go | 28 | ||||
-rw-r--r-- | services/webhook/payloader.go | 2 |
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) |