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