All files / lib/graphQl index.js

33.33% Statements 12/36
0% Branches 0/2
0% Functions 0/6
33.33% Lines 12/36
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98  1x   1x 1x 1x   1x 1x 1x 1x   1x                     1x                                     1x                               1x                                                                              
'use strict'
const jsonApiGraphQL = module.exports = { }
 
const jsonApi = require('../../')
const graphqlHTTP = require('express-graphql')
const graphQl = require('graphql')
 
const resolvers = require('./resolvers.js')
const filterArgs = require('./filterArgs.js')
const readTypes = require('./readTypes.js')
const writeTypes = require('./writeTypes.js')
 
jsonApiGraphQL.with = app => {
  const config = jsonApi._apiConfig
 
  if (config.graphiql !== false) {
    app.use(new RegExp(`${config.base}$`), graphqlHTTP({
      schema: jsonApiGraphQL.generate(jsonApi._resources),
      graphiql: !!config.graphiql
    }))
  }
}
 
jsonApiGraphQL.generate = allResourceConfig => {
  const allReadTypes = readTypes.generate(allResourceConfig)
  const readSchema = jsonApiGraphQL.generateReadSchema(allReadTypes, allResourceConfig)
 
  const allWriteTypes = writeTypes.generate(allResourceConfig, allReadTypes)
  const writeSchema = jsonApiGraphQL.generateWriteSchema(allReadTypes, allResourceConfig, allWriteTypes)
 
  return new graphQl.GraphQLSchema({
    query: new graphQl.GraphQLObjectType({
      name: 'RootQueryType',
      fields: readSchema
    }),
    mutation: new graphQl.GraphQLObjectType({
      name: 'RootMutationType',
      fields: writeSchema
    })
  })
}
 
jsonApiGraphQL.generateReadSchema = (allReadTypes, allResourceConfig) => {
  const result = { }
 
  Object.keys(allResourceConfig).forEach(resource => {
    const resourceConfig = allResourceConfig[resource]
 
    result[resourceConfig.resource] = {
      description: `Get some ${resourceConfig.resource} resources`,
      args: filterArgs.generate(resource),
      type: new graphQl.GraphQLList(allReadTypes[resource]),
      resolve: resolvers.search.bind(resolvers, resourceConfig, null)
    }
  })
  return result
}
 
jsonApiGraphQL.generateWriteSchema = (allReadTypes, allResourceConfig, allWriteTypes) => {
  const result = { }
 
  Object.keys(allResourceConfig).forEach(resource => {
    const resourceConfig = allResourceConfig[resource]
 
    let uName = resourceConfig.resource
    uName = uName[0].toUpperCase() + uName.substring(1)
 
    const args = { }
    args[resourceConfig.resource] = {
      type: allWriteTypes[resource]
    }
 
    result[`create${uName}`] = {
      description: `Create a new ${resourceConfig.resource} resource`,
      args,
      type: allReadTypes[resource],
      resolve: resolvers.create.bind(resolvers, resourceConfig)
    }
 
    result[`update${uName}`] = {
      description: `Update an existing ${resourceConfig.resource} resource`,
      args,
      type: allReadTypes[resource],
      resolve: resolvers.update.bind(resolvers, resourceConfig)
    }
 
    result[`delete${uName}`] = {
      description: `Delete a ${resourceConfig.resource} resource`,
      args: {
        id: { type: new graphQl.GraphQLNonNull(graphQl.GraphQLString) }
      },
      type: allReadTypes[resource],
      resolve: resolvers.delete.bind(resolvers, resourceConfig)
    }
  })
  return result
}