@@ -44,6 +44,7 @@ import {
44
44
CreateLanguage ,
45
45
EthnologueLanguage ,
46
46
Language ,
47
+ LanguageFilters ,
47
48
LanguageListInput ,
48
49
UpdateLanguage ,
49
50
} from './dto' ;
@@ -184,7 +185,7 @@ export class LanguageRepository extends DtoRepository<
184
185
node ( 'eth' , 'EthnologueLanguage' ) ,
185
186
] )
186
187
. apply ( matchProps ( { nodeName : 'eth' , outputVar : 'ethProps' } ) )
187
- . apply ( this . isPresetInventory ( ) )
188
+ . apply ( isPresetInventory )
188
189
. optionalMatch ( [
189
190
node ( 'node' ) ,
190
191
relation ( 'in' , '' , 'language' , ACTIVE ) ,
@@ -217,31 +218,7 @@ export class LanguageRepository extends DtoRepository<
217
218
] )
218
219
// match requesting user once (instead of once per row)
219
220
. match ( requestingUser ( session ) )
220
- . apply (
221
- filter . builder ( input . filter ?? { } , {
222
- sensitivity : filter . stringListProp ( ) ,
223
- leastOfThese : filter . propVal ( ) ,
224
- isSignLanguage : filter . propVal ( ) ,
225
- isDialect : filter . propVal ( ) ,
226
- partnerId : filter . pathExists ( ( id ) => [
227
- node ( 'node' ) ,
228
- relation ( 'in' , '' , 'language' , ACTIVE ) ,
229
- node ( '' , 'LanguageEngagement' ) ,
230
- relation ( 'in' , '' , 'engagement' , ACTIVE ) ,
231
- node ( '' , 'Project' ) ,
232
- relation ( 'out' , '' , 'partnership' , ACTIVE ) ,
233
- node ( '' , 'Partnership' ) ,
234
- relation ( 'out' , '' , 'partner' , ACTIVE ) ,
235
- node ( '' , 'Partner' , { id } ) ,
236
- ] ) ,
237
- presetInventory : ( { value, query } ) => {
238
- query . apply ( this . isPresetInventory ( ) ) . with ( '*' ) ;
239
- const condition = equals ( 'true' , true ) ;
240
- return { presetInventory : value ? condition : not ( condition ) } ;
241
- } ,
242
- pinned : filter . isPinned ,
243
- } ) ,
244
- )
221
+ . apply ( languageFilters ( input . filter ) )
245
222
. apply (
246
223
this . privileges . forUser ( session ) . filterToReadable ( {
247
224
wrapContext : oncePerProject ,
@@ -290,41 +267,63 @@ export class LanguageRepository extends DtoRepository<
290
267
. first ( ) ;
291
268
return ! ! res ;
292
269
}
293
-
294
- private isPresetInventory ( ) {
295
- return ( query : Query ) =>
296
- query . subQuery ( 'node' , ( sub ) =>
297
- sub
298
- . optionalMatch ( [
299
- node ( 'node' ) ,
300
- relation ( 'in' , '' , 'language' , ACTIVE ) ,
301
- node ( '' , 'LanguageEngagement' ) ,
302
- relation ( 'in' , '' , 'engagement' , ACTIVE ) ,
303
- node ( 'project' , 'Project' ) ,
304
- relation ( 'out' , '' , 'status' , ACTIVE ) ,
305
- node ( 'status' , 'ProjectStatus' ) ,
306
- ] )
307
- . where ( {
308
- 'status.value' : inArray (
309
- `['${ ProjectStatus . InDevelopment } ', '${ ProjectStatus . Active } ']` ,
310
- true ,
311
- ) ,
312
- } )
313
- . return (
314
- any (
315
- 'project' ,
316
- collect ( 'project' ) ,
317
- exp . path ( [
318
- node ( 'project' ) ,
319
- relation ( 'out' , '' , 'presetInventory' , ACTIVE ) ,
320
- node ( '' , 'Property' , { value : variable ( 'true' ) } ) ,
321
- ] ) ,
322
- ) . as ( 'presetInventory' ) ,
323
- ) ,
324
- ) ;
325
- }
326
270
}
327
271
272
+ export const languageFilters = filter . define ( ( ) => LanguageFilters , {
273
+ sensitivity : filter . stringListProp ( ) ,
274
+ leastOfThese : filter . propVal ( ) ,
275
+ isSignLanguage : filter . propVal ( ) ,
276
+ isDialect : filter . propVal ( ) ,
277
+ partnerId : filter . pathExists ( ( id ) => [
278
+ node ( 'node' ) ,
279
+ relation ( 'in' , '' , 'language' , ACTIVE ) ,
280
+ node ( '' , 'LanguageEngagement' ) ,
281
+ relation ( 'in' , '' , 'engagement' , ACTIVE ) ,
282
+ node ( '' , 'Project' ) ,
283
+ relation ( 'out' , '' , 'partnership' , ACTIVE ) ,
284
+ node ( '' , 'Partnership' ) ,
285
+ relation ( 'out' , '' , 'partner' , ACTIVE ) ,
286
+ node ( '' , 'Partner' , { id } ) ,
287
+ ] ) ,
288
+ presetInventory : ( { value, query } ) => {
289
+ query . apply ( isPresetInventory ) . with ( '*' ) ;
290
+ const condition = equals ( 'true' , true ) ;
291
+ return { presetInventory : value ? condition : not ( condition ) } ;
292
+ } ,
293
+ pinned : filter . isPinned ,
294
+ } ) ;
295
+
296
+ const isPresetInventory = ( query : Query ) =>
297
+ query . subQuery ( 'node' , ( sub ) =>
298
+ sub
299
+ . optionalMatch ( [
300
+ node ( 'node' ) ,
301
+ relation ( 'in' , '' , 'language' , ACTIVE ) ,
302
+ node ( '' , 'LanguageEngagement' ) ,
303
+ relation ( 'in' , '' , 'engagement' , ACTIVE ) ,
304
+ node ( 'project' , 'Project' ) ,
305
+ relation ( 'out' , '' , 'status' , ACTIVE ) ,
306
+ node ( 'status' , 'ProjectStatus' ) ,
307
+ ] )
308
+ . where ( {
309
+ 'status.value' : inArray (
310
+ `['${ ProjectStatus . InDevelopment } ', '${ ProjectStatus . Active } ']` ,
311
+ true ,
312
+ ) ,
313
+ } )
314
+ . return (
315
+ any (
316
+ 'project' ,
317
+ collect ( 'project' ) ,
318
+ exp . path ( [
319
+ node ( 'project' ) ,
320
+ relation ( 'out' , '' , 'presetInventory' , ACTIVE ) ,
321
+ node ( '' , 'Property' , { value : variable ( 'true' ) } ) ,
322
+ ] ) ,
323
+ ) . as ( 'presetInventory' ) ,
324
+ ) ,
325
+ ) ;
326
+
328
327
export const languageSorters = defineSorters ( Language , {
329
328
// eslint-disable-next-line @typescript-eslint/naming-convention
330
329
'ethnologue.*' : ( query , input ) =>
0 commit comments