Passed
Push — master ( 19680a...1318d6 )
by Michael
03:41
created

JSend::setStatus()   A

Complexity

Conditions 4
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 4

Importance

Changes 0
Metric Value
dl 0
loc 10
ccs 5
cts 5
cp 1
rs 9.2
c 0
b 0
f 0
cc 4
eloc 5
nc 2
nop 1
crap 4
1
<?php
2
3
/**
4
 * This file is part of the JSend package.
5
 *
6
 * @author Michael Webbers <[email protected]>
7
 * @copyright Copyright (c) 2015, Michael Webbers
8
 * @license http://opensource.org/licenses/Apache-2.0 Apache v2 License
9
 * @version 1.0.0
10
 */
11
12
namespace miWebb\JSend;
13
14
/**
15
 * The JSend class.
16
 *
17
 * @since 1.0.0
18
 * @see http://labs.omniti.com/labs/jsend
19
 */
20
class JSend
21
{
22
	const SUCCESS = 'success';
23
	const FAIL = 'fail';
24
	const ERROR = 'error';
25
26
	/** @var string The status. */
27
	private $status;
28
29
	/** @var array The data. */
30
	private $data;
31
32
	/** @var string|null The message. */
33
	private $message;
34
35
	/** @var int|null The code. */
36
	private $code;
37
38
	/**
39
	 * Construct a JSend object with the given status, data, message and code.
40
	 *
41
	 * @param string $status
42
	 * @param array|null $data = null
43
	 * @param string|null $message = null
44
	 * @param int|null $code = null
45
	 * @throws \UnexpectedValueException
46
	 */
47 32
	public function __construct($status, array $data = null, $message = null, $code = null)
48
	{
49 32
		$this->setStatus($status);
50 32
		$this->setData($data);
51 32
		$this->setMessage($message);
52 32
		$this->setCode($code);
53 32
	}
54
55
	/**
56
	 * Returns the string representation of the object.
57
	 *
58
	 * @return string the string representation of the object.
59
	 */
60 7
	public function __toString()
61
	{
62 7
		return $this->encode();
63
	}
64
65
	/**
66
	 * Returns the array representation of the object.
67
	 *
68
	 * @return array the array representation of the object.
69
	 */
70 9
	public function toArray()
71
	{
72 9
		$result = ['status' => $this->status];
73
74 9
		switch ($this->status) {
75 9
			case self::ERROR:
76 5
				$result['message'] = $this->message;
77
78 5
				if ($this->code !== null) {
79 5
					$result['code'] = $this->code;
80
				}
81
82
				//if (!empty($this->data)) {
0 ignored issues
show
Unused Code Comprehensibility introduced by
77% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
83 5
				$result['data'] = $this->data;
84
				//}
85
86 5
				break;
87
88
			default:
89 7
				$result['data'] = $this->data;
90
91 7
				break;
92
		}
93
94 9
		return $result;
95
	}
96
97
	/**
98
	 * Returns a JSend succes object with the given data.
99
	 *
100
	 * @param array|null $data = null
101
	 * @return JSend a JSend succes object with the given data.
102
	 */
103 2
	public static function success(array $data = null)
104
	{
105 2
		return new self(self::SUCCESS, $data);
106
	}
107
108
	/**
109
	 * Returns a JSend fail object with the given data.
110
	 *
111
	 * @param array|null $data = null
112
	 * @return JSend a JSend fail object with the given data.
113
	 */
114 2
	public static function fail(array $data = null)
115
	{
116 2
		return new self(self::FAIL, $data);
117
	}
118
119
	/**
120
	 * Returns a JSend error object with the given message, code and data.
121
	 *
122
	 * @param string $message
123
	 * @param int|null $code = null
124
	 * @param array|null $data = null
125
	 * @return JSend a JSend error object with the given message, code and data.
126
	 */
127 2
	public static function error($message, $code = null, array $data = null)
128
	{
129 2
		return new self(self::ERROR, $data, $message, $code);
130
	}
131
132
	/**
133
	 * Returns the decoded JSend object.
134
	 *
135
	 * @param string $input
136
	 * @return JSend the decoded JSend object.
137
	 * @throws \UnexpectedValueException
138
	 */
139 7
	public static function decode($input)
140
	{
141 7
		$json = json_decode($input, true);
142
143 7
		if ($json === null) {
144 1
			throw new \UnexpectedValueException('JSend JSON can not be decoded.');
145
		}
146
147 6
		return self::decodeJson($json);
148
	}
149
150
	/**
151
	 * Returns the decoded JSend input.
152
	 *
153
	 * @param array $json
154
	 * @return JSend the decoded JSend input.
155
	 * @throws \UnexpectedValueException
156
	 */
157 6
	public static function decodeJson(array $json)
158
	{
159 6
		if (!array_key_exists('status', $json)) {
160 1
			throw new \UnexpectedValueException('JSend objects require a status.');
161
		}
162
163 5
		switch ($json['status']) {
164 5
			case self::SUCCESS:
165 2
				return self::decodeSucces($json);
166
167 4
			case self::FAIL:
168 2
				return self::decodeFail($json);
169
170 3
			case self::ERROR:
171 2
				return self::decodeError($json);
172
		}
173
174 1
		throw new \UnexpectedValueException($json['status'] . ' is not a valid JSend status.');
175
	}
176
177
	/**
178
	 * Returns the decoded jSend succes object.
179
	 *
180
	 * @param array $json
181
	 * @return JSend the decoded jSend succes object.
182
	 * @throws \UnexpectedValueException
183
	 */
184 2 View Code Duplication
	public static function decodeSucces(array $json)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
185
	{
186 2
		if (!array_key_exists('data', $json)) {
187 1
			throw new \UnexpectedValueException('JSend success objects require data.');
188
		}
189
190 1
		return self::success($json['data']);
191
	}
192
193
	/**
194
	 * Returns the decoded jSend fail object.
195
	 *
196
	 * @param array $json
197
	 * @return JSend the decoded jSend fail object.
198
	 * @throws \UnexpectedValueException
199
	 */
200 2 View Code Duplication
	public static function decodeFail(array $json)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
201
	{
202 2
		if (!array_key_exists('data', $json)) {
203 1
			throw new \UnexpectedValueException('JSend fail objects require data.');
204
		}
205
206 1
		return self::fail($json['data']);
207
	}
208
209
	/**
210
	 * Returns the decoded jSend error object.
211
	 *
212
	 * @param array $json
213
	 * @return JSend the decoded jSend error object.
214
	 * @throws \UnexpectedValueException
215
	 */
216 2
	public static function decodeError(array $json)
217
	{
218 2
		if (!array_key_exists('message', $json)) {
219 1
			throw new \UnexpectedValueException('JSend error objects require a message.');
220
		}
221
222 1
		$code = array_key_exists('code', $json) ? $json['code'] : null;
223 1
		$data = array_key_exists('data', $json) ? $json['data'] : null;
224
225 1
		return self::error($json['message'], $code, $data);
226
	}
227
228
	/**
229
	 * Returns the encoded JSend object.
230
	 *
231
	 * @return string the encoded JSend object.
232
	 */
233 8
	public function encode()
234
	{
235 8
		return json_encode($this->toArray());
236
	}
237
238
	/**
239
	 * Returns true if the status is success.
240
	 *
241
	 * @return bool true if the status is success.
242
	 */
243 1
	public function isSuccess()
244
	{
245 1
		return self::SUCCESS === $this->status;
246
	}
247
248
	/**
249
	 * Returns true if the status is fail.
250
	 *
251
	 * @return bool true if the status is fail.
252
	 */
253 1
	public function isFail()
254
	{
255 1
		return self::FAIL === $this->status;
256
	}
257
258
	/**
259
	 * Returns true if the status is error.
260
	 *
261
	 * @return bool true if the status is error.
262
	 */
263 1
	public function isError()
264
	{
265 1
		return self::ERROR === $this->status;
266
	}
267
268
	/**
269
	 * Returns the status.
270
	 *
271
	 * @return string the status.
272
	 */
273 2
	public function getStatus()
274
	{
275 2
		return $this->status;
276
	}
277
278
	/**
279
	 * Set the status.
280
	 *
281
	 * @param string $status
282
	 * @return JSend $this
283
	 * @throws \UnexpectedValueException
284
	 */
285 32
	public function setStatus($status)
286
	{
287 32
		if ($status !== self::SUCCESS && $status !== self::FAIL && $status !== self::ERROR) {
288 1
			throw new \UnexpectedValueException($status . ' is not a valid JSend status.');
289
		}
290
291 32
		$this->status = $status;
292
293 32
		return $this;
294
	}
295
296
	/**
297
	 * Returns the data.
298
	 *
299
	 * @return array the data.
300
	 */
301 3
	public function getData()
302
	{
303 3
		return $this->data;
304
	}
305
306
	/**
307
	 * Set the data.
308
	 *
309
	 * @param array|null $data = null
310
	 * @return JSend $this
311
	 */
312 32
	public function setData(array $data = null)
313
	{
314 32
		$this->data = $data;
0 ignored issues
show
Documentation Bug introduced by
It seems like $data can be null. However, the property $data is declared as array. Maybe change the type of the property to array|null or add a type check?

Our type inference engine has found an assignment of a scalar value (like a string, an integer or null) to a property which is an array.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property.

To type hint that a parameter can be either an array or null, you can set a type hint of array and a default value of null. The PHP interpreter will then accept both an array or null for that parameter.

function aContainsB(array $needle = null, array  $haystack) {
    if (!$needle) {
        return false;
    }

    return array_intersect($haystack, $needle) == $haystack;
}

The function can be called with either null or an array for the parameter $needle but will only accept an array as $haystack.

Loading history...
315
316 32
		return $this;
317
	}
318
319
	/**
320
	 * Returns the message.
321
	 *
322
	 * @return string|null the message.
323
	 */
324 2
	public function getMessage()
325
	{
326 2
		return $this->message;
327
	}
328
329
	/**
330
	 * Set the message.
331
	 *
332
	 * @param string|null $message = null
333
	 * @return JSend $this
334
	 */
335 32
	public function setMessage($message = null)
336
	{
337 32
		$this->message = $message;
338
339 32
		return $this;
340
	}
341
342
	/**
343
	 * Returns the code.
344
	 *
345
	 * @return int|null the code.
346
	 */
347 2
	public function getCode()
348
	{
349 2
		return $this->code;
350
	}
351
352
	/**
353
	 * Set the code.
354
	 *
355
	 * @param int|null $code = null
356
	 * @return JSend $this
357
	 */
358 32
	public function setCode($code = null)
359
	{
360 32
		$this->code = $code;
361
362 32
		return $this;
363
	}
364
365
	/**
366
	 * Sends the JSend object.
367
	 *
368
	 * @return void
369
	 */
370 6
	public function send()
371
	{
372 6
		if ($this->status === self::FAIL) {
373 2
			http_response_code(400);
374 4
		} elseif ($this->status === self::ERROR) {
375 2
			http_response_code(500);
376
		}
377
378 6
		header('Content-Type: application/json');
379 6
		echo (string) $this;
380 6
	}
381
}
382