Skip to content

Commit 249d157

Browse files
authored
Merge pull request #3276 from SeedCompany/engagement-date-filters
2 parents 46f9805 + 88a9b52 commit 249d157

File tree

3 files changed

+74
-18
lines changed

3 files changed

+74
-18
lines changed

src/components/engagement/dto/list-engagements.dto.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import { Field, InputType, ObjectType } from '@nestjs/graphql';
2+
import { Type } from 'class-transformer';
3+
import { ValidateNested } from 'class-validator';
24
import {
5+
DateFilter,
36
FilterField,
47
ID,
58
PaginatedList,
@@ -56,6 +59,20 @@ export abstract class EngagementFilters {
5659
readonly intern?: UserFilters & {};
5760

5861
readonly partnerId?: ID<'Partner'>;
62+
63+
@Field({
64+
nullable: true,
65+
})
66+
@Type(() => DateFilter)
67+
@ValidateNested()
68+
readonly startDate?: DateFilter;
69+
70+
@Field({
71+
nullable: true,
72+
})
73+
@Type(() => DateFilter)
74+
@ValidateNested()
75+
readonly endDate?: DateFilter;
5976
}
6077

6178
@InputType()

src/components/engagement/engagement.repository.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,40 @@ export const engagementFilters = filter.define(() => EngagementFilters, {
619619
node('node', 'User'),
620620
]),
621621
),
622+
startDate: filter.dateTime(({ query }) => {
623+
query.optionalMatch([
624+
[
625+
node('node'),
626+
relation('out', '', 'startDateOverride', ACTIVE),
627+
node('startDateOverride', 'Property'),
628+
],
629+
[
630+
node('node'),
631+
relation('in', '', 'engagement'),
632+
node('project', 'Project'),
633+
relation('out', '', 'mouStart', ACTIVE),
634+
node('mouStart', 'Property'),
635+
],
636+
]);
637+
return coalesce('startDateOverride.value', 'mouStart.value');
638+
}),
639+
endDate: filter.dateTime(({ query }) => {
640+
query.optionalMatch([
641+
[
642+
node('node'),
643+
relation('out', '', 'endDateOverride', ACTIVE),
644+
node('endDateOverride', 'Property'),
645+
],
646+
[
647+
node('node'),
648+
relation('in', '', 'engagement'),
649+
node('project', 'Project'),
650+
relation('out', '', 'mouEnd', ACTIVE),
651+
node('mouEnd', 'Property'),
652+
],
653+
]);
654+
return coalesce('endDateOverride.value', 'mouEnd.value');
655+
}),
622656
});
623657

624658
export const engagementSorters = defineSorters(IEngagement, {

src/core/database/query/filters.ts

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -188,30 +188,35 @@ export const isPinned = pathExists<{ pinned?: boolean }, 'pinned'>([
188188
node('node'),
189189
]);
190190

191-
export const dateTimeBaseNodeProp =
192-
<T, K extends ConditionalKeys<T, DateTimeFilter | undefined>>(
193-
prop?: string,
194-
): Builder<T, K> =>
195-
({ key, value }) => {
196-
const comparison = comparisonOfDateTimeFilter(value);
197-
return comparison ? { node: { [prop ?? key]: comparison } } : null;
198-
};
191+
export const dateTimeBaseNodeProp = <
192+
T,
193+
K extends ConditionalKeys<T, DateTimeFilter | undefined>,
194+
>(
195+
prop?: string,
196+
): Builder<T, K> => dateTime(({ key }) => `node.${prop ?? key}`);
199197

200-
export const dateTimeProp =
201-
<T, K extends ConditionalKeys<T, DateTimeFilter | undefined>>(
202-
prop?: string,
203-
): Builder<T, K> =>
204-
({ key, value, query }) => {
205-
const comparison = comparisonOfDateTimeFilter(value);
206-
if (!comparison) {
207-
return null;
208-
}
198+
export const dateTimeProp = <
199+
T,
200+
K extends ConditionalKeys<T, DateTimeFilter | undefined>,
201+
>(
202+
prop?: string,
203+
): Builder<T, K> =>
204+
dateTime(({ key, query }) => {
209205
query.match([
210206
node('node'),
211207
relation('out', '', prop ?? key, ACTIVE),
212208
node(prop ?? key, 'Property'),
213209
]);
214-
return { [prop ?? key]: { value: comparison } };
210+
return `${prop ?? key}.value`;
211+
});
212+
213+
export const dateTime =
214+
<T, K extends ConditionalKeys<T, DateTimeFilter | undefined>>(
215+
getLhs: (args: BuilderArgs<T, K>) => string,
216+
): Builder<T, K> =>
217+
(args) => {
218+
const comparator = comparisonOfDateTimeFilter(args.value);
219+
return comparator ? { [getLhs(args)]: comparator } : null;
215220
};
216221

217222
export const comparisonOfDateTimeFilter = (

0 commit comments

Comments
 (0)