@@ -1148,6 +1148,7 @@ type IssuesOptions struct { //nolint
11481148 PosterID int64
11491149 MentionedID int64
11501150 ReviewRequestedID int64
1151+ ReviewedID int64
11511152 SubscriberID int64
11521153 MilestoneIDs []int64
11531154 ProjectID int64
@@ -1262,6 +1263,10 @@ func (opts *IssuesOptions) setupSessionNoLimit(sess *xorm.Session) {
12621263 applyReviewRequestedCondition (sess , opts .ReviewRequestedID )
12631264 }
12641265
1266+ if opts .ReviewedID > 0 {
1267+ applyReviewedCondition (sess , opts .ReviewedID )
1268+ }
1269+
12651270 if opts .SubscriberID > 0 {
12661271 applySubscribedCondition (sess , opts .SubscriberID )
12671272 }
@@ -1432,6 +1437,36 @@ func applyReviewRequestedCondition(sess *xorm.Session, reviewRequestedID int64)
14321437 reviewRequestedID , ReviewTypeApprove , ReviewTypeReject , ReviewTypeRequest , reviewRequestedID )
14331438}
14341439
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+
14351470func applySubscribedCondition (sess * xorm.Session , subscriberID int64 ) * xorm.Session {
14361471 return sess .And (
14371472 builder .
@@ -1586,6 +1621,7 @@ type IssueStats struct {
15861621 CreateCount int64
15871622 MentionCount int64
15881623 ReviewRequestedCount int64
1624+ ReviewedCount int64
15891625}
15901626
15911627// Filter modes.
@@ -1595,6 +1631,7 @@ const (
15951631 FilterModeCreate
15961632 FilterModeMention
15971633 FilterModeReviewRequested
1634+ FilterModeReviewed
15981635 FilterModeYourRepositories
15991636)
16001637
@@ -1608,6 +1645,7 @@ type IssueStatsOptions struct {
16081645 MentionedID int64
16091646 PosterID int64
16101647 ReviewRequestedID int64
1648+ ReviewedID int64
16111649 IsPull util.OptionalBool
16121650 IssueIDs []int64
16131651}
@@ -1646,6 +1684,7 @@ func GetIssueStats(opts *IssueStatsOptions) (*IssueStats, error) {
16461684 accum .CreateCount += stats .CreateCount
16471685 accum .OpenCount += stats .MentionCount
16481686 accum .ReviewRequestedCount += stats .ReviewRequestedCount
1687+ accum .ReviewedCount += stats .ReviewedCount
16491688 i = chunk
16501689 }
16511690 return accum , nil
@@ -1703,6 +1742,10 @@ func getIssueStatsChunk(opts *IssueStatsOptions, issueIDs []int64) (*IssueStats,
17031742 applyReviewRequestedCondition (sess , opts .ReviewRequestedID )
17041743 }
17051744
1745+ if opts .ReviewedID > 0 {
1746+ applyReviewedCondition (sess , opts .ReviewedID )
1747+ }
1748+
17061749 switch opts .IsPull {
17071750 case util .OptionalBoolTrue :
17081751 sess .And ("issue.is_pull=?" , true )
@@ -1843,6 +1886,19 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
18431886 if err != nil {
18441887 return nil , err
18451888 }
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+ }
18461902 }
18471903
18481904 cond = cond .And (builder.Eq {"issue.is_closed" : opts .IsClosed })
@@ -1871,6 +1927,11 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
18711927 return nil , err
18721928 }
18731929
1930+ stats .ReviewedCount , err = applyReviewedCondition (sess (cond ), opts .UserID ).Count (new (Issue ))
1931+ if err != nil {
1932+ return nil , err
1933+ }
1934+
18741935 return stats , nil
18751936}
18761937
0 commit comments