url)); } try { if (!config('app.debug')) { if ($this->shouldntReport($e)) { return; } Mail::send(new ExceptionAlert($e)); } } finally { parent::report($e); } } /** * Render an exception into an HTTP response. * * @param \Illuminate\Http\Request $request * @param \Throwable $e * @return \Symfony\Component\HttpFoundation\Response * * @throws \Throwable */ // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh public function render($request, Throwable $e) { if (Helper::isRequestForApiV2($request) and $request->isJson()) { switch (get_class($e)) { case AuthenticationException::class: /** @var AuthenticationException $e */ return $this->getReponse( $request, 401, ApiError::needAuth()->value, sprintf('%s, %s', ApiError::needAuth()->label, $e->getMessage()) ); case MethodNotAllowedHttpException::class: /** @var MethodNotAllowedHttpException $e */ return $this->getReponse( $request, $e->getStatusCode(), ApiError::methodNotAllowed()->value, sprintf('%s, %s', ApiError::methodNotAllowed()->label, $e->getMessage()) ); case ValidationException::class: /** @var ValidationException $e */ return $this->getReponse( $request, $e->status, ApiError::validationFailed()->value, sprintf(ApiError::validationFailed()->label, $e->getMessage()), ['errors' => $e->errors()] ); case ModelNotFoundException::class: /** @var ModelNotFoundException $e */ return $this->getReponse( $request, 404, ApiError::modelNotFound()->value, sprintf( ApiError::modelNotFound()->label, \array_slice(explode('\\', $e->getModel()), -1)[0] ) ); case ApiErrorException::class: /** @var ApiErrorException $e */ return $this->getReponse( $request, $e->getStatusCode(), $e->getCode(), $e->getMessage() ); case ThrottleRequestsException::class: /** @var ThrottleRequestsException $e */ return $this->getReponse( $request, 429, ApiError::throttleRequestsException()->value, ApiError::throttleRequestsException()->label ); case AuthorizationException::class: /** @var AuthorizationException $e */ return $this->getReponse( $request, 403, ApiError::authorizationException()->value, ApiError::authorizationException()->label ); case CrmException::class: default: if (config('app.env') === 'testing') { // phpcs:ignore Squiz.PHP.DiscouragedFunctions.Found print_r((string)$e); } return $this->getReponse($request, 500, $e->getCode(), $e->getMessage()); } } return parent::render($request, $e); } /** * Generate an ApiV2 json response * * @param Request $request * @param integer $httpCode * @param integer $apiCode * @param string $message * @return JsonResponse */ private static function getReponse( Request $request, int $httpCode, int $apiCode, string $message, array $data = [] ): JsonResponse { return (new V2ApiResponse( (object)array_merge( $data, [ 'message' => $message, 'code' => $apiCode ] ), ApiStatus::KO() ))->toResponse($request)->setStatusCode($httpCode); } }