@@ -231,7 +231,7 @@ type CreateReviewOptions struct {
231231}
232232
233233// IsOfficialReviewer check if at least one of the provided reviewers can make official reviews in issue (counts towards required approvals)
234- func IsOfficialReviewer (ctx context.Context , issue * Issue , reviewers ... * user_model.User ) (bool , error ) {
234+ func IsOfficialReviewer (ctx context.Context , issue * Issue , reviewer * user_model.User ) (bool , error ) {
235235 pr , err := GetPullRequestByIssueID (ctx , issue .ID )
236236 if err != nil {
237237 return false , err
@@ -242,14 +242,21 @@ func IsOfficialReviewer(ctx context.Context, issue *Issue, reviewers ...*user_mo
242242 return false , err
243243 }
244244 if rule == nil {
245- return false , nil
245+ // if no rule is found, then user with write access can make official reviews
246+ err := pr .LoadBaseRepo (ctx )
247+ if err != nil {
248+ return false , err
249+ }
250+ writeAccess , err := access_model .HasAccessUnit (ctx , reviewer , pr .BaseRepo , unit .TypeCode , perm .AccessModeWrite )
251+ if err != nil {
252+ return false , err
253+ }
254+ return writeAccess , nil
246255 }
247256
248- for _ , reviewer := range reviewers {
249- official , err := git_model .IsUserOfficialReviewer (ctx , rule , reviewer )
250- if official || err != nil {
251- return official , err
252- }
257+ official , err := git_model .IsUserOfficialReviewer (ctx , rule , reviewer )
258+ if official || err != nil {
259+ return official , err
253260 }
254261
255262 return false , nil
@@ -578,7 +585,9 @@ func AddReviewRequest(ctx context.Context, issue *Issue, reviewer, doer *user_mo
578585 return nil , nil
579586 }
580587
581- official , err := IsOfficialReviewer (ctx , issue , reviewer , doer )
588+ // if the reviewer is an official reviewer,
589+ // remove the official flag in the all previous reviews
590+ official , err := IsOfficialReviewer (ctx , issue , reviewer )
582591 if err != nil {
583592 return nil , err
584593 } else if official {
0 commit comments