Newer
Older
const {
ApolloServer,
ForbiddenError,
UserInputError,
AuthenticationError,
ApolloError,
} = require('apollo-server-express')
const isEmpty = require('lodash/isEmpty')
const config = require('config')
const errors = require('./errors')
const logger = require('./logger')
const loaders = require('./graphql/loaders')
const schema = require('./graphqlSchema')
const isDevelopment = process.env.NODE_ENV === 'development'
const createGraphQLServer = testUserContext => {
if (process.env.NODE_ENV !== 'test' && testUserContext) {
throw new Error(
'Do not pass a test user context unless you are running a test suite',
)
}
const createdLoaders = loaders()
schema,
context: ({ req, res }) => ({
user: testUserContext || req.user,
loaders: createdLoaders,
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
}),
formatError: err => {
const error = isEmpty(err.originalError) ? err : err.originalError
logger.error(error.message, { error })
const isPubsweetDefinedError = Object.values(errors).some(
pubsweetError => error instanceof pubsweetError,
)
const isGraphqlDefinedError = [
ForbiddenError,
UserInputError,
AuthenticationError,
ApolloError,
].some(graphqlError => error instanceof graphqlError)
// err is always a GraphQLError which should be passed to the client
if (
!isEmpty(err.originalError) &&
!isPubsweetDefinedError &&
!isGraphqlDefinedError
)
return {
name: 'Server Error',
message: 'Something went wrong! Please contact your administrator',
}
if (isGraphqlDefinedError) return error
return {
name: error.name || 'GraphQLError',
message: error.message,
extensions: {
code: err.extensions.code,
},
}
},
introspection: process.env.NODE_ENV === 'development',
}
if (isDevelopment) {
const host = `${config.get('host')}${
config.get('port') ? `:${config.get('port')}` : ''
}`
serverConfig.playground = {
subscriptionEndpoint: `ws://${host}/subscriptions`,
}
}
return new ApolloServer(serverConfig)
}
module.exports = createGraphQLServer