@@ -1148,6 +1148,7 @@ type IssuesOptions struct { //nolint
1148
1148
PosterID int64
1149
1149
MentionedID int64
1150
1150
ReviewRequestedID int64
1151
+ ReviewedID int64
1151
1152
SubscriberID int64
1152
1153
MilestoneIDs []int64
1153
1154
ProjectID int64
@@ -1262,6 +1263,10 @@ func (opts *IssuesOptions) setupSessionNoLimit(sess *xorm.Session) {
1262
1263
applyReviewRequestedCondition (sess , opts .ReviewRequestedID )
1263
1264
}
1264
1265
1266
+ if opts .ReviewedID > 0 {
1267
+ applyReviewedCondition (sess , opts .ReviewedID )
1268
+ }
1269
+
1265
1270
if opts .SubscriberID > 0 {
1266
1271
applySubscribedCondition (sess , opts .SubscriberID )
1267
1272
}
@@ -1432,6 +1437,36 @@ func applyReviewRequestedCondition(sess *xorm.Session, reviewRequestedID int64)
1432
1437
reviewRequestedID , ReviewTypeApprove , ReviewTypeReject , ReviewTypeRequest , reviewRequestedID )
1433
1438
}
1434
1439
1440
+ func applyReviewedCondition (sess * xorm.Session , reviewedID int64 ) * xorm.Session {
1441
+ // Query for pull requests where you are a reviewer or commenter, excluding
1442
+ // any pull requests already returned by the the review requested filter.
1443
+ notPoster := builder.Neq {"issue.poster_id" : reviewedID }
1444
+ reviewed := builder .In ("issue.id" , builder .
1445
+ Select ("issue_id" ).
1446
+ From ("review" ).
1447
+ Where (builder .And (
1448
+ builder.Neq {"type" : ReviewTypeRequest },
1449
+ builder .Or (
1450
+ builder.Eq {"reviewer_id" : reviewedID },
1451
+ builder .In ("reviewer_team_id" , builder .
1452
+ Select ("team_id" ).
1453
+ From ("team_user" ).
1454
+ Where (builder.Eq {"uid" : reviewedID }),
1455
+ ),
1456
+ ),
1457
+ )),
1458
+ )
1459
+ commented := builder .In ("issue.id" , builder .
1460
+ Select ("issue_id" ).
1461
+ From ("comment" ).
1462
+ Where (builder .And (
1463
+ builder.Eq {"poster_id" : reviewedID },
1464
+ builder .In ("type" , CommentTypeComment , CommentTypeCode , CommentTypeReview ),
1465
+ )),
1466
+ )
1467
+ return sess .And (notPoster , builder .Or (reviewed , commented ))
1468
+ }
1469
+
1435
1470
func applySubscribedCondition (sess * xorm.Session , subscriberID int64 ) * xorm.Session {
1436
1471
return sess .And (
1437
1472
builder .
@@ -1586,6 +1621,7 @@ type IssueStats struct {
1586
1621
CreateCount int64
1587
1622
MentionCount int64
1588
1623
ReviewRequestedCount int64
1624
+ ReviewedCount int64
1589
1625
}
1590
1626
1591
1627
// Filter modes.
@@ -1595,6 +1631,7 @@ const (
1595
1631
FilterModeCreate
1596
1632
FilterModeMention
1597
1633
FilterModeReviewRequested
1634
+ FilterModeReviewed
1598
1635
FilterModeYourRepositories
1599
1636
)
1600
1637
@@ -1608,6 +1645,7 @@ type IssueStatsOptions struct {
1608
1645
MentionedID int64
1609
1646
PosterID int64
1610
1647
ReviewRequestedID int64
1648
+ ReviewedID int64
1611
1649
IsPull util.OptionalBool
1612
1650
IssueIDs []int64
1613
1651
}
@@ -1646,6 +1684,7 @@ func GetIssueStats(opts *IssueStatsOptions) (*IssueStats, error) {
1646
1684
accum .CreateCount += stats .CreateCount
1647
1685
accum .OpenCount += stats .MentionCount
1648
1686
accum .ReviewRequestedCount += stats .ReviewRequestedCount
1687
+ accum .ReviewedCount += stats .ReviewedCount
1649
1688
i = chunk
1650
1689
}
1651
1690
return accum , nil
@@ -1703,6 +1742,10 @@ func getIssueStatsChunk(opts *IssueStatsOptions, issueIDs []int64) (*IssueStats,
1703
1742
applyReviewRequestedCondition (sess , opts .ReviewRequestedID )
1704
1743
}
1705
1744
1745
+ if opts .ReviewedID > 0 {
1746
+ applyReviewedCondition (sess , opts .ReviewedID )
1747
+ }
1748
+
1706
1749
switch opts .IsPull {
1707
1750
case util .OptionalBoolTrue :
1708
1751
sess .And ("issue.is_pull=?" , true )
@@ -1843,6 +1886,19 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
1843
1886
if err != nil {
1844
1887
return nil , err
1845
1888
}
1889
+ case FilterModeReviewed :
1890
+ stats .OpenCount , err = applyReviewedCondition (sess (cond ), opts .UserID ).
1891
+ And ("issue.is_closed = ?" , false ).
1892
+ Count (new (Issue ))
1893
+ if err != nil {
1894
+ return nil , err
1895
+ }
1896
+ stats .ClosedCount , err = applyReviewedCondition (sess (cond ), opts .UserID ).
1897
+ And ("issue.is_closed = ?" , true ).
1898
+ Count (new (Issue ))
1899
+ if err != nil {
1900
+ return nil , err
1901
+ }
1846
1902
}
1847
1903
1848
1904
cond = cond .And (builder.Eq {"issue.is_closed" : opts .IsClosed })
@@ -1871,6 +1927,11 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
1871
1927
return nil , err
1872
1928
}
1873
1929
1930
+ stats .ReviewedCount , err = applyReviewedCondition (sess (cond ), opts .UserID ).Count (new (Issue ))
1931
+ if err != nil {
1932
+ return nil , err
1933
+ }
1934
+
1874
1935
return stats , nil
1875
1936
}
1876
1937
0 commit comments