Skip to content

Commit b6a8a65

Browse files
committed
Add request review check and move to database transaction
1 parent 38ace76 commit b6a8a65

File tree

2 files changed

+70
-13
lines changed

2 files changed

+70
-13
lines changed

models/issues/review.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ func (err ErrReviewNotExist) Unwrap() error {
4646
type ErrNotValidReviewRequest struct {
4747
Reason string
4848
UserID int64
49+
TeamID int64
4950
RepoID int64
5051
}
5152

@@ -56,9 +57,10 @@ func IsErrNotValidReviewRequest(err error) bool {
5657
}
5758

5859
func (err ErrNotValidReviewRequest) Error() string {
59-
return fmt.Sprintf("%s [user_id: %d, repo_id: %d]",
60+
return fmt.Sprintf("%s [user_id: %d, team_id: %d, repo_id: %d]",
6061
err.Reason,
6162
err.UserID,
63+
err.TeamID,
6264
err.RepoID)
6365
}
6466

services/pull/pull.go

Lines changed: 67 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,46 @@ func NewPullRequest(ctx context.Context, opts *NewPullRequestOptions) error {
6464
return user_model.ErrBlockedUser
6565
}
6666

67+
// check if reviewers are valid
68+
if len(opts.Reviewers) > 0 {
69+
allowedUsers, err := GetReviewers(ctx, repo, pr.Issue.PosterID, pr.Issue.PosterID)
70+
if err != nil {
71+
return err
72+
}
73+
for _, reviewer := range opts.Reviewers {
74+
var found bool
75+
for _, allowedUser := range allowedUsers {
76+
if allowedUser.ID == reviewer.ID {
77+
found = true
78+
break
79+
}
80+
}
81+
if !found {
82+
return issues_model.ErrNotValidReviewRequest{UserID: reviewer.ID}
83+
}
84+
}
85+
}
86+
87+
// check if team reviewers are valid
88+
if len(opts.TeamReviewers) > 0 {
89+
allowedTeams, err := GetReviewerTeams(ctx, repo)
90+
if err != nil {
91+
return err
92+
}
93+
for _, teamReviewer := range opts.TeamReviewers {
94+
var found bool
95+
for _, allowedTeam := range allowedTeams {
96+
if allowedTeam.ID == teamReviewer.ID {
97+
found = true
98+
break
99+
}
100+
}
101+
if !found {
102+
return issues_model.ErrNotValidReviewRequest{TeamID: teamReviewer.ID}
103+
}
104+
}
105+
}
106+
67107
// user should be a collaborator or a member of the organization for base repo
68108
canCreate := issue.Poster.IsAdmin || pr.Flow == issues_model.PullRequestFlowAGit
69109
if !canCreate {
@@ -175,7 +215,32 @@ func NewPullRequest(ctx context.Context, opts *NewPullRequestOptions) error {
175215
return err
176216
}
177217

178-
if !pr.IsWorkInProgress(ctx) {
218+
// if there are reviewers or review teams, we don't need to request code owners review
219+
if len(opts.Reviewers)+len(opts.TeamReviewers) > 0 {
220+
for _, reviewer := range opts.Reviewers {
221+
comment, err := issues_model.AddReviewRequest(ctx, pr.Issue, reviewer, issue.Poster)
222+
if err != nil {
223+
return err
224+
}
225+
reviewNotifiers = append(reviewNotifiers, &ReviewRequestNotifier{
226+
Comment: comment,
227+
Reviewer: reviewer,
228+
IsAdd: true,
229+
})
230+
}
231+
232+
for _, teamReviewer := range opts.TeamReviewers {
233+
comment, err := issues_model.AddTeamReviewRequest(ctx, pr.Issue, teamReviewer, issue.Poster)
234+
if err != nil {
235+
return err
236+
}
237+
reviewNotifiers = append(reviewNotifiers, &ReviewRequestNotifier{
238+
Comment: comment,
239+
ReviewTeam: teamReviewer,
240+
IsAdd: true,
241+
})
242+
}
243+
} else if !pr.IsWorkInProgress(ctx) {
179244
reviewNotifiers, err = RequestCodeOwnersReview(ctx, issue, pr)
180245
if err != nil {
181246
return err
@@ -211,17 +276,7 @@ func NewPullRequest(ctx context.Context, opts *NewPullRequestOptions) error {
211276
}
212277
notify_service.IssueChangeAssignee(ctx, issue.Poster, issue, assignee, false, assigneeCommentMap[assigneeID])
213278
}
214-
permDoer, err := access_model.GetUserRepoPermission(ctx, repo, issue.Poster)
215-
for _, reviewer := range opts.Reviewers {
216-
if _, err = ReviewRequest(ctx, pr, issue.Poster, &permDoer, reviewer, true); err != nil {
217-
return err
218-
}
219-
}
220-
for _, teamReviewer := range opts.TeamReviewers {
221-
if _, err = TeamReviewRequest(ctx, pr, issue.Poster, teamReviewer, true); err != nil {
222-
return err
223-
}
224-
}
279+
225280
return nil
226281
}
227282

0 commit comments

Comments
 (0)