ApiException::create()   C
last analyzed

Complexity

Conditions 16
Paths 38

Size

Total Lines 55
Code Lines 41

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 40
CRAP Score 16.0036

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 41
dl 0
loc 55
ccs 40
cts 41
cp 0.9756
rs 5.5666
c 2
b 0
f 0
cc 16
nc 38
nop 3
crap 16.0036

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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