Skip to content

Commit 8437357

Browse files
fix(connection): Add customization options to connection resolver (#218)
* Add customization options to connection resolver * fix: flow type checking * chore: add tests Co-authored-by: Michael Beaumont <[email protected]>
1 parent f1c2bb1 commit 8437357

File tree

5 files changed

+75
-23
lines changed

5 files changed

+75
-23
lines changed

src/composeWithMongoose.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
ObjectTypeComposer,
55
} from 'graphql-compose';
66
import { Document, Model } from 'mongoose';
7-
import { ConnectionSortMapOpts } from './resolvers/connection';
7+
import { ConnectionOpts } from './resolvers/connection';
88
import {
99
FilterHelperArgsOpts,
1010
LimitHelperArgsOpts,
@@ -107,7 +107,7 @@ export type TypeConverterResolversOpts = {
107107
| {
108108
filter?: FilterHelperArgsOpts | false;
109109
};
110-
connection?: ConnectionSortMapOpts | false;
110+
connection?: ConnectionOpts | false;
111111
pagination?: PaginationResolverOpts | false;
112112
};
113113

src/composeWithMongoose.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import type {
1414
} from './resolvers/helpers';
1515
import MongoID from './types/mongoid';
1616
import type { PaginationResolverOpts } from './resolvers/pagination';
17-
import type { ConnectionSortMapOpts } from './resolvers/connection';
17+
import type { ConnectionOpts } from './resolvers/connection';
1818

1919
export type ComposeWithMongooseOpts<TContext> = {|
2020
schemaComposer?: SchemaComposer<TContext>,
@@ -111,7 +111,7 @@ export type TypeConverterResolversOpts = {
111111
| {
112112
filter?: FilterHelperArgsOpts | false,
113113
},
114-
connection?: ConnectionSortMapOpts | false,
114+
connection?: ConnectionOpts<any> | false,
115115
pagination?: PaginationResolverOpts | false,
116116
};
117117

src/resolvers/__tests__/connection-test.js

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -140,26 +140,38 @@ describe('connection() resolver', () => {
140140
await user2.save();
141141
});
142142

143-
it('should return Resolver object', () => {
143+
it('should return Resolver object with default name', () => {
144144
const resolver = connection(UserModel, UserTC);
145+
if (!resolver) throw new Error('Connection resolver is undefined');
145146
expect(resolver).toBeInstanceOf(Resolver);
147+
expect(resolver.getNestedName()).toEqual('connection');
148+
});
149+
150+
it('should return Resolver object with custom name', () => {
151+
const resolver = connection(UserModel, UserTC, {
152+
// $FlowFixMe
153+
connectionResolverName: 'customConnection',
154+
});
155+
if (!resolver) throw new Error('Connection resolver is undefined');
156+
expect(resolver).toBeInstanceOf(Resolver);
157+
expect(resolver.getNestedName()).toEqual('customConnection');
146158
});
147159

148160
it('Resolver object should have `filter` arg', () => {
149161
const resolver = connection(UserModel, UserTC);
150-
if (!resolver) throw new Error('Connection resolveris undefined');
162+
if (!resolver) throw new Error('Connection resolver is undefined');
151163
expect(resolver.hasArg('filter')).toBe(true);
152164
});
153165

154166
it('Resolver object should have `sort` arg', () => {
155167
const resolver = connection(UserModel, UserTC);
156-
if (!resolver) throw new Error('Connection resolveris undefined');
168+
if (!resolver) throw new Error('Connection resolver is undefined');
157169
expect(resolver.hasArg('sort')).toBe(true);
158170
});
159171

160172
it('Resolver object should have `connection args', () => {
161173
const resolver = connection(UserModel, UserTC);
162-
if (!resolver) throw new Error('Connection resolveris undefined');
174+
if (!resolver) throw new Error('Connection resolver is undefined');
163175
expect(resolver.hasArg('first')).toBe(true);
164176
expect(resolver.hasArg('last')).toBe(true);
165177
expect(resolver.hasArg('before')).toBe(true);
@@ -169,14 +181,14 @@ describe('connection() resolver', () => {
169181
describe('Resolver.resolve():Promise', () => {
170182
it('should be fulfilled Promise', async () => {
171183
const resolver = connection(UserModel, UserTC);
172-
if (!resolver) throw new Error('Connection resolveris undefined');
184+
if (!resolver) throw new Error('Connection resolver is undefined');
173185
const result = resolver.resolve({ args: { first: 20 } });
174186
await expect(result).resolves.toBeDefined();
175187
});
176188

177189
it('should return array of documents in `edges`', async () => {
178190
const resolver = connection(UserModel, UserTC);
179-
if (!resolver) throw new Error('Connection resolveris undefined');
191+
if (!resolver) throw new Error('Connection resolver is undefined');
180192
const result = await resolver.resolve({ args: { first: 20 } });
181193

182194
expect(result.edges).toBeInstanceOf(Array);
@@ -188,7 +200,7 @@ describe('connection() resolver', () => {
188200

189201
it('should limit records', async () => {
190202
const resolver = connection(UserModel, UserTC);
191-
if (!resolver) throw new Error('Connection resolveris undefined');
203+
if (!resolver) throw new Error('Connection resolver is undefined');
192204
const result = await resolver.resolve({ args: { first: 1 } });
193205

194206
expect(result.edges).toBeInstanceOf(Array);
@@ -197,7 +209,7 @@ describe('connection() resolver', () => {
197209

198210
it('should sort records', async () => {
199211
const resolver = connection(UserModel, UserTC);
200-
if (!resolver) throw new Error('Connection resolveris undefined');
212+
if (!resolver) throw new Error('Connection resolver is undefined');
201213

202214
const result1 = await resolver.resolve({
203215
args: { sort: { _id: 1 }, first: 1 },
@@ -212,7 +224,7 @@ describe('connection() resolver', () => {
212224

213225
it('should return mongoose documents', async () => {
214226
const resolver = connection(UserModel, UserTC);
215-
if (!resolver) throw new Error('Connection resolveris undefined');
227+
if (!resolver) throw new Error('Connection resolver is undefined');
216228

217229
const result = await resolver.resolve({ args: { first: 20 } });
218230
expect(result.edges[0].node).toBeInstanceOf(UserModel);
@@ -275,6 +287,24 @@ describe('connection() resolver', () => {
275287

276288
expect(result).toHaveProperty('edges.0.node', { overrides: true });
277289
});
290+
291+
it('should return mongoose documents for custom resolvers from opts', async () => {
292+
schemaComposer.clear();
293+
UserTC = convertModelToGraphQL(UserModel, 'User', schemaComposer);
294+
UserTC.setResolver('customFindMany', findMany(UserModel, UserTC));
295+
UserTC.setResolver('customCount', count(UserModel, UserTC));
296+
const resolver = connection(UserModel, UserTC, {
297+
// $FlowFixMe
298+
findResolverName: 'customFindMany',
299+
// $FlowFixMe
300+
countResolverName: 'customCount',
301+
});
302+
if (!resolver) throw new Error('Connection resolver is undefined');
303+
304+
const result = await resolver.resolve({ args: { first: 20 } });
305+
expect(result.edges[0].node).toBeInstanceOf(UserModel);
306+
expect(result.edges[1].node).toBeInstanceOf(UserModel);
307+
});
278308
});
279309
});
280310
});

src/resolvers/connection.d.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Resolver, ObjectTypeComposer } from 'graphql-compose';
1+
import { Resolver, ObjectTypeComposer, ObjectTypeComposerFieldConfigMap } from 'graphql-compose';
22
// import { ConnectionSortMapOpts } from 'graphql-compose-connection';
33
import { Model } from 'mongoose';
44
import { MongoId } from '../types/mongoid';
@@ -7,12 +7,17 @@ import { FilterHelperArgs, SortHelperArgs } from './helpers';
77

88
// @ts-todo The ConnectionSortMapOpts is not available yet since graphql-compose-connection doesn't have types for now,
99
// fallback to a simple object.
10-
export type ConnectionSortMapOpts = { [opt: string]: any };
10+
export type ConnectionOpts<TContext = any> = { [opt: string]: any } & {
11+
connectionResolverName?: string,
12+
findResolverName?: string;
13+
countResolverName?: string;
14+
edgeFields?: ObjectTypeComposerFieldConfigMap<any, TContext>;
15+
};
1116

1217
export default function connection(
1318
model: Model<any>,
1419
tc: ObjectTypeComposer<any>,
15-
opts?: ConnectionSortMapOpts,
20+
opts?: ConnectionOpts<any>,
1621
): Resolver<any, any> | undefined;
1722

1823
export function prepareCursorQuery(

src/resolvers/connection.js

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,28 @@
33

44
import type { MongooseDocument } from 'mongoose';
55
import type { ConnectionSortMapOpts as _ConnectionSortMapOpts } from 'graphql-compose-connection';
6-
import type { Resolver, ObjectTypeComposer } from 'graphql-compose';
6+
import type {
7+
Resolver,
8+
ObjectTypeComposer,
9+
ObjectTypeComposerFieldConfigMap,
10+
} from 'graphql-compose';
711
import {
812
getUniqueIndexes,
913
extendByReversedIndexes,
1014
type IndexT,
1115
} from '../utils/getIndexesFromModel';
1216

13-
export type ConnectionSortMapOpts = _ConnectionSortMapOpts;
17+
export type ConnectionOpts<TContext = any> = _ConnectionSortMapOpts & {
18+
edgeFields?: ObjectTypeComposerFieldConfigMap<any, TContext>,
19+
connectionResolverName?: string,
20+
findResolverName?: string,
21+
countResolverName?: string,
22+
};
1423

1524
export default function connection<TSource: MongooseDocument, TContext>(
1625
model: Class<TSource>, // === MongooseModel
1726
tc: ObjectTypeComposer<TSource, TContext>,
18-
opts?: ConnectionSortMapOpts
27+
opts?: ConnectionOpts<TContext>
1928
): ?Resolver<TSource, TContext> {
2029
try {
2130
require.resolve('graphql-compose-connection');
@@ -56,14 +65,22 @@ export default function connection<TSource: MongooseDocument, TContext>(
5665
},
5766
};
5867
});
59-
68+
const {
69+
connectionResolverName = 'connection',
70+
findResolverName = 'findMany',
71+
countResolverName = 'count',
72+
edgeFields,
73+
...sortOptions
74+
} = opts || {};
6075
return prepareConnectionResolver(tc, {
61-
findResolverName: 'findMany',
62-
countResolverName: 'count',
76+
connectionResolverName,
77+
findResolverName,
78+
countResolverName,
6379
sort: {
6480
...sortConfigs,
65-
...opts,
81+
...sortOptions,
6682
},
83+
edgeFields,
6784
});
6885
}
6986

0 commit comments

Comments
 (0)