Completed
Push — master ( 1f2b71...3f1d1d )
by Matze
07:04
created

CatchUserException::setMessage()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 11
ccs 7
cts 7
cp 1
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 7
nc 4
nop 3
crap 3
1
<?php
2
3
namespace BrainExe\Core\Middleware;
4
5
use BrainExe\Annotations\Annotations\Inject;
6
use BrainExe\Core\Annotations\Middleware;
7
use BrainExe\Core\Application\UserException;
8
use BrainExe\Core\Traits\LoggerTrait;
9
use BrainExe\Core\Translation\TranslationTrait;
10
use Monolog\Logger;
11
use Throwable;
12
use Symfony\Component\HttpFoundation\Request;
13
use Symfony\Component\HttpFoundation\Response;
14
use Symfony\Component\Routing\Exception\MethodNotAllowedException;
15
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
16
17
/**
18
 * @Middleware("Middleware.CatchUserException")
19
 */
20
class CatchUserException extends AbstractMiddleware
21
{
22
23
    const ERROR_NOT_AUTHORIZED = 'NotAuthorized';
24
25
    use TranslationTrait;
26
27
    /**
28
     * @var Logger
29
     */
30
    private $logger;
31
32
    /**
33
     * @Inject("@logger")
34
     * @param Logger $logger
35
     */
36 14
    public function __construct(Logger $logger)
37
    {
38 14
        $this->logger = $logger;
39 14
    }
40
41
    /**
42
     * {@inheritdoc}
43
     */
44 13
    public function processException(Request $request, Throwable $exception)
45
    {
46 13
        if ($exception instanceof ResourceNotFoundException) {
47 3
            $exception = new UserException(
48 3
                $this->translate(
49 3
                    'Page not found: %s',
50 3
                    htmlspecialchars($request->getRequestUri())
51
                ),
52 3
                0,
53
                $exception
54
            );
55 3
            $response  = new Response('', 404);
56
        } elseif ($exception instanceof MethodNotAllowedException) {
57 2
            $exception = new UserException(
58 2
                $this->translate(
59 2
                    'You are not allowed to access the page. Allowed methods: %s',
60 2
                    implode(',', $exception->getAllowedMethods())
61
                ),
62 2
                0,
63
                $exception
64
            );
65 2
            $response = new Response('', 405);
66 2
            $response->headers->set('X-Error', self::ERROR_NOT_AUTHORIZED);
67
        } elseif ($exception instanceof UserException) {
68
            // just pass a UserException to Frontend
69 2
            $response  = new Response('', 200);
70
        } else {
71 6
            $exception = new UserException($exception->getMessage(), 0, $exception);
72 6
            $response  = new Response('', 500);
73
        }
74
75 13
        $this->logger->error($exception->getMessage());
76 13
        $this->logger->error($exception->getTraceAsString());
77
78 13
        $this->setMessage($exception, $request, $response);
79
80 13
        return $response;
81
    }
82
83
    /**
84
     * @param Throwable $exception
85
     * @param Request $request
86
     * @param Response $response
87
     */
88 13
    private function setMessage(Throwable $exception, Request $request, Response $response)
89
    {
90 13
        $message = $exception->getMessage() ?: $this->translate('An error occurred');
91
92 13
        if ($request->isXmlHttpRequest()) {
93 6
            $response->headers->set('X-Flash-Type', 'danger');
94 6
            $response->headers->set('X-Flash-Message', $message);
95
        } else {
96 7
            $response->setContent($message);
97
        }
98 13
    }
99
}
100