Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 35
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
ErrorHandler
0.00% covered (danger)
0.00%
0 / 35
0.00% covered (danger)
0.00%
0 / 1
132
0.00% covered (danger)
0.00%
0 / 1
 __invoke
0.00% covered (danger)
0.00%
0 / 35
0.00% covered (danger)
0.00%
0 / 1
132
1<?php
2
3namespace BO\Zmsapi\Helper;
4
5use BO\Slim\Render;
6use BO\Slim\Helper\Sanitizer;
7use Psr\Http\Message\ResponseInterface;
8use Psr\Http\Message\ServerRequestInterface;
9use Slim\Interfaces\ErrorHandlerInterface;
10
11/**
12 *
13 * @SuppressWarnings(CouplingBetweenObjects)
14 */
15class ErrorHandler implements ErrorHandlerInterface
16{
17    /**
18     * @SuppressWarnings("PMD.UnusedFormalParameter")
19     * @SuppressWarnings(Complexity)
20     * @param ServerRequestInterface $request
21     * @param \Throwable $exception
22     * @param bool $displayErrorDetails
23     * @param bool $logErrors
24     * @param bool $logErrorDetails
25     * @return ResponseInterface
26     */
27    #[\Override]
28    public function __invoke(
29        ServerRequestInterface $request,
30        \Throwable $exception,
31        bool $displayErrorDetails,
32        bool $logErrors,
33        bool $logErrorDetails
34    ): ResponseInterface {
35        $response = \App::$slim->getResponseFactory()->createResponse();
36        if ($exception instanceof \Slim\Exception\HttpNotFoundException) {
37            $message = \BO\Zmsapi\Response\Message::create($request);
38            $message->meta->error = true;
39            $message->meta->message = "Could not find a resource with the given URL " . $request->getUri()->getPath();
40            $response = \BO\Slim\Render::withLastModified($response, time(), '0');
41            return Render::withJson($response, $message, 404);
42        }
43
44        $message = \BO\Zmsapi\Response\Message::create($request);
45        $message->meta->error = true;
46        $message->meta->message = $exception->getMessage();
47        $message->meta->exception = get_class($exception);
48        $message->meta->trace = '';
49        foreach (array_slice($exception->getTrace(), 0, 10) as $call) {
50            $message->meta->trace .= "\\";
51            $message->meta->trace .= isset($call['class']) ? $call['class'] : '';
52            $message->meta->trace .= "::";
53            $message->meta->trace .= isset($call['function']) ? $call['function'] : '';
54            $message->meta->trace .= " +";
55            $message->meta->trace .= isset($call['line']) ? $call['line'] : '';
56            $message->meta->trace .= "\n";
57        }
58        $message->meta->trace = Sanitizer::sanitizeStackTrace($message->meta->trace);
59
60        if (isset($exception->data)) {
61            $message->data = $exception->data;
62        }
63        $response = \BO\Slim\Render::withLastModified($response, time(), '0');
64        $status = 500;
65        if ($exception->getCode() >= 200 && $exception->getCode() <= 599) {
66            $status = $exception->getcode();
67        }
68        if ($exception->getCode() >= 500 || !$exception->getCode()) {
69            \App::$log->critical(
70                "[API] Fatal Exception: "
71                . " in " . $exception->getFile() . " +" . $exception->getLine()
72                . " -> " . $exception->getMessage()
73                . " | Trace: " . Sanitizer::sanitizeStackTrace(preg_replace("#(\s)+#", ' ', str_replace('\\', ':', $message->meta->trace)))
74            );
75        }
76        return Render::withJson($response, $message, $status);
77    }
78}