Skip to content

Commit 20cf246

Browse files
committed
fix(FilterHelper): Pass only that filter args which exist in model to mongoose.query.where(...)
1 parent fba8fc9 commit 20cf246

File tree

4 files changed

+23
-10
lines changed

4 files changed

+23
-10
lines changed

src/__mocks__/mongooseCommon.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ function dropDBs(done) {
2323
});
2424
}
2525

26+
process.on('exit', () => { dropDBs(); });
27+
process.on('uncaughtException', () => { dropDBs(); });
28+
process.on('SIGINT', () => { dropDBs(); });
29+
2630
export {
2731
mongoose,
2832
Schema,

src/definition.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ export type MongooseQuery = {
7474
update(data: ObjectMap): MongooseQuery,
7575
remove(conditions: ?Object, options?: Object): MongooseQuery,
7676
count(conditions: ?Object): MongooseQuery,
77+
schema: MongooseModelSchemaT,
7778
};
7879

7980
export type MongoseDocument = {

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,12 +174,16 @@ describe('Resolver helper `filter` ->', () => {
174174
beforeEach(() => {
175175
spyWhereFn = spy((queryObj) => {
176176
spyWhere2Fn = spy();
177-
return { where: spyWhere2Fn };
177+
return {
178+
...UserModel.find(),
179+
where: spyWhere2Fn,
180+
};
178181
});
179182

180183
spyFindFn = spy();
181184
resolveParams = {
182185
query: {
186+
...UserModel.find(),
183187
where: spyWhereFn,
184188
find: spyFindFn,
185189
},

src/resolvers/helpers/filter.js

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -97,18 +97,22 @@ export const filterHelperArgs = (
9797
};
9898

9999
export function filterHelper(resolveParams: ExtendedResolveParams): void {
100+
// $FlowFixMe
100101
const filter = resolveParams.args && resolveParams.args.filter;
101102
if (filter && typeof filter === 'object' && Object.keys(filter).length > 0) {
102-
if (!filter[OPERATORS_FIELDNAME]) {
103-
resolveParams.query = resolveParams.query.where(toDottedObject(filter)); // eslint-disable-line
104-
} else {
105-
const operatorFields = Object.assign({}, filter[OPERATORS_FIELDNAME]);
106-
const simpleFields = Object.assign({}, filter);
107-
delete simpleFields[OPERATORS_FIELDNAME];
108-
109-
if (Object.keys(simpleFields).length > 0) {
110-
resolveParams.query = resolveParams.query.where(toDottedObject(simpleFields)); // eslint-disable-line
103+
const modelFields = resolveParams.query.schema.paths;
104+
const clearedFilter = {};
105+
Object.keys(filter).forEach((key) => {
106+
if (modelFields[key]) {
107+
clearedFilter[key] = filter[key];
111108
}
109+
})
110+
if (Object.keys(clearedFilter).length > 0) {
111+
resolveParams.query = resolveParams.query.where(toDottedObject(clearedFilter)); // eslint-disable-line
112+
}
113+
114+
if (filter[OPERATORS_FIELDNAME]) {
115+
const operatorFields = filter[OPERATORS_FIELDNAME];
112116
Object.keys(operatorFields).forEach(fieldName => {
113117
const fieldOperators = Object.assign({}, operatorFields[fieldName]);
114118
const criteria = {};

0 commit comments

Comments
 (0)