import { GraphQLFieldResolver , GraphQLInputObjectType , GraphQLInputType , GraphQLSchema , IntrospectionObjectType , IntrospectionType } from 'graphql' ; import pluralize from 'pluralize' ; import { DataResolver , TypeGenerator } from './GraphQLGenieInterfaces' ; import { InputGenerator } from './InputGenerator' ; import { Relations , getAllResolver , getRootMatchFields , queryArgs } from './TypeGeneratorUtilities' ; import { camelCase } from 'lodash' ; export class GenerateGetAll implements TypeGenerator { private objectName : string ; private types : IntrospectionObjectType [ ] ; private schema : GraphQLSchema ; private dataResolver : DataResolver ; private fields : object ; public resolvers : Map < string , GraphQLFieldResolver < any , any > > ; private currInputObjectTypes : Map < string , GraphQLInputType > ; private schemaInfo : IntrospectionType [ ] ; private relations : Relations ; constructor ( dataResolver , objectName , types , $schema , $currInputObjectTypes , $schemaInfo , $relations ) { this . dataResolver = dataResolver ; this . objectName = objectName ; this . types = types ; this . schema = $schema ; this . currInputObjectTypes = $currInputObjectTypes ; this . schemaInfo = $schemaInfo ; this . relations = $relations ; this . fields = { } ; this . resolvers = new Map < string , GraphQLFieldResolver < any , any > > ( ) ; this . generate ( ) ; } generate ( ) { this . types . forEach ( type => { const schemaType = this . schema . getType ( type . name ) ; const generator = new InputGenerator ( schemaType , null , this . currInputObjectTypes , this . schemaInfo , this . schema , this . relations ) ; const args = Object . assign ( { where : { type : generator . generateWhereInput ( this . dataResolver . getFeatures ( ) . logicalOperators ) } , orderBy : { type : generator . generateOrderByInput ( ) } } , queryArgs , getRootMatchFields ( ( < GraphQLInputObjectType > this . currInputObjectTypes . get ( `${ type . name }MatchInput` ) ) ) ) ; const fieldName = `${ camelCase ( pluralize ( type . name ) ) }` ; this . fields [ fieldName ] = { type : `[${ type . name }]` , args } ; this . resolvers . set ( fieldName , getAllResolver ( this . dataResolver , this . schema , type ) ) ; } ) ; this . fields [ 'node' ] = { description : 'Fetches an object given its ID' , type : 'Node' , args : { id : { description : 'The ID of an object' , type : 'ID!' } } } ; this . resolvers . set ( 'node' , async ( _root , _args , _context , _info ) => { const id = _args . id ; const fortuneReturn = await this . dataResolver . find ( 'Node' , [ id ] , undefined , { context : _context , info : _info } ) ; if ( fortuneReturn ) { const cache = new Map < string , object > ( ) ; cache . set ( id , fortuneReturn ) ; return { fortuneReturn : fortuneReturn , cache : cache , __typename : fortuneReturn . __typename } ; } else { return null ; } } ) ; } public getResolvers ( ) { return new Map ( [ [ this . objectName , this . resolvers ] ] ) ; } public getFieldsOnObject ( ) { return new Map ( [ [ this . objectName , this . fields ] ] ) ; } }