Passed
Pull Request — master (#888)
by Tobias
01:50
created

ResponseException::create()   D

Complexity

Conditions 32
Paths 288

Size

Total Lines 67
Code Lines 40

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 32
eloc 40
nc 288
nop 1
dl 0
loc 67
rs 4.287
c 0
b 0
f 0

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
 * Copyright 2017 Facebook, Inc.
4
 *
5
 * You are hereby granted a non-exclusive, worldwide, royalty-free license to
6
 * use, copy, modify, and distribute this software in source code or binary
7
 * form for use in connection with the web services and APIs provided by
8
 * Facebook.
9
 *
10
 * As with any software that integrates with the Facebook platform, your use
11
 * of this software is subject to the Facebook Developer Principles and
12
 * Policies [http://developers.facebook.com/policy/]. This copyright notice
13
 * shall be included in all copies or substantial portions of the software.
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21
 * DEALINGS IN THE SOFTWARE.
22
 *
23
 */
24
namespace Facebook\Exception;
25
26
use Facebook\Response;
27
28
/**
29
 *
30
 * @package Facebook
31
 */
32
class ResponseException extends SDKException
33
{
34
    /**
35
     * @var Response The response that threw the exception.
36
     */
37
    protected $response;
38
39
    /**
40
     * @var array Decoded response.
41
     */
42
    protected $responseData;
43
44
    /**
45
     * Creates a FacebookResponseException.
46
     *
47
     * @param Response     $response          The response that threw the exception.
48
     * @param SDKException $previousException The more detailed exception.
49
     */
50
    public function __construct(Response $response, SDKException $previousException = null)
51
    {
52
        $this->response = $response;
53
        $this->responseData = $response->getDecodedBody();
54
55
        $errorMessage = $this->get('message', 'Unknown error from Graph.');
56
        $errorCode = $this->get('code', -1);
57
58
        parent::__construct($errorMessage, $errorCode, $previousException);
59
    }
60
61
    /**
62
     * A factory for creating the appropriate exception based on the response from Graph.
63
     *
64
     * @param Response $response The response that threw the exception.
65
     *
66
     * @return ResponseException
67
     */
68
    public static function create(Response $response)
69
    {
70
        $data = $response->getDecodedBody();
71
72
        if (!isset($data['error']['code']) && isset($data['code'])) {
73
            $data = ['error' => $data];
74
        }
75
76
        $code = isset($data['error']['code']) ? $data['error']['code'] : null;
77
        $message = isset($data['error']['message']) ? $data['error']['message'] : 'Unknown error from Graph.';
78
79
        if (isset($data['error']['error_subcode'])) {
80
            switch ($data['error']['error_subcode']) {
81
                // Other authentication issues
82
                case 458:
83
                case 459:
84
                case 460:
85
                case 463:
86
                case 464:
87
                case 467:
88
                    return new static($response, new AuthenticationException($message, $code));
89
                // Video upload resumable error
90
                case 1363030:
91
                case 1363019:
92
                case 1363037:
93
                case 1363033:
94
                case 1363021:
95
                case 1363041:
96
                    return new static($response, new ResumableUploadException($message, $code));
97
            }
98
        }
99
100
        switch ($code) {
101
            // Login status or token expired, revoked, or invalid
102
            case 100:
103
            case 102:
104
            case 190:
105
                return new static($response, new AuthenticationException($message, $code));
106
107
            // Server issue, possible downtime
108
            case 1:
109
            case 2:
110
                return new static($response, new ServerException($message, $code));
111
112
            // API Throttling
113
            case 4:
114
            case 17:
115
            case 341:
116
                return new static($response, new ThrottleException($message, $code));
117
118
            // Duplicate Post
119
            case 506:
120
                return new static($response, new ClientException($message, $code));
121
        }
122
123
        // Missing Permissions
124
        if ($code == 10 || ($code >= 200 && $code <= 299)) {
125
            return new static($response, new AuthorizationException($message, $code));
126
        }
127
128
        // OAuth authentication error
129
        if (isset($data['error']['type']) && $data['error']['type'] === 'OAuthException') {
130
            return new static($response, new AuthenticationException($message, $code));
131
        }
132
133
        // All others
134
        return new static($response, new OtherException($message, $code));
135
    }
136
137
    /**
138
     * Checks isset and returns that or a default value.
139
     *
140
     * @param string $key
141
     * @param mixed  $default
142
     *
143
     * @return mixed
144
     */
145
    private function get($key, $default = null)
146
    {
147
        if (isset($this->responseData['error'][$key])) {
148
            return $this->responseData['error'][$key];
149
        }
150
151
        return $default;
152
    }
153
154
    /**
155
     * Returns the HTTP status code
156
     *
157
     * @return int
158
     */
159
    public function getHttpStatusCode()
160
    {
161
        return $this->response->getHttpStatusCode();
162
    }
163
164
    /**
165
     * Returns the sub-error code
166
     *
167
     * @return int
168
     */
169
    public function getSubErrorCode()
170
    {
171
        return $this->get('error_subcode', -1);
172
    }
173
174
    /**
175
     * Returns the error type
176
     *
177
     * @return string
178
     */
179
    public function getErrorType()
180
    {
181
        return $this->get('type', '');
182
    }
183
184
    /**
185
     * Returns the raw response used to create the exception.
186
     *
187
     * @return string
188
     */
189
    public function getRawResponse()
190
    {
191
        return $this->response->getBody();
192
    }
193
194
    /**
195
     * Returns the decoded response used to create the exception.
196
     *
197
     * @return array
198
     */
199
    public function getResponseData()
200
    {
201
        return $this->responseData;
202
    }
203
204
    /**
205
     * Returns the response entity used to create the exception.
206
     *
207
     * @return Response
208
     */
209
    public function getResponse()
210
    {
211
        return $this->response;
212
    }
213
}
214