@@ -2,21 +2,30 @@ import { RepositoryTracking } from "./types";
22import { GitHubClient } from "./github-client" ;
33
44export class FilterManager {
5- constructor (
6- private gitHubClient : GitHubClient ,
7- ) { }
5+ constructor ( private gitHubClient : GitHubClient ) { }
86
97 public filterIssues ( repo : RepositoryTracking , issues : any [ ] ) : any [ ] {
108 let filteredIssues = issues ;
119
1210 // Apply label filtering
13- if ( ( repo . enableLabelFilter ?? false ) && ( repo . labelFilters ?. length ?? 0 ) > 0 ) {
14- filteredIssues = this . applyLabelFilter ( filteredIssues , repo . labelFilterMode ?? "include" , repo . labelFilters ?? [ ] ) ;
11+ if (
12+ ( repo . enableLabelFilter ?? false ) &&
13+ ( repo . labelFilters ?. length ?? 0 ) > 0
14+ ) {
15+ filteredIssues = this . applyLabelFilter (
16+ filteredIssues ,
17+ repo . labelFilterMode ?? "include" ,
18+ repo . labelFilters ?? [ ] ,
19+ ) ;
1520 }
1621
1722 // Apply assignee filtering
18- if ( ( repo . enableAssigneeFilter ?? false ) ) {
19- filteredIssues = this . applyAssigneeFilter ( filteredIssues , repo . assigneeFilterMode ?? "assigned-to-me" , repo . assigneeFilters ?? [ ] ) ;
23+ if ( repo . enableAssigneeFilter ?? false ) {
24+ filteredIssues = this . applyAssigneeFilter (
25+ filteredIssues ,
26+ repo . assigneeFilterModes ?? [ "assigned-to-me" ] ,
27+ repo . assigneeFilters ?? [ ] ,
28+ ) ;
2029 }
2130
2231 return filteredIssues ;
@@ -29,95 +38,136 @@ export class FilterManager {
2938 let filteredPullRequests = pullRequests ;
3039
3140 // Apply label filtering
32- if ( ( repo . enablePrLabelFilter ?? false ) && ( repo . prLabelFilters ?. length ?? 0 ) > 0 ) {
33- filteredPullRequests = this . applyLabelFilter ( filteredPullRequests , repo . prLabelFilterMode ?? "include" , repo . prLabelFilters ?? [ ] ) ;
41+ if (
42+ ( repo . enablePrLabelFilter ?? false ) &&
43+ ( repo . prLabelFilters ?. length ?? 0 ) > 0
44+ ) {
45+ filteredPullRequests = this . applyLabelFilter (
46+ filteredPullRequests ,
47+ repo . prLabelFilterMode ?? "include" ,
48+ repo . prLabelFilters ?? [ ] ,
49+ ) ;
3450 }
3551
3652 // Apply assignee filtering
37- if ( ( repo . enablePrAssigneeFilter ?? false ) ) {
38- filteredPullRequests = this . applyAssigneeFilter ( filteredPullRequests , repo . prAssigneeFilterMode ?? "assigned-to-me" , repo . prAssigneeFilters ?? [ ] ) ;
53+ if ( repo . enablePrAssigneeFilter ?? false ) {
54+ filteredPullRequests = this . applyAssigneeFilter (
55+ filteredPullRequests ,
56+ repo . prAssigneeFilterModes ?? [ "assigned-to-me" ] ,
57+ repo . prAssigneeFilters ?? [ ] ,
58+ ) ;
3959 }
4060
4161 // Apply reviewer filtering
42- if ( ( repo . enablePrReviewerFilter ?? false ) ) {
43- filteredPullRequests = this . applyReviewerFilter ( filteredPullRequests , repo . prReviewerFilterMode ?? "review-requested-from-me" , repo . prReviewerFilters ?? [ ] ) ;
62+ if ( repo . enablePrReviewerFilter ?? false ) {
63+ filteredPullRequests = this . applyReviewerFilter (
64+ filteredPullRequests ,
65+ repo . prReviewerFilterModes ?? [ "review-requested-from-me" ] ,
66+ repo . prReviewerFilters ?? [ ] ,
67+ ) ;
4468 }
4569
4670 return filteredPullRequests ;
4771 }
4872
49- private applyLabelFilter ( items : any [ ] , filterMode : "include" | "exclude" , labelFilters : string [ ] ) : any [ ] {
73+ private applyLabelFilter (
74+ items : any [ ] ,
75+ filterMode : "include" | "exclude" ,
76+ labelFilters : string [ ] ,
77+ ) : any [ ] {
5078 return items . filter ( ( item ) => {
5179 if ( ! item . labels || ! Array . isArray ( item . labels ) ) {
5280 // If no labels, only include in "exclude" mode (since we're excluding specific labels)
5381 return filterMode === "exclude" ;
5482 }
5583
5684 const itemLabels = item . labels . map ( ( label : any ) =>
57- typeof label === ' string' ? label : label . name
85+ typeof label === " string" ? label : label . name ,
5886 ) ;
5987
60- const hasMatchingLabel = labelFilters . some ( filterLabel =>
61- itemLabels . includes ( filterLabel )
88+ const hasMatchingLabel = labelFilters . some ( ( filterLabel ) =>
89+ itemLabels . includes ( filterLabel ) ,
6290 ) ;
6391
6492 // Include mode: only include items that have at least one of the specified labels
6593 // Exclude mode: exclude items that have any of the specified labels
66- return filterMode === "include" ? hasMatchingLabel : ! hasMatchingLabel ;
94+ return filterMode === "include"
95+ ? hasMatchingLabel
96+ : ! hasMatchingLabel ;
6797 } ) ;
6898 }
6999
70- private applyAssigneeFilter ( items : any [ ] , filterMode : "assigned-to-me" | "assigned-to-specific" | "unassigned" | "any-assigned" , assigneeFilters : string [ ] ) : any [ ] {
100+ private applyAssigneeFilter (
101+ items : any [ ] ,
102+ filterModes : Array <
103+ | "assigned-to-me"
104+ | "assigned-to-specific"
105+ | "unassigned"
106+ | "any-assigned"
107+ > ,
108+ assigneeFilters : string [ ] ,
109+ ) : any [ ] {
71110 return items . filter ( ( item ) => {
72111 const assignees = item . assignees || [ ] ;
73- const assigneeUsernames = assignees . map ( ( assignee : any ) => assignee . login || assignee ) ;
74-
75- switch ( filterMode ) {
76- case "assigned-to-me" :
77- // Get current user from the item's context or use a stored current user
78- const currentUser = this . getCurrentUser ( ) ;
79- return assigneeUsernames . includes ( currentUser ) ;
80-
81- case "assigned-to-specific" :
82- // Check if any of the specified assignees are assigned
83- return assigneeFilters . some ( filterUser => assigneeUsernames . includes ( filterUser ) ) ;
84-
85- case "unassigned" :
86- // Only include items with no assignees
87- return assigneeUsernames . length === 0 ;
88-
89- case "any-assigned" :
90- // Only include items that have at least one assignee
91- return assigneeUsernames . length > 0 ;
92-
93- default :
94- return true ;
95- }
112+ const assigneeUsernames = assignees . map (
113+ ( assignee : any ) => assignee . login || assignee ,
114+ ) ;
115+ const currentUser = this . getCurrentUser ( ) ;
116+
117+ // Item passes if it matches ANY of the selected modes (OR logic)
118+ return filterModes . some ( ( mode ) => {
119+ switch ( mode ) {
120+ case "assigned-to-me" :
121+ return assigneeUsernames . includes ( currentUser ) ;
122+ case "assigned-to-specific" :
123+ return assigneeFilters . some ( ( filterUser ) =>
124+ assigneeUsernames . includes ( filterUser ) ,
125+ ) ;
126+ case "unassigned" :
127+ return assigneeUsernames . length === 0 ;
128+ case "any-assigned" :
129+ return assigneeUsernames . length > 0 ;
130+ default :
131+ return false ;
132+ }
133+ } ) ;
96134 } ) ;
97135 }
98136
99- private applyReviewerFilter ( items : any [ ] , filterMode : "review-requested-from-me" | "review-requested-from-specific" | "no-review-requested" | "any-review-requested" , reviewerFilters : string [ ] ) : any [ ] {
137+ private applyReviewerFilter (
138+ items : any [ ] ,
139+ filterModes : Array <
140+ | "review-requested-from-me"
141+ | "review-requested-from-specific"
142+ | "no-review-requested"
143+ | "any-review-requested"
144+ > ,
145+ reviewerFilters : string [ ] ,
146+ ) : any [ ] {
100147 return items . filter ( ( item ) => {
101148 const reviewers = item . requested_reviewers || [ ] ;
102- const reviewerUsernames = reviewers . map ( ( reviewer : any ) => reviewer . login || reviewer ) ;
103-
104- switch ( filterMode ) {
105- case "review-requested-from-me" :
106- const currentUser = this . getCurrentUser ( ) ;
107- return reviewerUsernames . includes ( currentUser ) ;
108-
109- case "review-requested-from-specific" :
110- return reviewerFilters . some ( filterUser => reviewerUsernames . includes ( filterUser ) ) ;
111-
112- case "no-review-requested" :
113- return reviewerUsernames . length === 0 ;
114-
115- case "any-review-requested" :
116- return reviewerUsernames . length > 0 ;
117-
118- default :
119- return true ;
120- }
149+ const reviewerUsernames = reviewers . map (
150+ ( reviewer : any ) => reviewer . login || reviewer ,
151+ ) ;
152+ const currentUser = this . getCurrentUser ( ) ;
153+
154+ // Item passes if it matches ANY of the selected modes (OR logic)
155+ return filterModes . some ( ( mode ) => {
156+ switch ( mode ) {
157+ case "review-requested-from-me" :
158+ return reviewerUsernames . includes ( currentUser ) ;
159+ case "review-requested-from-specific" :
160+ return reviewerFilters . some ( ( filterUser ) =>
161+ reviewerUsernames . includes ( filterUser ) ,
162+ ) ;
163+ case "no-review-requested" :
164+ return reviewerUsernames . length === 0 ;
165+ case "any-review-requested" :
166+ return reviewerUsernames . length > 0 ;
167+ default :
168+ return false ;
169+ }
170+ } ) ;
121171 } ) ;
122172 }
123173
0 commit comments