RestExceptionListener   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 65
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 9

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 6
lcom 1
cbo 9
dl 0
loc 65
ccs 29
cts 29
cp 1
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 13 1
A onKernelException() 0 21 2
A logException() 0 13 3
1
<?php
2
declare(strict_types=1);
3
4
namespace Maba\Bundle\RestBundle\Listener;
5
6
use Maba\Bundle\RestBundle\Service\ResponseBuilder;
7
use Maba\Bundle\RestBundle\Service\RestRequestHelper;
8
use Paysera\Component\Normalization\CoreNormalizer;
9
use Psr\Log\LogLevel;
10
use Psr\Log\NullLogger;
11
use Symfony\Component\HttpFoundation\Response;
12
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
13
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
14
use Psr\Log\LoggerInterface;
15
use Exception;
16
use Maba\Bundle\RestBundle\Service\ErrorBuilderInterface;
17
18
/**
19
 * @internal
20
 */
21
class RestExceptionListener
22
{
23
    private $requestHelper;
24
    private $errorBuilder;
25
    private $coreNormalizer;
26
    private $responseBuilder;
27
    private $logger;
28
29 86
    public function __construct(
30
        RestRequestHelper $requestHelper,
31
        ErrorBuilderInterface $errorBuilder,
32
        CoreNormalizer $coreNormalizer,
33
        ResponseBuilder $responseBuilder,
34
        LoggerInterface $logger = null
35
    ) {
36 86
        $this->requestHelper = $requestHelper;
37 86
        $this->errorBuilder = $errorBuilder;
38 86
        $this->coreNormalizer = $coreNormalizer;
39 86
        $this->responseBuilder = $responseBuilder;
40 86
        $this->logger = $logger ?? new NullLogger();
41 86
    }
42
43
    /**
44
     * Ran on kernel.exception event
45
     *
46
     * Both events are typecasted as one is deprecated from 4.3, but another not available before this version
47
     * @param GetResponseForExceptionEvent|ExceptionEvent $event
48
     * @throws Exception
49
     */
50 38
    public function onKernelException($event)
51
    {
52 38
        $request = $event->getRequest();
53
54 38
        if (!$this->requestHelper->isRestRequest($request)) {
55 1
            return;
56
        }
57
58 37
        $exception = $event->getException();
59 37
        $error = $this->errorBuilder->createErrorFromException($exception);
60 37
        $normalizedError = $this->coreNormalizer->normalize($error);
61
62 37
        $response = $this->responseBuilder->buildResponse(
63 37
            $normalizedError,
64 37
            $error->getStatusCode() ?? Response::HTTP_BAD_REQUEST
65
        );
66
67 37
        $this->logException($response, $exception);
68
69 37
        $event->setResponse($response);
70 37
    }
71
72 37
    private function logException(Response $response, Exception $exception)
73
    {
74 37
        if ($response->getStatusCode() >= 500) {
75 2
            $level = LogLevel::ERROR;
76 35
        } elseif ($response->getStatusCode() === 404) {
77 4
            $level = LogLevel::NOTICE;
78
        } else {
79 31
            $level = LogLevel::WARNING;
80
        }
81
82 37
        $this->logger->debug('Setting error response', [$response->getContent()]);
83 37
        $this->logger->log($level, $exception->getMessage(), ['exception' => $exception]);
84 37
    }
85
}
86