Skip to content

Commit 313ea1f

Browse files
committed
fix: filter _operator now works for nested fields
closes #304
1 parent 0c56023 commit 313ea1f

File tree

2 files changed

+39
-27
lines changed

2 files changed

+39
-27
lines changed

src/resolvers/helpers/filter.ts

Lines changed: 37 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
} from './filterOperators';
1212
import type { NestedAliasesMap } from './aliases';
1313
import { makeFieldsRecursiveNullable } from '../../utils/makeFieldsRecursiveNullable';
14+
import { mongoose } from 'src/__mocks__/mongooseCommon';
1415

1516
export type FilterHelperArgsOpts = {
1617
/**
@@ -130,41 +131,52 @@ export function filterHelper(
130131
): void {
131132
const filter = resolveParams.args?.filter;
132133
if (filter && typeof filter === 'object' && Object.keys(filter).length > 0) {
133-
const modelFields = (resolveParams.query as any)?.schema?.paths;
134+
const schemaFields = (resolveParams.query as any)?.schema?.paths;
134135

135136
const { _ids, ...filterFields } = filter;
136137
if (_ids && Array.isArray(_ids)) {
137138
resolveParams.query = resolveParams.query.where({ _id: { $in: _ids } });
138139
}
139140
processFilterOperators(filterFields);
140-
const clearedFilter: Record<string, any> = {};
141-
Object.keys(filterFields).forEach((key) => {
142-
const value = filterFields[key];
143-
if (key.startsWith('$')) {
144-
clearedFilter[key] = Array.isArray(value)
145-
? value.map((v) => toMongoFilterDottedObject(v, aliases))
146-
: toMongoFilterDottedObject(value, aliases);
147-
} else if (modelFields[key] || aliases?.[key]) {
148-
const alias = aliases?.[key];
149-
let newKey;
150-
let subAlias: NestedAliasesMap | undefined;
151-
if (typeof alias === 'string') {
152-
newKey = alias;
153-
} else if (isObject(alias)) {
154-
subAlias = alias;
155-
newKey = alias?.__selfAlias;
156-
} else {
157-
newKey = key;
158-
}
159-
toMongoFilterDottedObject(value, subAlias, clearedFilter, newKey);
160-
}
161-
});
162-
if (Object.keys(clearedFilter).length > 0) {
163-
resolveParams.query = resolveParams.query.where(clearedFilter);
141+
const mongooseFilter = convertFilterFields(filterFields, schemaFields, aliases);
142+
143+
if (Object.keys(mongooseFilter).length > 0) {
144+
resolveParams.query = resolveParams.query.where(mongooseFilter);
164145
}
165146
}
166147

167148
if (isObject(resolveParams.rawQuery)) {
168149
resolveParams.query = resolveParams.query.where(resolveParams.rawQuery);
169150
}
170151
}
152+
153+
function convertFilterFields(
154+
filterFields: Record<string, any>,
155+
schemaFields: { [key: string]: mongoose.SchemaType },
156+
aliases?: NestedAliasesMap
157+
) {
158+
const clearedFilter: Record<string, any> = {};
159+
Object.keys(filterFields).forEach((key) => {
160+
const value = filterFields[key];
161+
if (key.startsWith('$')) {
162+
clearedFilter[key] = Array.isArray(value)
163+
? value.map((v) => toMongoFilterDottedObject(v, aliases))
164+
: toMongoFilterDottedObject(value, aliases);
165+
} else if (schemaFields[key] || aliases?.[key] || isObject(value)) {
166+
const alias = aliases?.[key];
167+
let newKey;
168+
let subAlias: NestedAliasesMap | undefined;
169+
if (typeof alias === 'string') {
170+
newKey = alias;
171+
} else if (isObject(alias)) {
172+
subAlias = alias;
173+
newKey = alias?.__selfAlias;
174+
} else {
175+
newKey = key;
176+
}
177+
toMongoFilterDottedObject(value, subAlias, clearedFilter, newKey);
178+
}
179+
});
180+
181+
return clearedFilter;
182+
}

src/utils/toMongoDottedObject.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ function isPrimitive(value: any) {
1010
}
1111

1212
function _toMongoDottedObject(
13-
obj: any,
13+
obj: Record<string, any>,
1414
aliases: NestedAliasesMap | undefined,
1515
target: Record<string, any> = {},
1616
prefix: string = '',
1717
collapseArray = false
18-
) {
18+
): { [dottedPath: string]: any } {
1919
if (((!isObject(obj) as any) && !Array.isArray(obj)) || isPrimitive(obj)) {
2020
if (prefix) target[prefix] = obj;
2121
return obj;

0 commit comments

Comments
 (0)