Passed
Push — master ( da0795...78880b )
by Jens
14:45 queued 18s
created

ApiException::getResponseJson()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2.0185

Importance

Changes 0
Metric Value
eloc 5
dl 0
loc 9
ccs 5
cts 6
cp 0.8333
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 0
crap 2.0185
1
<?php
2
/**
3
 * @author @jenschude <[email protected]>
4
 */
5
6
namespace Commercetools\Core\Error;
7
8
use Exception;
9
use Psr\Http\Message\RequestInterface;
10
use Psr\Http\Message\ResponseInterface;
11
12
/**
13
 * Base exception for responses with http status code different than 200 or 201
14
 * @package Commercetools\Core\Error
15
 */
16
class ApiException extends Exception
17
{
18
    /**
19
     * @var RequestInterface
20
     */
21
    protected $request;
22
23
    /**
24
     * @var ResponseInterface
25
     */
26
    protected $response;
27
28 114
    public function __construct(
29
        $message,
30
        RequestInterface $request,
31
        ResponseInterface $response = null,
32
        Exception $previous = null
33
    ) {
34 114
        $code = $response ? $response->getStatusCode() : 0;
35 114
        parent::__construct($message, $code, $previous);
36 114
        $this->request = $request;
37 114
        $this->response = $response;
38 114
    }
39
40
    /**
41
     * @param RequestInterface $request
42
     * @param ResponseInterface|null $response
43
     * @param Exception|null $previous
44
     */
45 114
    public static function create(
46
        RequestInterface $request,
47
        ResponseInterface $response = null,
48
        Exception $previous = null
49
    ) {
50 114
        if (is_null($response)) {
51 2
            return new self('Error completing request', $request, null, $previous);
52
        }
53
54 112
        $level = floor($response->getStatusCode() / 100);
55 112
        if ($level == 4) {
56 103
            $label = 'Client error response';
57 9
        } elseif ($level == 5) {
58 9
            $label = 'Server error response';
59
        } else {
60
            $label = 'Unsuccessful response';
61
        }
62
63 112
        $message = $label . ' [url] ' . $request->getUri()
64 112
             . ' [status code] ' . $response->getStatusCode()
65 112
             . ' [reason phrase] ' . $response->getReasonPhrase();
66
67 112
        switch ($response->getStatusCode()) {
68 112
            case 400:
69 57
                return new ErrorResponseException($message, $request, $response, $previous);
70 56
            case 401:
71 11
                if (strpos((string)$response->getBody(), 'invalid_token') !== false) {
72 8
                    return new InvalidTokenException($message, $request, $response, $previous);
73
                }
74 3
                return new InvalidClientCredentialsException($message, $request, $response, $previous);
75 46
            case 404:
76 29
                return new NotFoundException($message, $request, $response, $previous);
77 17
            case 409:
78 4
                return new ConcurrentModificationException($message, $request, $response, $previous);
79 13
            case 500:
80 6
                return new InternalServerErrorException($message, $request, $response, $previous);
81 7
            case 502:
82 1
                return new BadGatewayException($message, $request, $response, $previous);
83 6
            case 503:
84 1
                return new ServiceUnavailableException($message, $request, $response, $previous);
85 5
            case 504:
86 1
                return new GatewayTimeoutException($message, $request, $response, $previous);
87
        }
88
89 4
        return new self($message, $request, $response, $previous);
90
    }
91
92
    /**
93
     * @return RequestInterface
94
     */
95 3
    public function getRequest()
96
    {
97 3
        return $this->request;
98
    }
99
100
    /**
101
     * @return ResponseInterface
102
     */
103 100
    public function getResponse()
104
    {
105 100
        return $this->response;
106
    }
107
108 1
    protected function getResponseJson()
109
    {
110 1
        $response = $this->getResponse();
111 1
        if ($response instanceof ResponseInterface) {
0 ignored issues
show
introduced by
$response is always a sub-type of Psr\Http\Message\ResponseInterface.
Loading history...
112 1
            $json = json_decode($response->getBody(), true);
113 1
            return $json;
114
        }
115
116
        return [];
117
    }
118
119
    /**
120
     * @return array
121
     */
122 1
    public function getErrors()
123
    {
124 1
        $data = $this->getResponseJson();
125
126 1
        return isset($data['errors']) ? $data['errors'] : [];
127
    }
128
129
    /**
130
     * @return string
131
     */
132
    public function getResponseMessage()
133
    {
134
        $data = $this->getResponseJson();
135
136
        return isset($data['message']) ? $data['message'] : '';
137
    }
138
139
    /**
140
     * @return string
141
     */
142
    public function getResponseStatusCode()
143
    {
144
        $data = $this->getResponseJson();
145
146
        return isset($data['statusCode']) ? $data['statusCode'] : '';
147
    }
148
}
149