Skip to content

Commit 187bf05

Browse files
committed
Rollback storing generated type in model. Add convertSchemaToGraphQL with storing generated type.
1 parent 31c770a commit 187bf05

File tree

2 files changed

+35
-12
lines changed

2 files changed

+35
-12
lines changed

src/definition.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,21 @@ export type MongooseModelSchemaT = {
1515
[optName: string]: MongooseFieldT,
1616
},
1717
_indexes?: MonooseModelIndex[],
18+
_gqcTypeComposer?: TypeComposer,
1819
}
1920

2021
export type MonooseModelIndex = [
2122
{ [fieldName: string]: number | string },
2223
{ [optionName: string]: mixed },
2324
];
2425

26+
export type MongoosePseudoModelT = {
27+
_gqcTypeComposer?: TypeComposer,
28+
schema: MongooseModelSchemaT,
29+
}
30+
2531
export type MongooseModelT = {
26-
_gqcTypeComposer: TypeComposer,
32+
_gqcTypeComposer?: TypeComposer,
2733
modelName: string,
2834
schema: MongooseModelSchemaT,
2935
create(doc: Object | Object[]): Promise<Object>,

src/fieldsConverter.js

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ import GraphQLMongoID from './types/mongoid';
2323

2424
import type {
2525
MongooseModelT,
26+
MongooseModelSchemaT,
27+
MongoosePseudoModelT,
2628
MongooseFieldT,
2729
MongooseFieldMapT,
2830
ComplexTypesT,
@@ -98,7 +100,9 @@ export function dotPathsToEmbedded(fields: MongooseFieldMapT): MongooseFieldMapT
98100
return result;
99101
}
100102

101-
export function getFieldsFromModel(model: MongooseModelT): MongooseFieldMapT {
103+
export function getFieldsFromModel(
104+
model: MongooseModelT | MongoosePseudoModelT
105+
): MongooseFieldMapT {
102106
if (!model || !model.schema || !model.schema.paths) {
103107
throw new Error('You provide incorrect mongoose model to `getFieldsFromModel()`. '
104108
+ 'Correct model should contain `schema.paths` properties.');
@@ -118,18 +122,14 @@ export function getFieldsFromModel(model: MongooseModelT): MongooseFieldMapT {
118122
}
119123

120124
export function convertModelToGraphQL(
121-
model: MongooseModelT,
125+
model: MongooseModelT | MongoosePseudoModelT,
122126
typeName: string
123127
): TypeComposer {
124128
if (!typeName) {
125129
throw new Error('You provide empty name for type. '
126130
+ '`name` argument should be non-empty string.');
127131
}
128132

129-
if (model._gqcTypeComposer) {
130-
return model._gqcTypeComposer;
131-
}
132-
133133
const typeComposer = new TypeComposer(
134134
new GraphQLObjectType({
135135
name: typeName,
@@ -139,8 +139,6 @@ export function convertModelToGraphQL(
139139
})
140140
);
141141

142-
model._gqcTypeComposer = typeComposer; // eslint-disable-line
143-
144142
const mongooseFields = getFieldsFromModel(model, typeName);
145143
const graphqlFields = {};
146144

@@ -156,6 +154,27 @@ export function convertModelToGraphQL(
156154
return typeComposer;
157155
}
158156

157+
export function convertSchemaToGraphQL(
158+
schema: MongooseModelSchemaT,
159+
typeName: string
160+
) {
161+
if (!typeName) {
162+
throw new Error('You provide empty name for type. '
163+
+ '`name` argument should be non-empty string.');
164+
}
165+
166+
if (schema._gqcTypeComposer) {
167+
return schema._gqcTypeComposer;
168+
}
169+
170+
const tc = convertModelToGraphQL({ schema }, typeName);
171+
// also generate InputType
172+
tc.getInputTypeComposer();
173+
174+
schema._gqcTypeComposer = tc; // eslint-disable-line
175+
return tc;
176+
}
177+
159178
export function convertFieldToGraphQL(
160179
field: MongooseFieldT,
161180
prefix: string = ''
@@ -255,9 +274,7 @@ export function embeddedToGraphQL(
255274
}
256275

257276
const typeName = `${prefix}${capitalize(fieldName)}`;
258-
// $FlowFixMe
259-
const fieldAsModel: MongooseModelT = field;
260-
const typeComposer = convertModelToGraphQL(fieldAsModel, typeName);
277+
const typeComposer = convertSchemaToGraphQL(field.schema, typeName);
261278
removePseudoIdField(typeComposer);
262279

263280
return typeComposer.getType();

0 commit comments

Comments
 (0)