@@ -6,9 +6,10 @@ import {
6
6
ObjectTypeComposer ,
7
7
ObjectTypeComposerFieldConfig ,
8
8
ObjectTypeComposerFieldConfigDefinition ,
9
+ schemaComposer ,
9
10
SchemaComposer ,
10
11
} from 'graphql-compose' ;
11
- import mongoose , { Document , Model } from 'mongoose' ;
12
+ import { Document , Model , Schema } from 'mongoose' ;
12
13
import { convertModelToGraphQL , MongoosePseudoModelT } from '../fieldsConverter' ;
13
14
import { composeMongoose , ComposeMongooseOpts , GenerateResolverType } from '../composeMongoose' ;
14
15
@@ -24,10 +25,10 @@ export function convertModelToGraphQLWithDiscriminators<TDoc extends Document, T
24
25
// if includeNestedDiscriminators is true to indicate that convertModel should invoke this method
25
26
opts . includeBaseDiscriminators = false ;
26
27
27
- if ( ! model . schema . discriminators ) {
28
+ if ( ! ( ( model as Model < any , any > ) . discriminators || model . schema . discriminators ) ) {
28
29
return convertModelToGraphQL ( model , typeName , sc , opts ) ;
29
30
} else {
30
- return EDiscriminatorTypeComposer . createFromModel ( model , typeName , sc , opts ) ;
31
+ return EDiscriminatorTypeComposer . createFromModel ( model as Model < any , any > , typeName , sc , opts ) ;
31
32
}
32
33
}
33
34
@@ -41,9 +42,11 @@ export class EDiscriminatorTypeComposer<TSource, TContext> extends ObjectTypeCom
41
42
> {
42
43
discriminatorKey : string = '' ;
43
44
discrimTCs : {
44
- [ key : string ] : ObjectTypeComposer < any , TContext > & {
45
- mongooseResolvers : GenerateResolverType < any , TContext > ;
46
- } ;
45
+ [ key : string ] :
46
+ | ( ObjectTypeComposer < any , TContext > & {
47
+ mongooseResolvers : GenerateResolverType < any , TContext > ;
48
+ } )
49
+ | ObjectTypeComposer < any , TContext > ;
47
50
} = { } ;
48
51
49
52
BaseTC : ObjectTypeComposer < TSource , TContext > ;
@@ -61,12 +64,12 @@ export class EDiscriminatorTypeComposer<TSource, TContext> extends ObjectTypeCom
61
64
}
62
65
63
66
static createFromModel < TSrc = any , TCtx = any > (
64
- model : Model < any > | MongoosePseudoModelT ,
67
+ model : Model < any , any > ,
65
68
typeName : string ,
66
69
schemaComposer : SchemaComposer < TCtx > ,
67
70
opts : ComposeMongooseDiscriminatorsOpts < any >
68
71
) : EDiscriminatorTypeComposer < TSrc , TCtx > {
69
- if ( ! model . schema . discriminators ) {
72
+ if ( ! ( ( model as Model < any , any > ) . discriminators || model . schema . discriminators ) ) {
70
73
throw Error ( 'Discriminators should be present to use this function' ) ;
71
74
}
72
75
@@ -89,7 +92,7 @@ export class EDiscriminatorTypeComposer<TSource, TContext> extends ObjectTypeCom
89
92
baseTC . clone ( baseDTC as ObjectTypeComposer < any , any > ) ;
90
93
91
94
baseDTC . opts = { ...opts } ;
92
- baseDTC . discriminatorKey = ( model as any ) . schema . options . discriminatorKey ;
95
+ baseDTC . discriminatorKey = ( model as any ) . schema . get ( ' discriminatorKey' ) || '__t' ;
93
96
if ( baseDTC . discriminatorKey === '__t' ) {
94
97
throw Error (
95
98
'A custom discriminator key must be set on the model options in mongoose for discriminator behaviour to function correctly'
@@ -100,13 +103,10 @@ export class EDiscriminatorTypeComposer<TSource, TContext> extends ObjectTypeCom
100
103
baseDTC . DInterface . setInputTypeComposer ( baseDTC . DInputObject . getInputTypeComposer ( ) ) ;
101
104
baseDTC . setInputTypeComposer ( baseDTC . DInputObject . getInputTypeComposer ( ) ) ;
102
105
103
- baseDTC . setInterfaces ( [ baseDTC . DInterface ] ) ;
106
+ // baseDTC.setInterfaces([baseDTC.DInterface]);
104
107
baseDTC . _gqcInputTypeComposer = baseDTC . DInputObject . _gqcInputTypeComposer ;
105
108
baseDTC . DInterface . _gqcInputTypeComposer = baseDTC . DInputObject . _gqcInputTypeComposer ;
106
109
107
- // discriminators an object containing all discriminators with key being DNames
108
- // import { EDiscriminatorTypeComposer } from './enhancedDiscriminators/index';baseDTC.DKeyETC = createAndSetDKeyETC(baseDTC, discriminators);
109
-
110
110
// reorderFields(baseDTC, baseDTC.opts.reorderFields, baseDTC.discriminatorKey);
111
111
baseDTC . schemaComposer . addSchemaMustHaveType ( baseDTC as any ) ;
112
112
@@ -117,25 +117,44 @@ export class EDiscriminatorTypeComposer<TSource, TContext> extends ObjectTypeCom
117
117
}
118
118
119
119
_buildDiscriminatedInterface (
120
- model : Model < any > | MongoosePseudoModelT ,
120
+ model : Model < any , any > ,
121
121
baseTC : ObjectTypeComposer < any , TContext >
122
122
) : InterfaceTypeComposer < TSource , TContext > {
123
123
const interfaceTC = this . DInterface ;
124
124
interfaceTC . removeOtherFields ( '' ) ;
125
125
interfaceTC . setFields ( baseTC . getFields ( ) ) ;
126
126
this . DInputObject . setFields ( baseTC . getFields ( ) ) ;
127
127
128
- Object . keys ( ( model as any ) . schema . discriminators ) . forEach ( ( key ) => {
129
- const discrimType = ( model as any ) . schema . discriminators [ key ] ;
128
+ const discriminators = model . discriminators || model . schema . discriminators ;
130
129
131
- // ensure valid type for calling convert
132
- const discrimModel =
133
- discrimType instanceof mongoose . Schema ? { schema : discrimType } : discrimType ;
130
+ if ( ! discriminators ) {
131
+ throw Error ( 'Discriminators should be present to use this function' ) ;
132
+ }
134
133
135
- const discrimTC = composeMongoose ( discrimModel , {
136
- ...this . opts ,
137
- name : this . getTypeName ( ) + key ,
138
- } ) ;
134
+ Object . keys ( discriminators ) . forEach ( ( key ) => {
135
+ if ( ! discriminators [ key ] ) {
136
+ throw Error (
137
+ `Discriminator Model of ${ model . name } missing for discriminator with key of ${ key } `
138
+ ) ;
139
+ }
140
+
141
+ const discrimType = discriminators [ key ] ;
142
+
143
+ const discrimTC =
144
+ discrimType instanceof Schema
145
+ ? convertModelToGraphQL (
146
+ { schema : discrimType } ,
147
+ this . getTypeName ( ) + key ,
148
+ schemaComposer ,
149
+ {
150
+ ...this . opts ,
151
+ name : this . getTypeName ( ) + key ,
152
+ }
153
+ )
154
+ : composeMongoose ( discrimType as Model < any > , {
155
+ ...this . opts ,
156
+ name : this . getTypeName ( ) + key ,
157
+ } ) ;
139
158
140
159
// base OTC used for input schema must hold all child TC fields in the most loose way (so all types are accepted)
141
160
// more detailed type checks are done on input object by mongoose itself
@@ -152,18 +171,13 @@ export class EDiscriminatorTypeComposer<TSource, TContext> extends ObjectTypeCom
152
171
this . DInputObject . makeFieldNullable (
153
172
discrimTC . getFieldNames ( ) . filter ( ( field ) => ! baseTC . hasField ( field ) )
154
173
) ;
155
- discrimTC . makeFieldNonNull ( '_id' ) ;
156
174
157
175
// also set fields on master TC so it will have all possibilities for input workaround
158
176
159
- const discrimVal = discrimType . discriminatorMapping . value ;
160
- interfaceTC . addTypeResolver (
161
- discrimTC ,
162
- ( obj : any ) => obj [ this . discriminatorKey ] === discrimVal
163
- ) ;
177
+ interfaceTC . addTypeResolver ( discrimTC , ( obj : any ) => obj [ this . discriminatorKey ] === key ) ;
164
178
165
179
// add TC to discrimTCs
166
- this . discrimTCs [ discrimTC . getTypeName ( ) ] = discrimTC ;
180
+ this . discrimTCs [ key ] = discrimTC ;
167
181
} ) ;
168
182
169
183
return interfaceTC ;
@@ -199,6 +213,19 @@ export class EDiscriminatorTypeComposer<TSource, TContext> extends ObjectTypeCom
199
213
return this . DInputObject as any ;
200
214
}
201
215
216
+ getDiscriminatorTCs ( ) : {
217
+ [ key : string ] : ObjectTypeComposer < any , TContext > & {
218
+ mongooseResolvers : GenerateResolverType < any , TContext > ;
219
+ } ;
220
+ } {
221
+ // check if mongooseResolvers are present
222
+ if ( ( this . discrimTCs [ Object . keys ( this . discrimTCs ) [ 0 ] ] as any ) . mongooseResolvers ) {
223
+ return this . discrimTCs as any ;
224
+ } else {
225
+ return { } ;
226
+ }
227
+ }
228
+
202
229
// OVERRIDES
203
230
getTypeName ( ) : string {
204
231
return this . DInterface . getTypeName ( ) ;
0 commit comments