Completed
Push — master ( 1d2d63...5f432b )
by Jens
09:03
created

ApiException::create()   C

Complexity

Conditions 13
Paths 31

Size

Total Lines 46
Code Lines 36

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 31
CRAP Score 13.0051

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 46
ccs 31
cts 32
cp 0.9688
rs 5.1118
cc 13
eloc 36
nc 31
nop 3
crap 13.0051

How to fix   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
 * @author @jayS-de <[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 57
    public function __construct(
28
        $message,
29
        RequestInterface $request,
30
        ResponseInterface $response = null,
31
        \Exception $previous = null
32
    ) {
33 57
        $code = $response ? $response->getStatusCode() : 0;
34 57
        parent::__construct($message, $code, $previous);
35 57
        $this->request = $request;
36 57
        $this->response = $response;
37 57
    }
38
39
    /**
40
     * @param RequestInterface $request
41
     * @param ResponseInterface|null $response
42
     * @param \Exception|null $previous
43
     */
44 57
    public static function create(
45
        RequestInterface $request,
46
        ResponseInterface $response = null,
47
        \Exception $previous = null
48
    ) {
49 57
        if (is_null($response)) {
50 2
            return new self('Error completing request', $request, null, $previous);
51
        }
52
53 55
        $level = floor($response->getStatusCode() / 100);
54 55
        if ($level == 4) {
55 46
            $label = 'Client error response';
56 9
        } elseif ($level == 5) {
57 9
            $label = 'Server error response';
58
        } else {
59
            $label = 'Unsuccessful response';
60
        }
61
62 55
        $message = $label . ' [url] ' . $request->getUri()
63 55
             . ' [status code] ' . $response->getStatusCode()
64 55
             . ' [reason phrase] ' . $response->getReasonPhrase();
65
66 55
        switch ($response->getStatusCode()) {
67 55
            case 400:
68 24
                return new ErrorResponseException($message, $request, $response, $previous);
69 31
            case 401:
70 6
                if (strpos((string)$response->getBody(), 'invalid_token') !== false) {
71 3
                    return new InvalidTokenException($message, $request, $response, $previous);
72
                }
73 3
                return new InvalidClientCredentialsException($message, $request, $response, $previous);
74 25
            case 404:
75 10
                return new NotFoundException($message, $request, $response, $previous);
76 15
            case 409:
77 4
                return new ConcurrentModificationException($message, $request, $response, $previous);
78 11
            case 500:
79 6
                return new InternalServerErrorException($message, $request, $response, $previous);
80 5
            case 502:
81 1
                return new BadGatewayException($message, $request, $response, $previous);
82 4
            case 503:
83 1
                return new ServiceUnavailableException($message, $request, $response, $previous);
84 3
            case 504:
85 1
                return new GatewayTimeoutException($message, $request, $response, $previous);
86
        }
87
88 2
        return new self($message, $request, $response, $previous);
89
    }
90
91
    /**
92
     * @return RequestInterface
93
     */
94 1
    public function getRequest()
95
    {
96 1
        return $this->request;
97
    }
98
99
    /**
100
     * @return ResponseInterface
101
     */
102 47
    public function getResponse()
103
    {
104 47
        return $this->response;
105
    }
106
107
    protected function getResponseJson()
108
    {
109
        $response = $this->getResponse();
110
        if ($response instanceof ResponseInterface) {
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