Skip to content

Commit 5aea858

Browse files
committed
feat(FilterHelper): Add _ids field to filter argument for findMany, removeMany, updateMany resolvers
1 parent 6c321b7 commit 5aea858

File tree

2 files changed

+44
-12
lines changed

2 files changed

+44
-12
lines changed

src/resolvers/helpers/__tests__/filter-test.js

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@ import {
88
addFieldsWithOperator,
99
OPERATORS_FIELDNAME,
1010
} from '../filter';
11+
import GraphQLMongoID from '../../../types/mongoid';
1112
import { UserModel } from '../../../__mocks__/userModel';
1213
import { composeWithMongoose } from '../../../composeWithMongoose';
1314
import typeStorage from '../../../typeStorage';
1415

15-
const { GraphQLInputObjectType, GraphQLNonNull } = graphql;
16+
const { GraphQLInputObjectType, GraphQLNonNull, GraphQLList } = graphql;
1617

1718
describe('Resolver helper `filter` ->', () => {
1819
let UserTypeComposer;
@@ -111,6 +112,15 @@ describe('Resolver helper `filter` ->', () => {
111112
expect(args.filter.type).toBeInstanceOf(GraphQLInputObjectType);
112113
});
113114

115+
it('should return filter with field _ids', () => {
116+
const args = filterHelperArgs(UserTypeComposer, UserModel, {
117+
filterTypeName: 'FilterUserType',
118+
});
119+
const itc = new InputTypeComposer(args.filter.type);
120+
expect(itc.getFieldType('_ids')).toBeInstanceOf(GraphQLList);
121+
expect(itc.getFieldType('_ids').ofType).toBe(GraphQLMongoID);
122+
});
123+
114124
it('should for opts.isRequired=true return GraphQLNonNull', () => {
115125
const args = filterHelperArgs(UserTypeComposer, UserModel, {
116126
filterTypeName: 'FilterUserType',
@@ -172,17 +182,12 @@ describe('Resolver helper `filter` ->', () => {
172182

173183
describe('filterHelper()', () => {
174184
let spyWhereFn;
175-
let spyWhere2Fn;
176185
let spyFindFn;
177186
let resolveParams: any;
178187

179188
beforeEach(() => {
180189
spyWhereFn = jest.fn(() => {
181-
spyWhere2Fn = jest.fn();
182-
return {
183-
...UserModel.find(),
184-
where: spyWhere2Fn,
185-
};
190+
return resolveParams.query;
186191
});
187192

188193
spyFindFn = jest.fn();
@@ -208,6 +213,17 @@ describe('Resolver helper `filter` ->', () => {
208213
expect(spyWhereFn).toBeCalledWith({ name: 'nodkz' });
209214
});
210215

216+
it('should call query.where if args.filter provided with _ids', () => {
217+
resolveParams.args = {
218+
filter: {
219+
age: 30,
220+
_ids: [1, 2, 3],
221+
},
222+
};
223+
filterHelper(resolveParams);
224+
expect(spyWhereFn.mock.calls).toEqual([[{ _id: { $in: [1, 2, 3] } }], [{ age: 30 }]]);
225+
});
226+
211227
it('should convert deep object in args.filter to dotted object', () => {
212228
resolveParams.args = {
213229
filter: {
@@ -246,8 +262,10 @@ describe('Resolver helper `filter` ->', () => {
246262
};
247263

248264
filterHelper(resolveParams);
249-
expect(spyWhereFn).toBeCalledWith({ age: { $gt: 10, $lt: 20 } });
250-
expect(spyWhere2Fn).toBeCalledWith({ age: { max: 30 }, active: true });
265+
expect(spyWhereFn.mock.calls).toEqual([
266+
[{ age: { $gt: 10, $lt: 20 } }],
267+
[{ active: true, age: { max: 30 } }],
268+
]);
251269
});
252270
});
253271
});

src/resolvers/helpers/filter.js

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import { TypeComposer, InputTypeComposer, isObject, graphql } from 'graphql-compose';
55
import { getIndexesFromModel } from '../../utils/getIndexesFromModel';
6+
import GraphQLMongoID from '../../types/mongoid';
67
import { toMongoDottedObject, upperFirst } from '../../utils';
78
import typeStorage from '../../typeStorage';
89
import type {
@@ -55,6 +56,11 @@ export const filterHelperArgs = (
5556

5657
const filterTypeName: string = opts.filterTypeName;
5758
const inputComposer = typeComposer.getInputTypeComposer().clone(filterTypeName);
59+
60+
inputComposer.addFields({
61+
_ids: new GraphQLList(GraphQLMongoID),
62+
});
63+
5864
inputComposer.removeField(removeFields);
5965

6066
if (opts.requiredFields) {
@@ -88,14 +94,22 @@ export function filterHelper(resolveParams: ExtendedResolveParams): void {
8894
const filter = resolveParams.args && resolveParams.args.filter;
8995
if (filter && typeof filter === 'object' && Object.keys(filter).length > 0) {
9096
const modelFields = resolveParams.query.schema.paths;
97+
98+
const { _ids, ...filterFields } = filter;
99+
if (_ids && Array.isArray(_ids)) {
100+
// eslint-disable-next-line
101+
resolveParams.query = resolveParams.query.where({ _id: { $in: _ids } });
102+
}
103+
91104
const clearedFilter = {};
92-
Object.keys(filter).forEach(key => {
105+
Object.keys(filterFields).forEach(key => {
93106
if (modelFields[key]) {
94-
clearedFilter[key] = filter[key];
107+
clearedFilter[key] = filterFields[key];
95108
}
96109
});
97110
if (Object.keys(clearedFilter).length > 0) {
98-
resolveParams.query = resolveParams.query.where(toMongoDottedObject(clearedFilter)); // eslint-disable-line
111+
// eslint-disable-next-line
112+
resolveParams.query = resolveParams.query.where(toMongoDottedObject(clearedFilter));
99113
}
100114

101115
if (filter[OPERATORS_FIELDNAME]) {

0 commit comments

Comments
 (0)