Passed
Push — master ( 7a440c...724ebd )
by Marcin
10:28 queued 11s
created

ResponseBuilder::getMessageForApiCode()   A

Complexity

Conditions 4
Paths 6

Size

Total Lines 17
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 4

Importance

Changes 3
Bugs 0 Features 0
Metric Value
cc 4
eloc 8
nc 6
nop 3
dl 0
loc 17
rs 10
c 3
b 0
f 0
ccs 8
cts 8
cp 1
crap 4
1
<?php
2
declare(strict_types=1);
3
4
namespace MarcinOrlowski\ResponseBuilder;
5
6
/**
7
 * Laravel API Response Builder
8
 *
9
 * @package   MarcinOrlowski\ResponseBuilder
10
 *
11
 * @author    Marcin Orlowski <mail (#) marcinOrlowski (.) com>
12
 * @copyright 2016-2019 Marcin Orlowski
13
 * @license   http://www.opensource.org/licenses/mit-license.php MIT
14
 * @link      https://github.com/MarcinOrlowski/laravel-api-response-builder
15
 */
16
17
use Illuminate\Support\Facades\Config;
18
use Illuminate\Support\Facades\Response;
19
use Symfony\Component\HttpFoundation\Response as HttpResponse;
20
21
22
/**
23
 * Builds standardized HttpResponse response object
24
 */
