Skip to content

Commit f14e683

Browse files
committed
Switch project filters to new signature
1 parent d04ee71 commit f14e683

File tree

3 files changed

+76
-78
lines changed

3 files changed

+76
-78
lines changed

src/components/project/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
export * from './project.service';
22
export * from './project-member';
3-
export * from './list-filter.query';
43
export * from './project.loader';
Lines changed: 74 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,77 @@
11
import { greaterThan, inArray, node, relation } from 'cypher-query-builder';
22
import { ACTIVE, filter, matchProjectSens, path } from '~/core/database/query';
3-
import { ProjectListInput } from './dto';
3+
import { ProjectFilters } from './dto';
44

5-
export const projectListFilter = (input: ProjectListInput) =>
6-
filter.builder(input.filter ?? {}, {
7-
type: filter.stringListBaseNodeProp(),
8-
status: filter.stringListProp(),
9-
onlyMultipleEngagements:
10-
({ value, query }) =>
11-
() =>
12-
value
13-
? query
14-
.match([
15-
node('node'),
16-
relation('out', '', 'engagement', ACTIVE),
17-
node('engagement', 'Engagement'),
18-
])
19-
.with('node, count(engagement) as engagementCount')
20-
.where({ engagementCount: greaterThan(1) })
21-
: null,
22-
step: filter.stringListProp(),
23-
createdAt: filter.dateTimeBaseNodeProp(),
24-
modifiedAt: filter.dateTimeProp(),
25-
mine: filter.pathExistsWhenTrue([
26-
node('requestingUser'),
27-
relation('in', '', 'user'),
28-
node('', 'ProjectMember'),
29-
relation('in', '', 'member'),
30-
node('node'),
31-
]),
32-
pinned: filter.isPinned,
33-
presetInventory: filter.propVal(),
34-
partnerId: filter.pathExists((id) => [
35-
node('node'),
36-
relation('out', '', 'partnership', ACTIVE),
37-
node('', 'Partnership'),
38-
relation('out', '', 'partner', ACTIVE),
39-
node('', 'Partner', { id }),
40-
]),
41-
userId: ({ value }) => ({
42-
userId: [
43-
// TODO We can leak if the project includes this person, if the
44-
// requesting user does not have access to view the project's members.
45-
path([
46-
node('node'),
47-
relation('out', '', 'member', ACTIVE),
48-
node('', 'ProjectMember'),
49-
relation('out', '', 'user', ACTIVE),
50-
node('', 'User', { id: value }),
51-
]),
52-
// TODO does it make sense to include interns in this filter?
53-
path([
54-
node('node'),
55-
relation('out', '', 'engagement', ACTIVE),
56-
node('', 'Engagement'),
57-
relation('out', '', 'intern', ACTIVE),
58-
node('', 'User', { id: value }),
59-
]),
60-
],
61-
}),
62-
languageId: filter.pathExists((id) => [
63-
node('node'),
64-
relation('out', '', 'engagement', ACTIVE),
65-
node('', 'LanguageEngagement'),
66-
relation('out', '', 'language', ACTIVE),
67-
node('', 'Language', { id }),
68-
]),
69-
sensitivity:
70-
({ value, query }) =>
71-
() =>
72-
value
73-
? query
74-
.apply(matchProjectSens('node'))
75-
.with('*')
76-
.where({ sensitivity: inArray(value) })
77-
: query,
78-
});
5+
export const projectFilters = filter.define(() => ProjectFilters, {
6+
type: filter.stringListBaseNodeProp(),
7+
status: filter.stringListProp(),
8+
onlyMultipleEngagements:
9+
({ value, query }) =>
10+
() =>
11+
value
12+
? query
13+
.match([
14+
node('node'),
15+
relation('out', '', 'engagement', ACTIVE),
16+
node('engagement', 'Engagement'),
17+
])
18+
.with('node, count(engagement) as engagementCount')
19+
.where({ engagementCount: greaterThan(1) })
20+
: null,
21+
step: filter.stringListProp(),
22+
createdAt: filter.dateTimeBaseNodeProp(),
23+
modifiedAt: filter.dateTimeProp(),
24+
mine: filter.pathExistsWhenTrue([
25+
node('requestingUser'),
26+
relation('in', '', 'user'),
27+
node('', 'ProjectMember'),
28+
relation('in', '', 'member'),
29+
node('node'),
30+
]),
31+
pinned: filter.isPinned,
32+
presetInventory: filter.propVal(),
33+
partnerId: filter.pathExists((id) => [
34+
node('node'),
35+
relation('out', '', 'partnership', ACTIVE),
36+
node('', 'Partnership'),
37+
relation('out', '', 'partner', ACTIVE),
38+
node('', 'Partner', { id }),
39+
]),
40+
userId: ({ value }) => ({
41+
userId: [
42+
// TODO We can leak if the project includes this person, if the
43+
// requesting user does not have access to view the project's members.
44+
path([
45+
node('node'),
46+
relation('out', '', 'member', ACTIVE),
47+
node('', 'ProjectMember'),
48+
relation('out', '', 'user', ACTIVE),
49+
node('', 'User', { id: value }),
50+
]),
51+
// TODO does it make sense to include interns in this filter?
52+
path([
53+
node('node'),
54+
relation('out', '', 'engagement', ACTIVE),
55+
node('', 'Engagement'),
56+
relation('out', '', 'intern', ACTIVE),
57+
node('', 'User', { id: value }),
58+
]),
59+
],
60+
}),
61+
languageId: filter.pathExists((id) => [
62+
node('node'),
63+
relation('out', '', 'engagement', ACTIVE),
64+
node('', 'LanguageEngagement'),
65+
relation('out', '', 'language', ACTIVE),
66+
node('', 'Language', { id }),
67+
]),
68+
sensitivity:
69+
({ value, query }) =>
70+
() =>
71+
value
72+
? query
73+
.apply(matchProjectSens('node'))
74+
.with('*')
75+
.where({ sensitivity: inArray(value) })
76+
: query,
77+
});

src/components/project/project.repository.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import {
3838
stepToStatus,
3939
UpdateProject,
4040
} from './dto';
41-
import { projectListFilter } from './list-filter.query';
41+
import { projectFilters } from './list-filter.query';
4242

4343
@Injectable()
4444
export class ProjectRepository extends CommonRepository {
@@ -285,7 +285,7 @@ export class ProjectRepository extends CommonRepository {
285285
.matchNode('node', 'Project')
286286
.with('distinct(node) as node, node as project')
287287
.match(requestingUser(session))
288-
.apply(projectListFilter(input))
288+
.apply(projectFilters(input.filter))
289289
.apply(this.privileges.for(session, IProject).filterToReadable())
290290
.apply(sortWith(projectSorters, input))
291291
.apply(paginate(input, this.hydrate(session.userId)))

0 commit comments

Comments
 (0)