| 
									
										
										
										
											2021-10-27 18:54:58 +02:00
										 |  |  | 'use strict'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-02 12:08:15 +01:00
										 |  |  | const { toUpper, snakeCase, pick, isEmpty } = require('lodash/fp'); | 
					
						
							| 
									
										
										
										
											2021-10-29 12:23:28 +02:00
										 |  |  | const { | 
					
						
							|  |  |  |   HttpError, | 
					
						
							|  |  |  |   ForbiddenError, | 
					
						
							|  |  |  |   UnauthorizedError, | 
					
						
							|  |  |  |   ApplicationError, | 
					
						
							|  |  |  |   ValidationError, | 
					
						
							|  |  |  | } = require('@strapi/utils').errors; | 
					
						
							|  |  |  | const { | 
					
						
							|  |  |  |   ApolloError, | 
					
						
							|  |  |  |   UserInputError: ApolloUserInputError, | 
					
						
							|  |  |  |   ForbiddenError: ApolloForbiddenError, | 
					
						
							| 
									
										
										
										
											2021-11-02 12:08:15 +01:00
										 |  |  | } = require('apollo-server-koa'); | 
					
						
							|  |  |  | const { GraphQLError } = require('graphql'); | 
					
						
							| 
									
										
										
										
											2021-10-29 12:23:28 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | const formatToCode = name => `STRAPI_${toUpper(snakeCase(name))}`; | 
					
						
							| 
									
										
										
										
											2021-10-29 17:17:58 +02:00
										 |  |  | const formatErrorToExtension = error => ({ error: pick(['name', 'message', 'details'])(error) }); | 
					
						
							| 
									
										
										
										
											2021-10-29 12:23:28 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-27 18:54:58 +02:00
										 |  |  | const formatGraphqlError = error => { | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							|  |  |  |   return ApolloError('Internal Server Error', 'INTERNAL_SERVER_ERROR'); | 
					
						
							| 
									
										
										
										
											2021-10-27 18:54:58 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = formatGraphqlError; |