Skip to content

Commit 0b64672

Browse files
committed
Add ConnectionResolver
1 parent 73ff780 commit 0b64672

File tree

4 files changed

+58
-12
lines changed

4 files changed

+58
-12
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"dependencies": {
2727
"graphql": "^0.5.0",
2828
"graphql-compose": ">=0.0.2",
29+
"graphql-compose-connection": "^0.0.1",
2930
"object-path": "^0.9.2",
3031
"mongoose": "^4.4.20"
3132
},

src/modelConverter.js renamed to src/composeWithMongoose.js

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import { convertModelToGraphQL } from './fieldsConverter';
55
import { TypeComposer, InputTypeComposer } from 'graphql-compose';
66
import * as resolvers from './resolvers';
7+
import composeWithConnection from 'graphql-compose-connection';
8+
import { OPERATORS_FIELDNAME } from './resolvers/helpers/filter';
79

810
import type {
911
MongooseModelT,
@@ -13,7 +15,7 @@ import type {
1315
} from './definition';
1416

1517

16-
export function mongooseModelToTypeComposer(
18+
export function composeWithMongoose(
1719
model: MongooseModelT,
1820
opts: typeConverterOpts = {}
1921
): TypeComposer {
@@ -111,12 +113,55 @@ export function createResolvers(
111113
names.forEach(resolverName => {
112114
if (!opts.hasOwnProperty(resolverName) || opts[resolverName] !== false) {
113115
const createResolverFn = resolvers[resolverName];
114-
const resolver = createResolverFn(
115-
model,
116-
typeComposer,
117-
opts[resolverName] || {}
118-
);
119-
typeComposer.setResolver(resolver);
116+
if (createResolverFn) {
117+
const resolver = createResolverFn(
118+
model,
119+
typeComposer,
120+
opts[resolverName] || {}
121+
);
122+
typeComposer.setResolver(resolver);
123+
}
120124
}
121125
});
126+
127+
if (!opts.hasOwnProperty('connection') || opts['connection'] !== false) {
128+
prepareConnectionResolver(typeComposer, opts['connection']);
129+
}
130+
}
131+
132+
export function prepareConnectionResolver(typeComposer: TypeComposer, opts) {
133+
composeWithConnection(typeComposer, {
134+
findResolverName: 'findMany',
135+
countResolverName: 'count',
136+
sort: {
137+
_ID_DESC: {
138+
uniqueFields: ['_id'],
139+
sortValue: { _id: -1 },
140+
directionFilter: (cursorData, filter, isBefore) => {
141+
filter[OPERATORS_FIELDNAME] = filter[OPERATORS_FIELDNAME] || {};
142+
filter[OPERATORS_FIELDNAME]._id = filter[OPERATORS_FIELDNAME]._id || {};
143+
if (isBefore) {
144+
filter[OPERATORS_FIELDNAME]._id.gt = cursorData._id;
145+
} else {
146+
filter[OPERATORS_FIELDNAME]._id.lt = cursorData._id;
147+
}
148+
return filter;
149+
},
150+
},
151+
_ID_ASC: {
152+
uniqueFields: ['_id'],
153+
sortValue: { _id: 1 },
154+
directionFilter: (cursorData, filter, isBefore) => {
155+
filter[OPERATORS_FIELDNAME] = filter[OPERATORS_FIELDNAME] || {};
156+
filter[OPERATORS_FIELDNAME]._id = filter[OPERATORS_FIELDNAME]._id || {};
157+
if (isBefore) {
158+
filter[OPERATORS_FIELDNAME]._id.lt = cursorData._id;
159+
} else {
160+
filter[OPERATORS_FIELDNAME]._id.gt = cursorData._id;
161+
}
162+
return filter;
163+
},
164+
}
165+
},
166+
})
122167
}

src/definition.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,12 @@ export type MongooseFieldMapT = { [fieldName: string]: MongooseFieldT };
4949
export type ResolverNames = 'findById' | 'findByIds' | 'findOne' | 'findMany' |
5050
'updateById' | 'updateOne' | 'updateMany' |
5151
'removeById' | 'removeOne' | 'removeMany' |
52-
'createOne' | 'count';
52+
'createOne' | 'count' | 'connection';
5353

5454
export type MongooseQuery = {
5555
exec(): Promise<any>,
56-
where(criteria: ObjectMap): MongooseQuery,
56+
where(criteriaOrFieldName: ObjectMap | string): MongooseQuery,
5757
where(fieldName: string, equalTo: string): MongooseQuery,
58-
where(fieldName: string): MongooseQuery,
5958
skip(num: number): MongooseQuery,
6059
limit(num: number): MongooseQuery,
6160
select(projection: ObjectMap): MongooseQuery,
@@ -173,6 +172,7 @@ export type typeConverterResolversOpts = {
173172
count?: false | {
174173
filter?: filterHelperArgsOpts | false,
175174
},
175+
connection?: false,
176176
};
177177

178178
export type filterHelperArgsOpts = {

src/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* @flow */
22

3-
import { mongooseModelToTypeComposer } from './modelConverter';
3+
import { composeWithMongoose } from './composeWithMongoose';
44

5-
export default mongooseModelToTypeComposer;
5+
export default composeWithMongoose;

0 commit comments

Comments
 (0)