Newer
Older
const {
ApolloServer,
ForbiddenError,
UserInputError,
AuthenticationError,
ApolloError,
} = require('apollo-server-express')
const isEmpty = require('lodash/isEmpty')
const config = require('config')
const logger = require('@pubsweet/logger')
const errors = require('@pubsweet/errors')
const connectors = require('pubsweet-server/src/connectors')
const loaders = require('pubsweet-server/src/graphql/loaders')
const helpers = require('pubsweet-server/src/helpers/authorization')
const schema = require('./graphqlSchema')
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
const hostname = config.has('pubsweet-server.hostname')
? config.get('pubsweet-server.hostname')
: 'localhost'
const extraApolloConfig = config.has('pubsweet-server.apollo')
? config.get('pubsweet-server.apollo')
: {}
const api = app => {
app.use(
'/graphql',
app.locals.passport.authenticate(['bearer', 'anonymous'], {
session: false,
}),
)
const server = new ApolloServer({
schema,
context: ({ req, res }) => ({
helpers,
connectors,
user: req.user,
loaders: loaders(),
}),
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,
},
}
},
playground: {
subscriptionEndpoint: `ws://${hostname}:3000/subscriptions`,
},
...extraApolloConfig,
})
server.applyMiddleware({ app })
}
module.exports = api