Completed
Push — master ( 3c4e64...93e429 )
by Pavel
03:56
created

ExceptionHandlerListener::onJsonRpcException()   C

Complexity

Conditions 7
Paths 13

Size

Total Lines 45
Code Lines 31

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 15
CRAP Score 13.7359

Importance

Changes 3
Bugs 0 Features 0
Metric Value
c 3
b 0
f 0
dl 0
loc 45
ccs 15
cts 31
cp 0.4839
rs 6.7272
cc 7
eloc 31
nc 13
nop 1
crap 13.7359
1
<?php
2
/**
3
 * User: scaytrase
4
 * Created: 2016-02-14 13:32
5
 */
6
7
namespace Bankiru\Api\JsonRpc\Listener;
8
9
use Bankiru\Api\JsonRpc\Exception\JsonRpcException;
10
use Bankiru\Api\JsonRpc\Exception\JsonRpcExceptionInterface;
11
use Bankiru\Api\JsonRpc\Specification\JsonRpcResponse;
12
use Bankiru\Api\Rpc\Event\GetExceptionResponseEvent;
13
use Bankiru\Api\Rpc\Exception\InvalidMethodParametersException;
14
use Bankiru\Api\Rpc\Routing\Exception\MethodNotFoundException;
15
use ScayTrase\Api\JsonRpc\JsonRpcError;
16
use ScayTrase\Api\JsonRpc\JsonRpcRequestInterface;
17
18
final class ExceptionHandlerListener
19
{
20
    private $debug = false;
21
22
    /**
23
     * ExceptionHandlerListener constructor.
24
     *
25
     * @param bool $debug
26
     */
27
    public function __construct($debug) { $this->debug = (bool)$debug; }
28
29
30 1
    public function onJsonRpcException(GetExceptionResponseEvent $event)
31
    {
32 1
        $request = $event->getRequest();
33 1
        if (!$request instanceof JsonRpcRequestInterface) {
34
            return;
35
        }
36
37 1
        $exception = $event->getException();
38 1
        if ($exception instanceof InvalidMethodParametersException) {
39
            $exception =
40
                JsonRpcException::create(
41
                    JsonRpcError::INVALID_PARAMS,
42
                    $exception->getMessage(),
43
                    $exception->getTrace());
44 1
        } elseif ($exception instanceof MethodNotFoundException) {
45
            $exception =
46
                JsonRpcException::create(
47
                    JsonRpcError::METHOD_NOT_FOUND,
48
                    $exception->getMessage(),
49
                    $exception->getTrace());
50
        }
51
52 1
        if ($exception instanceof JsonRpcExceptionInterface) {
53
            $error = $exception->getJsonRpcError();
54
            if (!$this->debug) {
55
                $error = new JsonRpcError($error->getCode(), $error->getMessage());
56
            }
57
58
            $event->setResponse(new JsonRpcResponse($request->getId(), null, $error));
59
60
            return;
61
        }
62
63 1
        $data = $this->debug ? (object)['trace' => $exception->getTrace()] : null;
64
65
        $error =
66 1
            new JsonRpcError(
67 1
                JsonRpcError::INTERNAL_ERROR,
68 1
                $event->getException()->getMessage(),
69
                $data
70 1
            );
71
72 1
        $jsonResponse = new JsonRpcResponse($request->getId(), null, $error);
73 1
        $event->setResponse($jsonResponse);
74 1
    }
75
}
76