UNPKG

graphql-compose-mongoose

Version:

Plugin for `graphql-compose` which derive a graphql types from a mongoose model.

103 lines (89 loc) 3.63 kB
import { EMCResolvers } from '../resolvers'; import { DiscriminatorTypeComposer } from './DiscriminatorTypeComposer'; // change type on DKey generated by composeWithMongoose // set it to created enum ObjectTypeComposer for DKey DKeyETC // only sets on filter and record typeComposers, since they contain our DKey function setDKeyEnumOnITCArgs(resolver, baseTC) { // setDKeyEnum for filter types, and on record types if (resolver) { const argNames = resolver.getArgNames(); for (const argName of argNames) { if (argName === 'filter' || argName === 'record' || argName === 'records') { const filterArgTC = resolver.getArgITC(argName); if (filterArgTC) { filterArgTC.extendField(baseTC.getDKey(), { type: baseTC.getDKeyETC() }); } } } } } // recomposing sets up the DInterface as the return types for // Also sets up DKey enum as type for DKey field on composers with filter and/or record args // composeWithMongoose composers export function prepareBaseResolvers(baseTC) { for (const resolverName in EMCResolvers) { if (EMCResolvers.hasOwnProperty(resolverName) && baseTC.hasResolver(resolverName)) { const resolver = baseTC.getResolver(resolverName); switch (resolverName) { case EMCResolvers.findMany: case EMCResolvers.findByIds: resolver.setType(baseTC.getDInterface().getTypePlural()); resolver.projection[baseTC.getDKey()] = 1; break; case EMCResolvers.findById: case EMCResolvers.findOne: resolver.setType(baseTC.getDInterface()); resolver.projection[baseTC.getDKey()] = 1; break; case EMCResolvers.createOne: case EMCResolvers.updateOne: case EMCResolvers.updateById: case EMCResolvers.removeOne: case EMCResolvers.removeById: resolver.getOTC().extendField('record', { type: baseTC.getDInterface(), projection: { [baseTC.getDKey()]: 1 } }); break; case EMCResolvers.createMany: resolver.getOTC().extendField('records', { type: baseTC.getDInterface().getTypePlural().getTypeNonNull(), projection: { [baseTC.getDKey()]: 1 } }); break; case EMCResolvers.pagination: resolver.getOTC().extendField('items', { type: baseTC.getDInterface().getTypePlural(), projection: { [baseTC.getDKey()]: 1 } }); break; case EMCResolvers.connection: const edgesTC = resolver // eslint-disable-line no-case-declarations .getOTC().getFieldOTC('edges').clone(`${baseTC.getTypeName()}Edge`); edgesTC.extendField('node', { type: baseTC.getDInterface().getTypeNonNull(), projection: { [baseTC.getDKey()]: 1 } }); resolver.getOTC().setField('edges', edgesTC.getTypeNonNull().getTypePlural().getTypeNonNull()); break; default: } setDKeyEnumOnITCArgs(resolver, baseTC); // set DKey as required field to create from base // must be done after setting DKeyEnum if (resolverName === EMCResolvers.createOne || resolverName === EMCResolvers.createMany) { const fieldName = resolverName === EMCResolvers.createMany ? 'records' : 'record'; resolver.getArgITC(fieldName).extendField(baseTC.getDKey(), { type: baseTC.getDKeyETC().getTypeNonNull() }); } } } }