strapi/packages/plugins/graphql/server/src/format-graphql-error.ts

45 lines
1.5 KiB
TypeScript
Raw Normal View History

import { toUpper, snakeCase, pick, isEmpty } from 'lodash/fp';
import { errors } from '@strapi/utils';
import {
ApolloError,
UserInputError as ApolloUserInputError,
ForbiddenError as ApolloForbiddenError,
} from 'apollo-server-koa';
import { GraphQLError } from 'graphql';
const { HttpError, ForbiddenError, UnauthorizedError, ApplicationError, ValidationError } = errors;
const formatToCode = (name: string) => `STRAPI_${toUpper(snakeCase(name))}`;
const formatErrorToExtension = (error: any) => ({
error: pick(['name', 'message', 'details'])(error),
});
export function formatGraphqlError(error: GraphQLError) {
2021-11-02 12:08:15 +01:00
const { originalError } = error;
2021-11-02 12:08:15 +01:00
if (isEmpty(originalError)) {
return error;
}
if (originalError instanceof ForbiddenError || originalError instanceof UnauthorizedError) {
2021-10-29 17:17:58 +02:00
return new ApolloForbiddenError(originalError.message, formatErrorToExtension(originalError));
}
if (originalError instanceof ValidationError) {
2021-10-29 17:17:58 +02:00
return new ApolloUserInputError(originalError.message, formatErrorToExtension(originalError));
}
if (originalError instanceof ApplicationError || originalError instanceof HttpError) {
const name = formatToCode(originalError.name);
2021-10-29 17:17:58 +02:00
return new ApolloError(originalError.message, name, formatErrorToExtension(originalError));
}
2021-10-27 18:54:58 +02:00
2021-11-02 12:08:15 +01:00
if (originalError instanceof ApolloError || originalError instanceof GraphQLError) {
return error;
}
// Internal server error
2021-11-02 12:08:15 +01:00
strapi.log.error(originalError);
return new ApolloError('Internal Server Error', 'INTERNAL_SERVER_ERROR');
}