54 lines
1.5 KiB
JavaScript
54 lines
1.5 KiB
JavaScript
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;
|