25
class ResponseBuilder
26
{
27
    /**
28
     * Default HTTP code to be used with success responses
29
     *
30
     * @var int
31
     */
32
    public const DEFAULT_HTTP_CODE_OK = HttpResponse::HTTP_OK;
33
34
    /**
35
     * Default HTTP code to be used with error responses
36
     *
37
     * @var int
38
     */
39
    public const DEFAULT_HTTP_CODE_ERROR = HttpResponse::HTTP_BAD_REQUEST;
40
41
    /**
42
     * Min allowed HTTP code for errorXXX()
43
     *
44
     * @var int
45
     */
46
    public const ERROR_HTTP_CODE_MIN = 400;
47
48
    /**
49
     * Max allowed HTTP code for errorXXX()
50
     *
51
     * @var int
52
     */
53
    public const ERROR_HTTP_CODE_MAX = 599;
54
55
    /**
56
     * Configuration keys
57
     */
58
    public const CONF_KEY_DEBUG_DEBUG_KEY        = 'response_builder.debug.debug_key';
59
    public const CONF_KEY_DEBUG_EX_TRACE_ENABLED = 'response_builder.debug.exception_handler.trace_enabled';
60
    public const CONF_KEY_DEBUG_EX_TRACE_KEY     = 'response_builder.debug.exception_handler.trace_key';
61
    public const CONF_KEY_MAP                    = 'response_builder.map';
62
    public const CONF_KEY_ENCODING_OPTIONS       = 'response_builder.encoding_options';
63
    public const CONF_KEY_CLASSES                = 'response_builder.classes';
64
    public const CONF_KEY_MIN_CODE               = 'response_builder.min_code';
65
    public const CONF_KEY_MAX_CODE               = 'response_builder.max_code';
66
    public const CONF_EXCEPTION_HANDLER_KEY      = 'response_builder.exception_handler';
67
68
    /**
69
     * Default keys to be used by exception handler while adding debug information
70
     */
71
    public const KEY_DEBUG   = 'debug';
72
    public const KEY_TRACE   = 'trace';
73
    public const KEY_CLASS   = 'class';
74
    public const KEY_FILE    = 'file';
75
    public const KEY_LINE    = 'line';
76
    public const KEY_KEY     = 'key';
77
    public const KEY_METHOD  = 'method';
78
    public const KEY_SUCCESS = 'success';
79
    public const KEY_CODE    = 'code';
80
    public const KEY_LOCALE  = 'locale';
81
    public const KEY_MESSAGE = 'message';
82
    public const KEY_DATA    = 'data';
83
84
    /**
85
     * Default key to be used by exception handler while processing ValidationException
86
     * to return all the error messages
87
     *
88
     * @var string
89
     */
90
    public const KEY_MESSAGES = 'messages';
91
92
    /**
93
     * Default JSON encoding options. Must be specified as final value (i.e. 271) and NOT
94
     * PHP expression i.e. `JSON_HEX_TAG|JSON_HEX_APOS|...` as such syntax is not yet supported
95
     * by PHP.
96
     *
97
     * 271 = JSON_HEX_TAG|JSON_HEX_APOS|JSON_HEX_AMP|JSON_HEX_QUOT|JSON_UNESCAPED_UNICODE
98
     *
99 4
     * @var int
100
     */
101 4
    public const DEFAULT_ENCODING_OPTIONS = 271;
102
103 4
104 3
105 2
    /**
106 2
     * Returns success
107
     *
108
     * @param object|array|null $data          Array of primitives and supported objects to be returned in 'data' node
109
     *                                         of the JSON response, single supported object or @null if there's no
110 1
     *                                         to be returned.
111 1
     * @param integer|null      $api_code      API code to be returned or @null to use value of BaseApiCodes::OK().
112
     * @param array|null        $placeholders  Placeholders passed to Lang::get() for message placeholders
113 1
     *                                         substitution or @null if none.
114 1
     * @param integer|null      $http_code     HTTP code to be used for HttpResponse sent or @null
115 1
     *                                         for default DEFAULT_HTTP_CODE_OK.
116 1
     * @param integer|null      $json_opts     See http://php.net/manual/en/function.json-encode.php for supported
117
     *                                         options or pass @null to use value from your config (or defaults).
118
     *
119
     * @return HttpResponse
120
     */
121 1
    public static function success($data = null, $api_code = null, array $placeholders = null,
122
                                   int $http_code = null, int $json_opts = null): HttpResponse
123
    {
124 1
        return static::buildSuccessResponse($data, $api_code, $placeholders, $http_code, $json_opts);
125
    }
126
127
    /**
128
     * Returns success
129
     *
130
     * @param integer|null $api_code      API code to be returned or @null to use value of BaseApiCodes::OK().
131
     * @param array|null   $placeholders  Placeholders passed to Lang::get() for message placeholders
132
     *                                    substitution or @null if none.
133
     * @param integer|null $http_code     HTTP code to be used for HttpResponse sent or @null
134
     *                                    for default DEFAULT_HTTP_CODE_OK.
135
     *
136
     * @return HttpResponse
137
     */
138
    public static function successWithCode(int $api_code = null, array $placeholders = null,
139 12
                                           int $http_code = null): HttpResponse
140
    {
141
        return static::success(null, $api_code, $placeholders, $http_code);
142 12
    }
143
144
    /**
145
     * Returns success with custom HTTP code
146
     *
147
     * @param integer|null $http_code HTTP return code to be set for this response. If @null is passed, falls back
148
     *                                to DEFAULT_HTTP_CODE_OK.
149
     *
150
     * @return HttpResponse
151
     */
152
    public static function successWithHttpCode(int $http_code = null): HttpResponse
153
    {
154 1
        return static::buildSuccessResponse(null, BaseApiCodes::OK(), [], $http_code);
155
    }
156 1
157
    /**
158
     * @param string            $message       Custom message to be returned as part of the response.
159
     * @param object|array|null $data          Array of primitives and supported objects to be returned in 'data' node
160
     *                                         of the JSON response, single supported object or @null if there's no
161
     *                                         to be returned.
162
     * @param integer|null      $http_code     HTTP code to be used for HttpResponse sent or @null
163
     *                                         for default DEFAULT_HTTP_CODE_OK.
164
     *
165
     * @return \Symfony\Component\HttpFoundation\Response
166
     */
167 4
    public static function successWithMessage(string $message, $data = null, int $api_code = null,
168
                                              int $http_code = null): HttpResponse
169 4
    {
170
        return static::buildSuccessResponse($data, $api_code, [], $http_code, null, $message);
171
    }
172
173
    /**
174
     * @param object|array|null $data          Array of primitives and supported objects to be returned in 'data' node.
175
     *                                         of the JSON response, single supported object or @null if there's no
176
     *                                         to be returned.
177
     * @param integer|null      $api_code      API code to be returned or @null to use value of BaseApiCodes::OK().
178
     * @param array|null        $placeholders  Placeholders passed to Lang::get() for message placeholders
179
     *                                         substitution or @null if none.
180
     * @param integer|null      $http_code     HTTP code to be used for HttpResponse sent or @null
181
     *                                         for default DEFAULT_HTTP_CODE_OK.
182
     * @param integer|null      $json_opts     See http://php.net/manual/en/function.json-encode.php for supported
183
     *                                         options or pass @null to use value from your config (or defaults).
184 16
     *
185
     * @return HttpResponse
186
     *
187 16
     * @throws \InvalidArgumentException Thrown when provided arguments are invalid.
188 16
     */
189
    protected static function buildSuccessResponse($data = null, int $api_code = null, array $placeholders = null,
190 16
                                                   int $http_code = null, int $json_opts = null,
191 16
                                                   $msg_or_api_code = null): HttpResponse
192 16
    {
193
        $http_code = $http_code ?? static::DEFAULT_HTTP_CODE_OK;
194 14
        $api_code = $api_code ?? BaseApiCodes::OK();
195
        $msg_or_api_code = $msg_or_api_code ?? $api_code;
196
197
        Validator::assertInt('api_code', $api_code);
198
        Validator::assertInt('http_code', $http_code);
199
        Validator::assertIntRange('http_code', $http_code, 200, 299);
200
        Validator::assertType('msg_or_api_code', $msg_or_api_code, [Validator::TYPE_STRING,
201
                                                                    Validator::TYPE_INTEGER]);
202
203
        return static::make(true, $api_code, $msg_or_api_code, $data, $http_code, $placeholders, null, $json_opts);
204
    }
205
206
    /**
207
     * Builds error Response object. Supports optional arguments passed to Lang::get() if associated error
208
     * message uses placeholders as well as return data payload
209
     *
210 4
     * @param integer           $api_code      Your API code to be returned with the response object.
211
     * @param array|null        $placeholders  Placeholders passed to Lang::get() for message placeholders
212
     *                                         substitution or @null if none.
213 4
     * @param object|array|null $data          Array of primitives and supported objects to be returned in 'data' node
214
     *                                         of the JSON response, single supported object or @null if there's no
215
     *                                         to be returned.
216
     * @param integer|null      $http_code     HTTP code to be used for HttpResponse sent or @null
217
     *                                         for default DEFAULT_HTTP_CODE_ERROR.
218
     * @param integer|null      $json_opts     See http://php.net/manual/en/function.json-encode.php for supported
219
     *                                         options or pass @null to use value from your config (or defaults).
220
     *
221
     * @return HttpResponse
222
     */
223
    public static function error(int $api_code, array $placeholders = null, $data = null, int $http_code = null,
224
                                 int $encoding_options = null): HttpResponse
225 1
    {
226
        return static::buildErrorResponse($data, $api_code, $http_code, $placeholders, $encoding_options);
227
    }
228 1
229
    /**
230
     * @param integer           $api_code      Your API code to be returned with the response object.
231
     * @param object|array|null $data          Array of primitives and supported objects to be returned in 'data' node
232
     *                                         of the JSON response, single supported object or @null if there's no
233
     *                                         to be returned.
234
     * @param array|null        $placeholders  Placeholders passed to Lang::get() for message placeholders
235
     *                                         substitution or @null if none.
236
     * @param integer|null      $json_opts     See http://php.net/manual/en/function.json-encode.php for supported
237
     *                                         options or pass @null to use value from your config (or defaults).
238
     *
239
     * @return HttpResponse
240
     */
241
    public static function errorWithData(int $api_code, $data, array $placeholders = null,
242
                                         int $json_opts = null): HttpResponse
243 1
    {
244
        return static::buildErrorResponse($data, $api_code, null, $placeholders, $json_opts);
245
    }
246 1
247
    /**
248
     * @param integer           $api_code      Your API code to be returned with the response object.
249
     * @param object|array|null $data          Array of primitives and supported objects to be returned in 'data' node
250
     *                                         of the JSON response, single supported object or @null if there's no
251
     *                                         to be returned.
252
     * @param integer           $http_code     HTTP code to be used for HttpResponse sent.
253
     * @param array|null        $placeholders  Placeholders passed to Lang::get() for message placeholders
254
     *                                         substitution or @null if none.
255
     * @param integer|null      $json_opts     See http://php.net/manual/en/function.json-encode.php for supported
256
     *                                         options or pass @null to use value from your config (or defaults).
257
     *
258 1
     * @return HttpResponse
259
     *
260 1
     * @throws \InvalidArgumentException if http_code is @null
261
     */
262
    public static function errorWithDataAndHttpCode(int $api_code, $data, int $http_code, array $placeholders = null,
263
                                                    int $json_opts = null): HttpResponse
264
    {
265
        return static::buildErrorResponse($data, $api_code, $http_code, $placeholders, $json_opts);
266
    }
267
268
    /**
269
     * @param integer    $api_code     Your API code to be returned with the response object.
270
     * @param integer    $http_code    HTTP code to be used for HttpResponse sent or @null
271
     *                                 for default DEFAULT_HTTP_CODE_ERROR.
272
     * @param array|null $placeholders Placeholders passed to Lang::get() for message placeholders
273 1
     *                                 substitution or @null if none.
274
     *
275
     * @return HttpResponse
276 1
     *
277 1
     * @throws \InvalidArgumentException if http_code is @null
278
     */
279
    public static function errorWithHttpCode(int $api_code, int $http_code, array $placeholders = null): HttpResponse
280
    {
281
        return static::buildErrorResponse(null, $api_code, $http_code, $placeholders);
282
    }
283
284
    /**
285
     * @param integer           $api_code  Your API code to be returned with the response object.
286
     * @param string            $message   Custom message to be returned as part of error response
287
     * @param object|array|null $data      Array of primitives and supported objects to be returned in 'data' node
288
     *                                     of the JSON response, single supported object or @null if there's no
289
     *                                     to be returned.
290
     * @param integer|null      $http_code Optional HTTP status code to be used for HttpResponse sent
291 6
     *                                     or @null for DEFAULT_HTTP_CODE_ERROR
292
     * @param integer|null      $json_opts See http://php.net/manual/en/function.json-encode.php for supported
293
     *                                     options or pass @null to use value from your config (or defaults).
294
     *
295 6
     * @return HttpResponse
296 6
     */
297
    public static function errorWithMessageAndData(int $api_code, string $message, $data,
298
                                                   int $http_code = null, int $json_opts = null): HttpResponse
299
    {
300
        return static::buildErrorResponse($data, $api_code, $http_code, null,
301
            $message, null, $json_opts);
302
    }
303
304
    /**
305
     * @param integer           $api_code   Your API code to be returned with the response object.
306 1
     * @param string            $message    custom message to be returned as part of error response
307
     * @param object|array|null $data       Array of primitives and supported objects to be returned in 'data' node
308 1
     *                                      of the JSON response, single supported object or @null if there's no
309
     *                                      to be returned.
310
     * @param integer|null      $http_code  HTTP code to be used for HttpResponse sent or @null
311
     *                                      for default DEFAULT_HTTP_CODE_ERROR.
312
     * @param integer|null      $json_opts  See http://php.net/manual/en/function.json-encode.php for supported
313
     *                                      options or pass @null to use value from your config (or defaults).
314
     * @param array|null        $debug_data optional debug data array to be added to returned JSON.
315
     *
316
     * @return HttpResponse
317
     */
318
    public static function errorWithMessageAndDataAndDebug(int $api_code, string $message, $data,
319
                                                           int $http_code = null, int $json_opts = null,
320
                                                           array $debug_data = null): HttpResponse
321
    {
322
        return static::buildErrorResponse($data, $api_code, $http_code, null,
323
            $message, null, $json_opts, $debug_data);
324
    }
325
326
    /**
327
     * @param integer      $api_code  Your API code to be returned with the response object.
328
     * @param string       $message   Custom message to be returned as part of error response
329
     * @param integer|null $http_code HTTP code to be used with final response sent or @null
330
     *                                for default DEFAULT_HTTP_CODE_ERROR.
331 18
     *
332
     * @return HttpResponse
333
     */
334
    public static function errorWithMessage(int $api_code, string $message, int $http_code = null): HttpResponse
335 18
    {
336 18
        return static::buildErrorResponse(null, $api_code, $http_code, null, $message);
337
    }
338 18
339
    /**
340 18
     * Builds error Response object. Supports optional arguments passed to Lang::get() if associated error message
341 18
     * uses placeholders as well as return data payload
342 16
     *
343
     * @param object|array|null $data          Array of primitives and supported objects to be returned in 'data' node
344 18
     *                                         of the JSON response, single supported object or @null if there's no
345 2
     *                                         to be returned.
346
     * @param integer           $api_code      Your API code to be returned with the response object.
347
     * @param integer|null      $http_code     HTTP code to be used for HttpResponse sent or @null
348 16
     *                                         for default DEFAULT_HTTP_CODE_ERROR.
349 16
     * @param array|null        $placeholders  Placeholders passed to Lang::get() for message placeholders
350
     *                                         substitution or @null if none.
351 15
     * @param string|null       $message       custom message to be returned as part of error response
352
     * @param array|null        $headers       optional HTTP headers to be returned in error response
353 15
     * @param integer|null      $json_opts     See http://php.net/manual/en/function.json-encode.php for supported
354 15
     *                                         options or pass @null to use value from your config (or defaults).
355
     * @param array|null        $debug_data    optional debug data array to be added to returned JSON.
356
     *
357
     * @return HttpResponse
358
     *
359
     * @throws \InvalidArgumentException Thrown if $code is not correct, outside the range, equals OK code etc.
360
     *
361
     * @noinspection MoreThanThreeArgumentsInspection
362
     */
363
    protected static function buildErrorResponse($data, int $api_code, int $http_code = null,
364
                                                 array $placeholders = null,
365
                                                 string $message = null, array $headers = null,
366
                                                 int $json_opts = null,
367
                                                 array $debug_data = null): HttpResponse
368
    {
369
        $http_code = $http_code ?? static::DEFAULT_HTTP_CODE_ERROR;
370
        $headers = $headers ?? [];
371
372
        Validator::assertInt('api_code', $api_code);
373
374
        $code_ok = BaseApiCodes::OK();
375 35
        if ($api_code !== $code_ok) {
376
            Validator::assertIntRange('api_code', $api_code, BaseApiCodes::getMinCode(), BaseApiCodes::getMaxCode());
377
        }
378
        if ($api_code === $code_ok) {
379 35
            throw new \InvalidArgumentException(
380 35
                "Error response cannot use api_code of value  {$code_ok} which is reserved for OK");
381 35
        }
382
383 35
        Validator::assertInt('http_code', $http_code);
384
        Validator::assertIntRange('http_code', $http_code, static::ERROR_HTTP_CODE_MIN, static::ERROR_HTTP_CODE_MAX);
385 34
386 34
        $msg_or_api_code = $message ?? $api_code;
387 1
388 1
        return static::make(false, $api_code, $msg_or_api_code, $data, $http_code,
389 1
            $placeholders, $headers, $json_opts, $debug_data);
390
    }
391
392 33
    /**
393 2
     * @param boolean           $success         @true if response reports successful operation, @false otherwise.
394 2
     * @param integer           $api_code        Your API code to be returned with the response object.
395 2
     * @param string|integer    $msg_or_api_code message string or valid API code to get message for
396
     * @param object|array|null $data            optional additional data to be included in response object
397
     * @param integer|null      $http_code       HTTP code for the HttpResponse or @null for either DEFAULT_HTTP_CODE_OK
398
     *                                           or DEFAULT_HTTP_CODE_ERROR depending on the $success.
399
     * @param array|null        $placeholders    Placeholders passed to Lang::get() for message placeholders
400
     *                                           substitution or @null if none.
401 31
     * @param array|null        $headers         Optional HTTP headers to be returned in the response.
402 23
     * @param integer|null      $json_opts       See http://php.net/manual/en/function.json-encode.php for supported
403 23
     *                                           options or pass @null to use value from your config (or defaults).
404
     * @param array|null        $debug_data      Optional debug data array to be added to returned JSON.
405 2
     *
406
     * @return HttpResponse
407
     *
408 23
     * @throws \InvalidArgumentException If $api_code is neither a string nor valid integer code.
409 23
     * @throws \InvalidArgumentException if $data is an object of class that is not configured in "classes" mapping.
410
     *
411
     * @noinspection MoreThanThreeArgumentsInspection
412 31
     */
413 31
    protected static function make(bool $success, int $api_code, $msg_or_api_code, $data = null,
414 28
                                   int $http_code = null, array $placeholders = null, array $headers = null,
415
                                   int $json_opts = null, array $debug_data = null): HttpResponse
416
    {
417
        $headers = $headers ?? [];
418
        $http_code = $http_code ?? ($success ? static::DEFAULT_HTTP_CODE_OK : static::DEFAULT_HTTP_CODE_ERROR);
419
        $json_opts = $json_opts ?? Config::get(self::CONF_KEY_ENCODING_OPTIONS, static::DEFAULT_ENCODING_OPTIONS);
420
421
        Validator::assertInt('encoding_options', $json_opts);
422
423
        Validator::assertInt('api_code', $api_code);
424
        if (!BaseApiCodes::isCodeValid($api_code)) {
425
            $min = BaseApiCodes::getMinCode();
426
            $max = BaseApiCodes::getMaxCode();
427
            throw new \InvalidArgumentException("API code value ({$api_code}) is out of allowed range {$min}-{$max}");
428
        }
429
430
        return Response::json(
431
            static::buildResponse($success, $api_code, $msg_or_api_code, $placeholders, $data, $debug_data),
432 31
            $http_code, $headers, $json_opts);
433
    }
434
435
    /**
436 31
     * If $msg_or_api_code is integer value, returns human readable message associated with that code (with
437
     * fallback to built-in default string if no api code mapping is set. If $msg_or_api_code is a string,
438 31
     * returns it unaltered.
439 28
     *
440
     * @param boolean    $success      @true if response reports successful operation, @false otherwise.
441 12
     * @param integer    $api_code     Your API code to be returned with the response object.
442
     * @param array|null $placeholders Placeholders passed to Lang::get() for message placeholders
443
     *                                 substitution or @null if none.
444
     *
445
     * @return string
446 28
     */
447 28
    protected static function getMessageForApiCode(bool $success, int $api_code, array $placeholders = null): string
448 28
    {
449 28
        // We got integer value here not a message string, so we need to check if we have the mapping for
450 28
        // this string already configured.
451
        $key = BaseApiCodes::getCodeMessageKey($api_code);
452
        if ($key === null) {
453 28
            // nope, let's get the default one instead, based of
454 2
            $fallback_code = $success ? BaseApiCodes::OK() : BaseApiCodes::NO_ERROR_MESSAGE();
455 2
            $key = BaseApiCodes::getCodeMessageKey($fallback_code);
456
        }
457
458 28
        $placeholders = $placeholders ?? [];
459
        if (!array_key_exists('api_code', $placeholders)) {
460
            $placeholders['api_code'] = $api_code;
461
        }
462
463
        return \Lang::get($key, $placeholders);
464
    }
465
466
    /**
467
     * Creates standardised API response array. This is final method called in the whole pipeline before we
468
     * return final JSON back to client. If you want to manipulate your response, this is the place to do that.
469
     * If you set APP_DEBUG to true, 'code_hex' field will be additionally added to reported JSON for easier
470
     * manual debugging.
471
     *
472
     * @param boolean           $success         @true if response reports successful operation, @false otherwise.
473
     * @param integer           $api_code        Your API code to be returned with the response object.
474
     * @param string|integer    $msg_or_api_code Message string or valid API code to get message for.
475
     * @param array|null        $placeholders    Placeholders passed to Lang::get() for message placeholders
476
     *                                           substitution or @null if none.
477
     * @param object|array|null $data            API response data if any
478
     * @param array|null        $debug_data      optional debug data array to be added to returned JSON.
479
     *
480
     * @return array response ready to be encoded as json and sent back to client
481
     *
482
     * @throws \RuntimeException in case of missing or invalid "classes" mapping configuration
483
     */
484
    protected static function buildResponse(bool $success, int $api_code,
485
                                            $msg_or_api_code, array $placeholders = null,
486
                                            $data = null, array $debug_data = null): array
487
    {
488
        // ensure $data is either @null, array or object of class with configured mapping.
489
        $converter = new Converter();
490
491
        $data = $converter->convert($data);
492
        if ($data !== null && !is_object($data)) {
493
            // ensure we get object in final JSON structure in data node
494
            $data = (object)$data;
495
        }
496
497
        // get human readable message for API code or use message string (if given instead of API code)
498
        if (is_int($msg_or_api_code)) {
499
            $message = self::getMessageForApiCode($success, $msg_or_api_code, $placeholders);
500
        } else {
501
            Validator::assertString('message', $msg_or_api_code);
502
            $message = $msg_or_api_code;
503
        }
504
505
        /** @noinspection PhpUndefinedClassInspection */
506
        $response = [
507
            static::KEY_SUCCESS => $success,
508
            static::KEY_CODE    => $api_code,
509
            static::KEY_LOCALE  => \App::getLocale(),
510
            static::KEY_MESSAGE => $message,
511
            static::KEY_DATA    => $data,
512
        ];
513
514
        if ($debug_data !== null) {
515
            $debug_key = Config::get(static::CONF_KEY_DEBUG_DEBUG_KEY, self::KEY_DEBUG);
516
            $response[ $debug_key ] = $debug_data;
517
        }
518
519
        return $response;
520
    }
521
522
}
523