Passed
Push — master ( c7321f...b302b4 )
by Jens
44:31 queued 22:11
created

ApiException::getErrors()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 2

Importance

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