Skip to content

Commit 21654f2

Browse files
committed
Extract language filters
1 parent 036e78c commit 21654f2

File tree

1 file changed

+58
-59
lines changed

1 file changed

+58
-59
lines changed

src/components/language/language.repository.ts

Lines changed: 58 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ import {
4444
CreateLanguage,
4545
EthnologueLanguage,
4646
Language,
47+
LanguageFilters,
4748
LanguageListInput,
4849
UpdateLanguage,
4950
} from './dto';
@@ -184,7 +185,7 @@ export class LanguageRepository extends DtoRepository<
184185
node('eth', 'EthnologueLanguage'),
185186
])
186187
.apply(matchProps({ nodeName: 'eth', outputVar: 'ethProps' }))
187-
.apply(this.isPresetInventory())
188+
.apply(isPresetInventory)
188189
.optionalMatch([
189190
node('node'),
190191
relation('in', '', 'language', ACTIVE),
@@ -217,31 +218,7 @@ export class LanguageRepository extends DtoRepository<
217218
])
218219
// match requesting user once (instead of once per row)
219220
.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))
245222
.apply(
246223
this.privileges.forUser(session).filterToReadable({
247224
wrapContext: oncePerProject,
@@ -290,41 +267,63 @@ export class LanguageRepository extends DtoRepository<
290267
.first();
291268
return !!res;
292269
}
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-
}
326270
}
327271

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+
328327
export const languageSorters = defineSorters(Language, {
329328
// eslint-disable-next-line @typescript-eslint/naming-convention
330329
'ethnologue.*': (query, input) =>

0 commit comments

Comments
 (0)