Skip to content

Commit 55c2397

Browse files
committed
Fix review request API
1 parent 44909f6 commit 55c2397

File tree

4 files changed

+114
-17
lines changed

4 files changed

+114
-17
lines changed

routers/api/v1/repo/pull_review.go

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,79 @@ func CreateReviewRequests(ctx *context.APIContext) {
611611
// "$ref": "#/responses/notFound"
612612

613613
opts := web.GetForm(ctx).(*api.PullReviewRequestOptions)
614-
apiReviewRequest(ctx, *opts, true)
614+
615+
pr, err := issues_model.GetPullRequestByIndex(ctx, ctx.Repo.Repository.ID, ctx.PathParamInt64(":index"))
616+
if err != nil {
617+
if issues_model.IsErrPullRequestNotExist(err) {
618+
ctx.NotFound("GetPullRequestByIndex", err)
619+
} else {
620+
ctx.Error(http.StatusInternalServerError, "GetPullRequestByIndex", err)
621+
}
622+
return
623+
}
624+
625+
allowedUsers, err := pull_service.GetReviewers(ctx, ctx.Repo.Repository, ctx.Doer.ID, pr.Issue.PosterID)
626+
if err != nil {
627+
ctx.Error(http.StatusInternalServerError, "GetReviewers", err)
628+
return
629+
}
630+
filteredUsers := make([]*user_model.User, 0, len(opts.Reviewers))
631+
for _, reviewer := range opts.Reviewers {
632+
for _, allowedUser := range allowedUsers {
633+
if allowedUser.Name == reviewer || allowedUser.Email == reviewer {
634+
filteredUsers = append(filteredUsers, allowedUser)
635+
break
636+
}
637+
}
638+
}
639+
640+
filteredTeams := make([]*organization.Team, 0, len(opts.TeamReviewers))
641+
if ctx.Repo.Repository.Owner.IsOrganization() && len(opts.TeamReviewers) > 0 {
642+
allowedTeams, err := pull_service.GetReviewerTeams(ctx, ctx.Repo.Repository)
643+
if err != nil {
644+
ctx.Error(http.StatusInternalServerError, "GetReviewers", err)
645+
return
646+
}
647+
for _, teamReviewer := range opts.TeamReviewers {
648+
for _, allowedTeam := range allowedTeams {
649+
if allowedTeam.Name == teamReviewer {
650+
filteredTeams = append(filteredTeams, allowedTeam)
651+
break
652+
}
653+
}
654+
}
655+
}
656+
comments, err := issue_service.ReviewRequests(ctx, pr, ctx.Doer, filteredUsers, filteredTeams)
657+
if err != nil {
658+
if issues_model.IsErrReviewRequestOnClosedPR(err) {
659+
ctx.Error(http.StatusForbidden, "", err)
660+
return
661+
}
662+
if issues_model.IsErrNotValidReviewRequest(err) {
663+
ctx.Error(http.StatusUnprocessableEntity, "", err)
664+
return
665+
}
666+
ctx.Error(http.StatusInternalServerError, "ReviewRequests", err)
667+
return
668+
}
669+
670+
reviews := make([]*issues_model.Review, 0, len(filteredUsers))
671+
for _, comment := range comments {
672+
if comment != nil {
673+
if err = comment.LoadReview(ctx); err != nil {
674+
ctx.ServerError("ReviewRequest", err)
675+
return
676+
}
677+
reviews = append(reviews, comment.Review)
678+
}
679+
}
680+
681+
apiReviews, err := convert.ToPullReviewList(ctx, reviews, ctx.Doer)
682+
if err != nil {
683+
ctx.Error(http.StatusInternalServerError, "convertToPullReviewList", err)
684+
return
685+
}
686+
ctx.JSON(http.StatusCreated, apiReviews)
615687
}
616688

617689
// DeleteReviewRequests delete review requests to an pull request
@@ -730,7 +802,7 @@ func apiReviewRequest(ctx *context.APIContext, opts api.PullReviewRequestOptions
730802
}
731803

