@amnet/server
Version:
A tweaked version of pubsweet-server for use by Coko's projects
111 lines (89 loc) • 2.69 kB
JavaScript
const {
ApolloServer,
ForbiddenError,
UserInputError,
AuthenticationError,
ApolloError,
} = require('apollo-server-express')
const isEmpty = require('lodash/isEmpty')
const config = require('config')
const { graphqlUploadExpress } = require('graphql-upload')
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')
const createCORSConfig = require('./corsConfig')
const isDevelopment = process.env.NODE_ENV === 'development'
const extraApolloConfig = config.has('pubsweet-server.apollo')
? config.get('pubsweet-server.apollo')
: {}
const apolloServerConfig = {
uploads: false,
schema,
context: ({ req, res }) => ({
helpers,
connectors,
user: req.user,
loaders: loaders(),
req,
res,
}),
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',
...extraApolloConfig,
}
if (isDevelopment) {
const host = `${config.get('pubsweet-server.host')}${
config.get('pubsweet-server.port')
? `:${config.get('pubsweet-server.port')}`
: ''
}`
apolloServerConfig.playground = {
subscriptionEndpoint: `ws://${host}/subscriptions`,
}
}
const api = app => {
app.use(
'/graphql',
app.locals.passport.authenticate(['bearer', 'anonymous'], {
session: false,
}),
)
app.use(graphqlUploadExpress())
const server = new ApolloServer(apolloServerConfig)
const CORSConfig = createCORSConfig()
server.applyMiddleware({ app, cors: CORSConfig })
}
module.exports = api