@@ -1119,6 +1119,7 @@ type IssuesOptions struct { //nolint
11191119 PosterID int64
11201120 MentionedID int64
11211121 ReviewRequestedID int64
1122+ ReviewedID int64
11221123 SubscriberID int64
11231124 MilestoneIDs []int64
11241125 ProjectID int64
@@ -1233,6 +1234,10 @@ func (opts *IssuesOptions) setupSessionNoLimit(sess *xorm.Session) {
12331234 applyReviewRequestedCondition (sess , opts .ReviewRequestedID )
12341235 }
12351236
1237+ if opts .ReviewedID > 0 {
1238+ applyReviewedCondition (sess , opts .ReviewedID )
1239+ }
1240+
12361241 if opts .SubscriberID > 0 {
12371242 applySubscribedCondition (sess , opts .SubscriberID )
12381243 }
@@ -1403,6 +1408,33 @@ func applyReviewRequestedCondition(sess *xorm.Session, reviewRequestedID int64)
14031408 reviewRequestedID , ReviewTypeApprove , ReviewTypeReject , ReviewTypeRequest , reviewRequestedID )
14041409}
14051410
1411+ func applyReviewedCondition (sess * xorm.Session , reviewedID int64 ) * xorm.Session {
1412+ // Query for pull requests where you are a reviewer or commenter, excluding
1413+ // any pull requests already returned by the the review requested filter.
1414+ notPoster := builder.Neq {"issue.poster_id" : reviewedID }
1415+ reviewed := builder .In ("issue.id" , builder .
1416+ Select ("issue_id" ).
1417+ From ("review" ).
1418+ Where (builder .And (
1419+ builder.Neq {"type" : ReviewTypeRequest },
1420+ builder .Or (
1421+ builder.Eq {"reviewer_id" : reviewedID },
1422+ builder .In ("reviewer_team_id" , builder .
1423+ Select ("team_id" ).
1424+ From ("team_user" ).
1425+ Where (builder.Eq {"uid" : reviewedID }),
1426+ ),
1427+ ),
1428+ )),
1429+ )
1430+ comment := builder .In ("issue.id" , builder .
1431+ Select ("issue_id" ).
1432+ From ("comment" ).
1433+ Where (builder.Eq {"poster_id" : reviewedID }),
1434+ )
1435+ return sess .And (notPoster , reviewed , comment )
1436+ }
1437+
14061438func applySubscribedCondition (sess * xorm.Session , subscriberID int64 ) * xorm.Session {
14071439 return sess .And (
14081440 builder .
@@ -1557,6 +1589,7 @@ type IssueStats struct {
15571589 CreateCount int64
15581590 MentionCount int64
15591591 ReviewRequestedCount int64
1592+ ReviewedCount int64
15601593}
15611594
15621595// Filter modes.
@@ -1566,6 +1599,7 @@ const (
15661599 FilterModeCreate
15671600 FilterModeMention
15681601 FilterModeReviewRequested
1602+ FilterModeReviewed
15691603 FilterModeYourRepositories
15701604)
15711605
@@ -1579,6 +1613,7 @@ type IssueStatsOptions struct {
15791613 MentionedID int64
15801614 PosterID int64
15811615 ReviewRequestedID int64
1616+ ReviewedID int64
15821617 IsPull util.OptionalBool
15831618 IssueIDs []int64
15841619}
@@ -1617,6 +1652,7 @@ func GetIssueStats(opts *IssueStatsOptions) (*IssueStats, error) {
16171652 accum .CreateCount += stats .CreateCount
16181653 accum .OpenCount += stats .MentionCount
16191654 accum .ReviewRequestedCount += stats .ReviewRequestedCount
1655+ accum .ReviewedCount += stats .ReviewedCount
16201656 i = chunk
16211657 }
16221658 return accum , nil
@@ -1674,6 +1710,10 @@ func getIssueStatsChunk(opts *IssueStatsOptions, issueIDs []int64) (*IssueStats,
16741710 applyReviewRequestedCondition (sess , opts .ReviewRequestedID )
16751711 }
16761712
1713+ if opts .ReviewedID > 0 {
1714+ applyReviewedCondition (sess , opts .ReviewedID )
1715+ }
1716+
16771717 switch opts .IsPull {
16781718 case util .OptionalBoolTrue :
16791719 sess .And ("issue.is_pull=?" , true )
@@ -1814,6 +1854,19 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
18141854 if err != nil {
18151855 return nil , err
18161856 }
1857+ case FilterModeReviewed :
1858+ stats .OpenCount , err = applyReviewedCondition (sess (cond ), opts .UserID ).
1859+ And ("issue.is_closed = ?" , false ).
1860+ Count (new (Issue ))
1861+ if err != nil {
1862+ return nil , err
1863+ }
1864+ stats .ClosedCount , err = applyReviewedCondition (sess (cond ), opts .UserID ).
1865+ And ("issue.is_closed = ?" , true ).
1866+ Count (new (Issue ))
1867+ if err != nil {
1868+ return nil , err
1869+ }
18171870 }
18181871
18191872 cond = cond .And (builder.Eq {"issue.is_closed" : opts .IsClosed })
@@ -1842,6 +1895,11 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
18421895 return nil , err
18431896 }
18441897
1898+ stats .ReviewedCount , err = applyReviewedCondition (sess (cond ), opts .UserID ).Count (new (Issue ))
1899+ if err != nil {
1900+ return nil , err
1901+ }
1902+
18451903 return stats , nil
18461904}
18471905
0 commit comments