732804
for _, reviewer := range reviewers {
733-
comment, err := issue_service.ReviewRequest(ctx, pr.Issue, ctx.Doer, &permDoer, reviewer, isAdd)
805+
comment, err := issue_service.ReviewRequest(ctx, pr, ctx.Doer, &permDoer, reviewer, isAdd)
734806
if err != nil {
735807
if issues_model.IsErrReviewRequestOnClosedPR(err) {
736808
ctx.Error(http.StatusForbidden, "", err)
@@ -755,7 +827,7 @@ func apiReviewRequest(ctx *context.APIContext, opts api.PullReviewRequestOptions
755827

756828
if ctx.Repo.Repository.Owner.IsOrganization() && len(opts.TeamReviewers) > 0 {
757829
for _, teamReviewer := range teamReviewers {
758-
comment, err := issue_service.TeamReviewRequest(ctx, pr.Issue, ctx.Doer, teamReviewer, isAdd)
830+
comment, err := issue_service.TeamReviewRequest(ctx, pr, ctx.Doer, teamReviewer, isAdd)
759831
if err != nil {
760832
if issues_model.IsErrReviewRequestOnClosedPR(err) {
761833
ctx.Error(http.StatusForbidden, "", err)

routers/web/repo/pull_review.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,10 @@ func UpdatePullReviewRequest(ctx *context.Context) {
365365
ctx.Status(http.StatusForbidden)
366366
return
367367
}
368+
if err := issue.LoadPullRequest(ctx); err != nil {
369+
ctx.ServerError("issue.LoadPullRequest", err)
370+
return
371+
}
368372
if reviewID < 0 {
369373
// negative reviewIDs represent team requests
370374
if err := issue.Repo.LoadOwner(ctx); err != nil {
@@ -395,7 +399,7 @@ func UpdatePullReviewRequest(ctx *context.Context) {
395399
return
396400
}
397401

398-
_, err = issue_service.TeamReviewRequest(ctx, issue, ctx.Doer, team, action == "attach")
402+
_, err = issue_service.TeamReviewRequest(ctx, issue.PullRequest, ctx.Doer, team, action == "attach")
399403
if err != nil {
400404
if issues_model.IsErrNotValidReviewRequest(err) {
401405
log.Warn(
@@ -427,7 +431,7 @@ func UpdatePullReviewRequest(ctx *context.Context) {
427431
return
428432
}
429433

430-
_, err = issue_service.ReviewRequest(ctx, issue, ctx.Doer, &ctx.Repo.Permission, reviewer, action == "attach")
434+
_, err = issue_service.ReviewRequest(ctx, issue.PullRequest, ctx.Doer, &ctx.Repo.Permission, reviewer, action == "attach")
431435
if err != nil {
432436
if issues_model.IsErrNotValidReviewRequest(err) {
433437
log.Warn(

services/issue/assignee.go

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88

99
issues_model "code.gitea.io/gitea/models/issues"
1010
"code.gitea.io/gitea/models/organization"
11+
org_model "code.gitea.io/gitea/models/organization"
1112
"code.gitea.io/gitea/models/perm"
1213
access_model "code.gitea.io/gitea/models/perm/access"
1314
repo_model "code.gitea.io/gitea/models/repo"
@@ -61,29 +62,49 @@ func ToggleAssigneeWithNotify(ctx context.Context, issue *issues_model.Issue, do
6162
}
6263

6364
// ReviewRequest add or remove a review request from a user for this PR, and make comment for it.
64-
func ReviewRequest(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, permDoer *access_model.Permission, reviewer *user_model.User, isAdd bool) (comment *issues_model.Comment, err error) {
65-
err = isValidReviewRequest(ctx, reviewer, doer, isAdd, issue, permDoer)
65+
func ReviewRequest(ctx context.Context, pr *issues_model.PullRequest, doer *user_model.User, permDoer *access_model.Permission, reviewer *user_model.User, isAdd bool) (comment *issues_model.Comment, err error) {
66+
err = isValidReviewRequest(ctx, reviewer, doer, isAdd, pr.Issue, permDoer)
6667
if err != nil {
6768
return nil, err
6869
}
6970

7071
if isAdd {
71-
comment, err = issues_model.AddReviewRequest(ctx, issue, reviewer, doer)
72+
comment, err = issues_model.AddReviewRequest(ctx, pr.Issue, reviewer, doer)
7273
} else {
73-
comment, err = issues_model.RemoveReviewRequest(ctx, issue, reviewer, doer)
74+
comment, err = issues_model.RemoveReviewRequest(ctx, pr.Issue, reviewer, doer)
7475
}
7576

7677
if err != nil {
7778
return nil, err
7879
}
7980

8081
if comment != nil {
81-
notify_service.PullRequestReviewRequest(ctx, doer, issue, reviewer, isAdd, comment)
82+
notify_service.PullRequestReviewRequest(ctx, doer, pr.Issue, reviewer, isAdd, comment)
8283
}
8384

8485
return comment, err
8586
}
8687

88+
func ReviewRequests(ctx context.Context, pr *issues_model.PullRequest, doer *user_model.User, reviewers []*user_model.User, reviewTeams []*org_model.Team) (comments []*issues_model.Comment, err error) {
89+
for _, reviewer := range reviewers {
90+
comment, err := ReviewRequest(ctx, pr, doer, nil, reviewer, true)
91+
if err != nil {
92+
return nil, err
93+
}
94+
comments = append(comments, comment)
95+
}
96+
97+
for _, reviewTeam := range reviewTeams {
98+
comment, err := TeamReviewRequest(ctx, pr, doer, reviewTeam, true)
99+
if err != nil {
100+
return nil, err
101+
}
102+
comments = append(comments, comment)
103+
}
104+
105+
return comments, nil
106+
}
107+
87108
// isValidReviewRequest Check permission for ReviewRequest
88109
func isValidReviewRequest(ctx context.Context, reviewer, doer *user_model.User, isAdd bool, issue *issues_model.Issue, permDoer *access_model.Permission) error {
89110
if reviewer.IsOrganization() {
@@ -216,15 +237,15 @@ func isValidTeamReviewRequest(ctx context.Context, reviewer *organization.Team,
216237
}
217238

218239
// TeamReviewRequest add or remove a review request from a team for this PR, and make comment for it.
219-
func TeamReviewRequest(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, reviewer *organization.Team, isAdd bool) (comment *issues_model.Comment, err error) {
220-
err = isValidTeamReviewRequest(ctx, reviewer, doer, isAdd, issue)
240+
func TeamReviewRequest(ctx context.Context, pr *issues_model.PullRequest, doer *user_model.User, reviewer *organization.Team, isAdd bool) (comment *issues_model.Comment, err error) {
241+
err = isValidTeamReviewRequest(ctx, reviewer, doer, isAdd, pr.Issue)
221242
if err != nil {
222243
return nil, err
223244
}
224245
if isAdd {
225-
comment, err = issues_model.AddTeamReviewRequest(ctx, issue, reviewer, doer)
246+
comment, err = issues_model.AddTeamReviewRequest(ctx, pr.Issue, reviewer, doer)
226247
} else {
227-
comment, err = issues_model.RemoveTeamReviewRequest(ctx, issue, reviewer, doer)
248+
comment, err = issues_model.RemoveTeamReviewRequest(ctx, pr.Issue, reviewer, doer)
228249
}
229250

230251
if err != nil {
@@ -235,7 +256,7 @@ func TeamReviewRequest(ctx context.Context, issue *issues_model.Issue, doer *use
235256
return nil, nil
236257
}
237258

238-
return comment, teamReviewRequestNotify(ctx, issue, doer, reviewer, isAdd, comment)
259+
return comment, teamReviewRequestNotify(ctx, pr.Issue, doer, reviewer, isAdd, comment)
239260
}
240261

241262
func ReviewRequestNotify(ctx context.Context, issue *issues_model.Issue, doer *user_model.User, reviewNotifiers []*ReviewRequestNotifier) {

services/pull/pull.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,12 +212,12 @@ func NewPullRequest(ctx context.Context, opts *NewPullRequestOptions) error {
212212
}
213213
permDoer, err := access_model.GetUserRepoPermission(ctx, repo, issue.Poster)
214214
for _, reviewer := range opts.Reviewers {
215-
if _, err = issue_service.ReviewRequest(ctx, pr.Issue, issue.Poster, &permDoer, reviewer, true); err != nil {
215+
if _, err = issue_service.ReviewRequest(ctx, pr, issue.Poster, &permDoer, reviewer, true); err != nil {
216216
return err
217217
}
218218
}
219219
for _, teamReviewer := range opts.TeamReviewers {
220-
if _, err = issue_service.TeamReviewRequest(ctx, pr.Issue, issue.Poster, teamReviewer, true); err != nil {
220+
if _, err = issue_service.TeamReviewRequest(ctx, pr, issue.Poster, teamReviewer, true); err != nil {
221221
return err
222222
}
223223
}

0 commit comments

Comments
 (0)