@@ -164,6 +164,7 @@ type CreateReviewOptions struct {
164164 Type ReviewType
165165 Issue * Issue
166166 Reviewer * User
167+ Official bool
167168}
168169
169170// IsOfficialReviewer check if reviewer can make official reviews in issue (counts towards required approvals)
@@ -187,19 +188,14 @@ func isOfficialReviewer(e Engine, issue *Issue, reviewer *User) (bool, error) {
187188}
188189
189190func createReview (e Engine , opts CreateReviewOptions ) (* Review , error ) {
190- official , err := isOfficialReviewer (e , opts .Issue , opts .Reviewer )
191- if err != nil {
192- return nil , err
193- }
194-
195191 review := & Review {
196192 Type : opts .Type ,
197193 Issue : opts .Issue ,
198194 IssueID : opts .Issue .ID ,
199195 Reviewer : opts .Reviewer ,
200196 ReviewerID : opts .Reviewer .ID ,
201197 Content : opts .Content ,
202- Official : official ,
198+ Official : opts . Official ,
203199 }
204200 if _ , err := e .Insert (review ); err != nil {
205201 return nil , err
@@ -265,10 +261,7 @@ func SubmitReview(doer *User, issue *Issue, reviewType ReviewType, content strin
265261 return nil , nil , err
266262 }
267263
268- // Only reviewers latest review shall count as "official", so existing reviews needs to be cleared
269- if _ , err := sess .Exec ("UPDATE `review` SET official=? WHERE issue_id=? AND reviewer_id=?" , false , issue .ID , doer .ID ); err != nil {
270- return nil , nil , err
271- }
264+ var official = false
272265
273266 review , err := getCurrentReview (sess , doer , issue )
274267 if err != nil {
@@ -280,12 +273,24 @@ func SubmitReview(doer *User, issue *Issue, reviewType ReviewType, content strin
280273 return nil , nil , ContentEmptyErr {}
281274 }
282275
276+ if reviewType == ReviewTypeApprove || reviewType == ReviewTypeReject {
277+ // Only reviewers latest review of type approve and reject shall count as "official", so existing reviews needs to be cleared
278+ if _ , err := sess .Exec ("UPDATE `review` SET official=? WHERE issue_id=? AND reviewer_id=?" , false , issue .ID , doer .ID ); err != nil {
279+ return nil , nil , err
280+ }
281+ official , err = isOfficialReviewer (sess , issue , doer )
282+ if err != nil {
283+ return nil , nil , err
284+ }
285+ }
286+
283287 // No current review. Create a new one!
284288 review , err = createReview (sess , CreateReviewOptions {
285289 Type : reviewType ,
286290 Issue : issue ,
287291 Reviewer : doer ,
288292 Content : content ,
293+ Official : official ,
289294 })
290295 if err != nil {
291296 return nil , nil , err
@@ -298,13 +303,18 @@ func SubmitReview(doer *User, issue *Issue, reviewType ReviewType, content strin
298303 return nil , nil , ContentEmptyErr {}
299304 }
300305
301- // Official status of review updated at every submit in case settings changed
302- official , err := isOfficialReviewer (sess , issue , doer )
303- if err != nil {
304- return nil , nil , err
306+ if reviewType == ReviewTypeApprove || reviewType == ReviewTypeReject {
307+ // Only reviewers latest review of type approve and reject shall count as "official", so existing reviews needs to be cleared
308+ if _ , err := sess .Exec ("UPDATE `review` SET official=? WHERE issue_id=? AND reviewer_id=?" , false , issue .ID , doer .ID ); err != nil {
309+ return nil , nil , err
310+ }
311+ official , err = isOfficialReviewer (sess , issue , doer )
312+ if err != nil {
313+ return nil , nil , err
314+ }
305315 }
306- review .Official = official
307316
317+ review .Official = official
308318 review .Issue = issue
309319 review .Content = content
310320 review .Type = reviewType
0 commit comments