|
import path, { join } from 'path'; |
|
import { fileURLToPath } from 'url'; |
|
import { graphqlHTTP } from 'express-graphql'; |
|
import { loadSchemaSync } from '@graphql-tools/load'; |
|
import { GraphQLFileLoader } from '@graphql-tools/graphql-file-loader'; |
|
import { addResolversToSchema } from '@graphql-tools/schema'; |
|
import { applyMiddleware } from 'graphql-middleware'; |
|
|
|
import appConfig from '../config/app.js'; |
|
import logger from './logger.js'; |
|
import authentication from './authentication.js'; |
|
import * as Sentry from './sentry.ee.js'; |
|
import resolvers from '../graphql/resolvers.js'; |
|
import HttpError from '../errors/http.js'; |
|
|
|
const __dirname = path.dirname(fileURLToPath(import.meta.url)); |
|
|
|
const schema = loadSchemaSync(join(__dirname, '../graphql/schema.graphql'), { |
|
loaders: [new GraphQLFileLoader()], |
|
}); |
|
|
|
const schemaWithResolvers = addResolversToSchema({ |
|
schema, |
|
resolvers, |
|
}); |
|
|
|
const graphQLInstance = graphqlHTTP({ |
|
schema: applyMiddleware( |
|
schemaWithResolvers, |
|
authentication.generate(schemaWithResolvers) |
|
), |
|
graphiql: appConfig.isDev, |
|
customFormatErrorFn: (error) => { |
|
logger.error(error.path + ' : ' + error.message + '\n' + error.stack); |
|
|
|
if (error.originalError instanceof HttpError) { |
|
delete error.originalError.response; |
|
} |
|
|
|
Sentry.captureException(error, { |
|
tags: { graphql: true }, |
|
extra: { |
|
source: error.source?.body, |
|
positions: error.positions, |
|
path: error.path, |
|
}, |
|
}); |
|
|
|
return error; |
|
}, |
|
}); |
|
|
|
export default graphQLInstance; |
|
|