Skip to content

Commit de1dca6

Browse files
committed
refactor: remove customizationOptions property from options
Converting a regular model to the discriminator model should be easy and without annoying config opts changes
1 parent bdee04a commit de1dca6

File tree

5 files changed

+56
-69
lines changed

5 files changed

+56
-69
lines changed

README.md

Lines changed: 38 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,9 @@ const User = mongoose.model('User', UserSchema);
9292
const customizationOptions = {}; // left it empty for simplicity, described below
9393
const UserTC = composeWithMongoose(User, customizationOptions);
9494

95-
// STEP 3: CREATE CRAZY GraphQL SCHEMA WITH ALL CRUD USER OPERATIONS
95+
// STEP 3: Add needed CRUD User operations to the GraphQL Schema
9696
// via graphql-compose it will be much much easier, with less typing
97-
schemaComposer.rootQuery().addFields({
97+
schemaComposer.Query.addFields({
9898
userById: UserTC.getResolver('findById'),
9999
userByIds: UserTC.getResolver('findByIds'),
100100
userOne: UserTC.getResolver('findOne'),
@@ -104,7 +104,7 @@ schemaComposer.rootQuery().addFields({
104104
userPagination: UserTC.getResolver('pagination'),
105105
});
106106

107-
schemaComposer.rootMutation().addFields({
107+
schemaComposer.Mutation.addFields({
108108
userCreate: UserTC.getResolver('createOne'),
109109
userUpdateById: UserTC.getResolver('updateById'),
110110
userUpdateOne: UserTC.getResolver('updateOne'),
@@ -123,71 +123,68 @@ I don't think so, because by default internally was created about 55 graphql typ
123123

124124

125125
### Working with Mongoose Collection Level Discriminators
126-
Variable Namings
127-
* `...DTC` - Suffix for a `DiscriminatorTypeComposer` instance, which is also an instance of `TypeComposer`. All fields and Relations manipulations on this instance affects all registered discriminators and the Discriminator Interface.
126+
Variable Namings
127+
* `...DTC` - Suffix for a `DiscriminatorTypeComposer` instance, which is also an instance of `TypeComposer`. All fields and Relations manipulations on this instance affects all registered discriminators and the Discriminator Interface.
128128

129129
```js
130130
import mongoose from 'mongoose';
131-
import { schemaComposer } from 'graphql-composer';
131+
import { schemaComposer } from 'graphql-compose';
132132
import { composeWithMongooseDiscriminators } from 'graphql-compose-mongoose';
133-
133+
134134
// pick a discriminatorKey
135135
const DKey = 'type';
136-
136+
137137
const enumCharacterType = {
138138
PERSON: 'Person',
139139
DROID: 'Droid',
140140
};
141-
141+
142142
// DEFINE BASE SCHEMA
143143
const CharacterSchema = new mongoose.Schema({
144144
// _id: field...
145-
name: String,
146-
147145
type: {
148146
type: String,
149147
require: true,
150148
enum: (Object.keys(enumCharacterType): Array<string>),
149+
description: 'Character type Droid or Person',
151150
},
152-
153-
friends: [String], // another Character
154-
appearsIn: [String], // movie
151+
152+
name: String,
153+
height: Number,
154+
mass: Number,
155+
films: [String],
155156
});
156-
157+
157158
// DEFINE DISCRIMINATOR SCHEMAS
158-
const DroidSchema = new Schema({
159-
makeDate: Date,
160-
modelNumber: Number,
159+
const DroidSchema = new mongoose.Schema({
160+
makeDate: String,
161161
primaryFunction: [String],
162162
});
163-
164-
const PersonSchema = new Schema({
165-
dob: Number,
166-
starShips: [String],
167-
totalCredits: Number,
163+
164+
const PersonSchema = new mongoose.Schema({
165+
gender: String,
166+
hairColor: String,
167+
starships: [String],
168168
});
169-
169+
170170
// set discriminator Key
171171
CharacterSchema.set('discriminatorKey', DKey);
172-
172+
173173
// create base Model
174174
const CharacterModel = mongoose.model('Character', CharacterSchema);
175-
175+
176176
// create mongoose discriminator models
177177
const DroidModel = CharacterModel.discriminator(enumCharacterType.DROID, DroidSchema);
178178
const PersonModel = CharacterModel.discriminator(enumCharacterType.PERSON, PersonSchema);
179-
179+
180180
// create DiscriminatorTypeComposer
181-
// discrimatorOptions
182-
const baseOptions = {
183-
customizationOptions: { // regular TypeConverterOptions, passed to composeWithMongoose
184-
fields: {
185-
remove: ['friends'],
186-
}
181+
const baseOptions = { // regular TypeConverterOptions, passed to composeWithMongoose
182+
fields: {
183+
remove: ['friends'],
187184
}
188185
}
189186
const CharacterDTC = composeWithMongooseDiscriminators(CharacterModel, baseOptions);
190-
187+
191188
// create Discriminator Types
192189
const droidTypeConverterOptions = { // this options will be merged with baseOptions -> customisationsOptions
193190
fields: {
@@ -196,16 +193,16 @@ Variable Namings
196193
};
197194
const DroidTC = CharacterDTC.discriminator(DroidModel, droidTypeConverterOptions);
198195
const PersonTC = CharacterDTC.discriminator(PersonModel); // baseOptions -> customisationsOptions applied
199-
196+
200197
// You may now use CharacterDTC to add fields to all Discriminators
201198
// Use DroidTC, `PersonTC as any other TypeComposer.
202-
schemaComposer.rootMutation().addFields({
199+
schemaComposer.Mutation.addFields({
203200
droidCreate: DroidTC.getResolver('createOne'),
204201
personCreate: PersonTC.getResolver('createOne'),
205202
});
206-
203+
207204
const schema = schemaComposer.buildSchema();
208-
205+
209206
describe('createOne', () => {
210207
it('should create child document without specifying DKey', async () => {
211208
const res = await graphql.graphql(
@@ -243,7 +240,7 @@ Variable Namings
243240
});
244241
});
245242
});
246-
```
243+
```
247244

248245
## FAQ
249246

@@ -396,7 +393,7 @@ The typical implementation may be like this:
396393
// extend resolve params with hook
397394
rp.beforeRecordMutate = async function(doc, rp) {
398395
doc.userTouchedAt = new Date();
399-
396+
400397
const canMakeUpdate = await performAsyncTask( ...provide data from doc... )
401398
if (!canMakeUpdate) {
402399
throw new Error('Forbidden!');
@@ -427,7 +424,7 @@ function adminAccess(resolvers) {
427424

428425
// extend resolve params with hook
429426
rp.beforeRecordMutate = async function(doc, rp) { ... }
430-
427+
431428
return next(rp)
432429
})
433430
})
@@ -588,4 +585,3 @@ This plugin adds `pagination` resolver.
588585

589586
## License
590587
[MIT](https://github.com/graphql-compose/graphql-compose-mongoose/blob/master/LICENSE.md)
591-

src/__tests__/composeWithMongooseDiscriminators-test.js

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,9 @@ describe('composeWithMongooseDiscriminators ->', () => {
3333
describe('composeWithMongoose customisationOptions', () => {
3434
it('required input fields, should be passed down to resolvers', () => {
3535
const typeComposer = composeWithMongooseDiscriminators(CharacterModel, {
36-
customizationOptions: {
37-
inputType: {
38-
fields: {
39-
required: ['kind'],
40-
},
36+
inputType: {
37+
fields: {
38+
required: ['kind'],
4139
},
4240
},
4341
});
@@ -48,11 +46,9 @@ describe('composeWithMongooseDiscriminators ->', () => {
4846

4947
it('should proceed customizationOptions.inputType.fields.required', () => {
5048
const itc = composeWithMongooseDiscriminators(CharacterModel, {
51-
customizationOptions: {
52-
inputType: {
53-
fields: {
54-
required: ['name', 'friends'],
55-
},
49+
inputType: {
50+
fields: {
51+
required: ['name', 'friends'],
5652
},
5753
},
5854
}).getInputTypeComposer();

src/composeWithMongoose.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import MongoID from './types/mongoid';
1616
import type { PaginationResolverOpts } from './resolvers/pagination';
1717
import type { ConnectionSortMapOpts } from './resolvers/connection';
1818

19-
export type TypeConverterOpts = {
19+
export type TypeConverterOpts = {|
2020
schemaComposer?: SchemaComposer<any>,
2121
name?: string,
2222
description?: string,
@@ -27,7 +27,7 @@ export type TypeConverterOpts = {
2727
},
2828
inputType?: TypeConverterInputTypeOpts,
2929
resolvers?: false | TypeConverterResolversOpts,
30-
};
30+
|};
3131

3232
export type TypeConverterInputTypeOpts = {
3333
name?: string,
@@ -112,7 +112,7 @@ export type TypeConverterResolversOpts = {
112112

113113
export function composeWithMongoose(
114114
model: Object, // MongooseModel, TODO use Model from mongoose_v4.x.x definition when it will be public
115-
opts: TypeConverterOpts = {}
115+
opts: TypeConverterOpts = ({}: any)
116116
): TypeComposer {
117117
const name: string = (opts && opts.name) || model.modelName;
118118

src/discriminators/DiscriminatorTypeComposer.js

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ import { mergeCustomizationOptions } from './utils/mergeCustomizationOptions';
1919
import { prepareBaseResolvers } from './prepareBaseResolvers';
2020
import { reorderFields } from './utils/reorderFields';
2121

22-
export type DiscriminatorOptions = {
22+
export type DiscriminatorOptions = {|
2323
reorderFields?: boolean | string[], // true order: _id, DKey, DInterfaceFields, DiscriminatorFields
24-
customizationOptions?: TypeConverterOpts,
25-
};
24+
...TypeConverterOpts,
25+
|};
2626

2727
type Discriminators = {
2828
[DName: string]: any,
@@ -99,16 +99,14 @@ export class DiscriminatorTypeComposer<TContext> extends TypeComposerClass<TCont
9999

100100
opts = { // eslint-disable-line
101101
reorderFields: true,
102-
customizationOptions: {
103-
schemaComposer,
104-
},
102+
schemaComposer,
105103
...opts,
106104
};
107105

108-
const baseTC = composeWithMongoose(baseModel, opts.customizationOptions);
106+
const baseTC = composeWithMongoose(baseModel, opts);
109107

110108
const _DiscriminatorTypeComposer = this._getClassConnectedWithSchemaComposer(
111-
opts.customizationOptions && opts.customizationOptions.schemaComposer
109+
opts.schemaComposer
112110
);
113111
const baseDTC = new _DiscriminatorTypeComposer(baseTC.getType());
114112

@@ -332,10 +330,7 @@ export class DiscriminatorTypeComposer<TContext> extends TypeComposerClass<TCont
332330

333331
/* eslint no-use-before-define: 0 */
334332
discriminator(childModel: Class<Model>, opts?: TypeConverterOpts): TypeComposerClass<TContext> {
335-
const customizationOpts = mergeCustomizationOptions(
336-
(this.opts: any).customizationOptions,
337-
opts
338-
);
333+
const customizationOpts = mergeCustomizationOptions((this.opts: any), opts);
339334

340335
let childTC = composeWithMongoose(childModel, customizationOpts);
341336

src/discriminators/utils/mergeCustomizationOptions.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,12 @@ export function mergeFieldMaps(
8181
export function mergeCustomizationOptions(
8282
baseCOptions: TypeConverterOpts,
8383
childCOptions?: TypeConverterOpts
84-
): TypeConverterOpts | typeof undefined {
84+
): TypeConverterOpts | void {
8585
if (!baseCOptions) {
8686
return childCOptions;
8787
}
8888

89-
const mergedOptions = childCOptions || {};
89+
const mergedOptions: TypeConverterOpts = childCOptions || ({}: any);
9090

9191
if (
9292
baseCOptions.schemaComposer !== mergedOptions.schemaComposer &&

0 commit comments

Comments
 (0)