Passed
Branch php-scrutinizer (9ddcba)
by Jens
09:45
created

ApiException   A

Complexity

Total Complexity 25

Size/Duplication

Total Lines 131
Duplicated Lines 0 %

Test Coverage

Coverage 71.93%

Importance

Changes 0
Metric Value
wmc 25
dl 0
loc 131
ccs 41
cts 57
cp 0.7193
rs 10
c 0
b 0
f 0

8 Methods

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