@@ -164,6 +164,7 @@ type CreateReviewOptions struct {
164
164
Type ReviewType
165
165
Issue * Issue
166
166
Reviewer * User
167
+ Official bool
167
168
}
168
169
169
170
// 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) {
187
188
}
188
189
189
190
func 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
-
195
191
review := & Review {
196
192
Type : opts .Type ,
197
193
Issue : opts .Issue ,
198
194
IssueID : opts .Issue .ID ,
199
195
Reviewer : opts .Reviewer ,
200
196
ReviewerID : opts .Reviewer .ID ,
201
197
Content : opts .Content ,
202
- Official : official ,
198
+ Official : opts . Official ,
203
199
}
204
200
if _ , err := e .Insert (review ); err != nil {
205
201
return nil , err
@@ -265,10 +261,7 @@ func SubmitReview(doer *User, issue *Issue, reviewType ReviewType, content strin
265
261
return nil , nil , err
266
262
}
267
263
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
272
265
273
266
review , err := getCurrentReview (sess , doer , issue )
274
267
if err != nil {
@@ -280,12 +273,24 @@ func SubmitReview(doer *User, issue *Issue, reviewType ReviewType, content strin
280
273
return nil , nil , ContentEmptyErr {}
281
274
}
282
275
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
+
283
287
// No current review. Create a new one!
284
288
review , err = createReview (sess , CreateReviewOptions {
285
289
Type : reviewType ,
286
290
Issue : issue ,
287
291
Reviewer : doer ,
288
292
Content : content ,
293
+ Official : official ,
289
294
})
290
295
if err != nil {
291
296
return nil , nil , err
@@ -298,13 +303,18 @@ func SubmitReview(doer *User, issue *Issue, reviewType ReviewType, content strin
298
303
return nil , nil , ContentEmptyErr {}
299
304
}
300
305
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
+ }
305
315
}
306
- review .Official = official
307
316
317
+ review .Official = official
308
318
review .Issue = issue
309
319
review .Content = content
310
320
review .Type = reviewType
0 commit comments