@@ -15,16 +15,21 @@ import {
15
15
ACTIVE ,
16
16
createNode ,
17
17
createRelationships ,
18
+ filter ,
18
19
matchPropsAndProjectSensAndScopedRoles ,
19
20
merge ,
20
21
oncePerProject ,
21
22
paginate ,
22
23
sorting ,
23
24
} from '~/core/database/query' ;
24
- import { UserRepository } from '../../user/user.repository' ;
25
+ import { type FilterFn } from '~/core/database/query/filters' ;
26
+ import { userFilters , UserRepository } from '../../user/user.repository' ;
27
+ import { type ProjectFilters } from '../dto' ;
28
+ import { projectFilters } from '../project-filters.query' ;
25
29
import {
26
30
type CreateProjectMember ,
27
31
ProjectMember ,
32
+ ProjectMemberFilters ,
28
33
type ProjectMemberListInput ,
29
34
type UpdateProjectMember ,
30
35
} from './dto' ;
@@ -140,28 +145,11 @@ export class ProjectMemberRepository extends DtoRepository(ProjectMember) {
140
145
const result = await this . db
141
146
. query ( )
142
147
. match ( [
143
- node (
144
- 'project' ,
145
- 'Project' ,
146
- filter ?. projectId ? { id : filter . projectId } : { } ,
147
- ) ,
148
+ node ( 'project' , 'Project' ) ,
148
149
relation ( 'out' , '' , 'member' ) ,
149
150
node ( 'node' , 'ProjectMember' ) ,
150
151
] )
151
- . apply ( ( q ) =>
152
- filter ?. roles
153
- ? q
154
- . match ( [
155
- node ( 'node' ) ,
156
- relation ( 'out' , '' , 'roles' , ACTIVE ) ,
157
- node ( 'role' , 'Property' ) ,
158
- ] )
159
- . raw (
160
- `WHERE size(apoc.coll.intersection(role.value, $filteredRoles)) > 0` ,
161
- { filteredRoles : filter . roles } ,
162
- )
163
- : q ,
164
- )
152
+ . apply ( projectMemberFilters ( filter ) )
165
153
. with ( '*' ) // needed between where & where
166
154
. apply (
167
155
this . privileges . filterToReadable ( {
@@ -174,30 +162,15 @@ export class ProjectMemberRepository extends DtoRepository(ProjectMember) {
174
162
return result ! ; // result from paginate() will always have 1 row.
175
163
}
176
164
177
- async listAsNotifiers ( projectId : ID , roles ?: Role [ ] ) {
165
+ async listAsNotifiers ( project : ID < 'Project' > , roles ?: Role [ ] ) {
178
166
return await this . db
179
167
. query ( )
180
168
. match ( [
181
- node ( '' , 'Project' , { id : projectId } ) ,
182
- relation ( 'out' , '' , 'member' , ACTIVE ) ,
183
169
node ( 'node' , 'ProjectMember' ) ,
184
170
relation ( 'out' , '' , 'user' , ACTIVE ) ,
185
171
node ( 'user' , 'User' ) ,
186
172
] )
187
- . apply ( ( q ) =>
188
- roles
189
- ? q
190
- . match ( [
191
- node ( 'node' ) ,
192
- relation ( 'out' , '' , 'roles' , ACTIVE ) ,
193
- node ( 'role' , 'Property' ) ,
194
- ] )
195
- . raw (
196
- `WHERE size(apoc.coll.intersection(role.value, $filteredRoles)) > 0` ,
197
- { filteredRoles : roles } ,
198
- )
199
- : q ,
200
- )
173
+ . apply ( projectMemberFilters ( { project : { id : project } , roles } ) )
201
174
. with ( 'user' )
202
175
. optionalMatch ( [
203
176
node ( 'user' ) ,
@@ -211,3 +184,22 @@ export class ProjectMemberRepository extends DtoRepository(ProjectMember) {
211
184
. run ( ) ;
212
185
}
213
186
}
187
+
188
+ export const projectMemberFilters = filter . define ( ( ) => ProjectMemberFilters , {
189
+ project : filter . sub ( ( ) : FilterFn < ProjectFilters > => projectFilters ) ( ( sub ) =>
190
+ sub . match ( [
191
+ node ( 'node' , 'Project' ) ,
192
+ relation ( 'out' , '' , 'member' , ACTIVE ) ,
193
+ node ( 'outer' ) ,
194
+ ] ) ,
195
+ ) ,
196
+ user : filter . sub ( ( ) => userFilters ) ( ( sub ) =>
197
+ sub . match ( [
198
+ node ( 'outer' ) ,
199
+ relation ( 'out' , '' , 'user' ) ,
200
+ node ( 'node' , 'User' ) ,
201
+ ] ) ,
202
+ ) ,
203
+ roles : filter . intersectsProp ( ) ,
204
+ active : filter . isPropNotNull ( 'inactiveAt' ) ,
205
+ } ) ;
0 commit comments