Passed
Push — master ( 65b5b3...7a440c )
by Marcin
07:59 queued 10s
created

ResponseBuilder::make()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 20
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 3

Importance

Changes 11
Bugs 0 Features 0
Metric Value
cc 3
eloc 12
c 11
b 0
f 0
nc 4
nop 9
dl 0
loc 20
ccs 5
cts 5
cp 1
crap 3
rs 9.8666

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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
     * Reads and validates "classes" config mapping
105 2
     *
106 2
     * @return array Classes mapping as specified in configuration or empty array if configuration found
107
     *
108
     * @throws \RuntimeException if "classes" mapping is technically invalid (i.e. not array etc).
109
     */
110 1
    protected static function getClassesMapping(): ?array
111 1
    {
112
        $classes = Config::get(self::CONF_KEY_CLASSES);
113 1
114 1
        if ($classes !== null) {
115 1
            if (!is_array($classes)) {
116 1
                throw new \RuntimeException(
117
                    sprintf('CONFIG: "classes" mapping must be an array (%s given)', gettype($classes)));
118
            }
119
120
            $mandatory_keys = [
121 1
                static::KEY_KEY,
122
                static::KEY_METHOD,
123
            ];
124 1
            foreach ($classes as $class_name => $class_config) {
125
                foreach ($mandatory_keys as $key_name) {
126
                    if (!array_key_exists($key_name, $class_config)) {
127
                        throw new \RuntimeException("CONFIG: Missing '{$key_name}' for '{$class_name}' class mapping");
128
                    }
129
                }
130
            }
131
        } else {
132
            $classes = [];
133
        }
134
135
        return $classes;
136
    }
137
138
    /**
139 12
     * Returns success
140
     *
141
     * @param object|array|null $data          Array of primitives and supported objects to be returned in 'data' node
142 12
     *                                         of the JSON response, single supported object or @null if there's no
143
     *                                         to be returned.
144
     * @param integer|null      $api_code      API code to be returned or @null to use value of BaseApiCodes::OK().
145
     * @param array|null        $placeholders  Placeholders passed to Lang::get() for message placeholders
146
     *                                         substitution or @null if none.
147
     * @param integer|null      $http_code     HTTP code to be used for HttpResponse sent or @null
148
     *                                         for default DEFAULT_HTTP_CODE_OK.
149
     * @param integer|null      $json_opts     See http://php.net/manual/en/function.json-encode.php for supported
150
     *                                         options or pass @null to use value from your config (or defaults).
151
     *
152
     * @return HttpResponse
153
     */
154 1
    public static function success($data = null, $api_code = null, array $placeholders = null,
155
                                   int $http_code = null, int $json_opts = null): HttpResponse
156 1
    {
157
        return static::buildSuccessResponse($data, $api_code, $placeholders, $http_code, $json_opts);
158
    }
159
160
    /**
161
     * Returns success
162
     *
163
     * @param integer|null $api_code      API code to be returned or @null to use value of BaseApiCodes::OK().
164
     * @param array|null   $placeholders  Placeholders passed to Lang::get() for message placeholders
165
     *                                    substitution or @null if none.
166
     * @param integer|null $http_code     HTTP code to be used for HttpResponse sent or @null
167 4
     *                                    for default DEFAULT_HTTP_CODE_OK.
168
     *
169 4
     * @return HttpResponse
170
     */
171
    public static function successWithCode(int $api_code = null, array $placeholders = null,
172
                                           int $http_code = null): HttpResponse
173
    {
174
        return static::success(null, $api_code, $placeholders, $http_code);
175
    }
176
177
    /**
178
     * Returns success with custom HTTP code
179
     *
180
     * @param integer|null $http_code HTTP return code to be set for this response. If @null is passed, falls back
181
     *                                to DEFAULT_HTTP_CODE_OK.
182
     *
183
     * @return HttpResponse
184 16
     */
185
    public static function successWithHttpCode(int $http_code = null): HttpResponse
186
    {
187 16
        return static::buildSuccessResponse(null, BaseApiCodes::OK(), [], $http_code);
188 16
    }
189
190 16
    /**
191 16
     * @param object|array|null $data          Array of primitives and supported objects to be returned in 'data' node.
192 16
     *                                         of the JSON response, single supported object or @null if there's no
193
     *                                         to be returned.
194 14
     * @param integer|null      $api_code      API code to be returned or @null to use value of BaseApiCodes::OK().
195
     * @param array|null        $placeholders  Placeholders passed to Lang::get() for message placeholders
196
     *                                         substitution or @null if none.
197
     * @param integer|null      $http_code     HTTP code to be used for HttpResponse sent or @null
198
     *                                         for default DEFAULT_HTTP_CODE_OK.
199
     * @param integer|null      $json_opts     See http://php.net/manual/en/function.json-encode.php for supported
200
     *                                         options or pass @null to use value from your config (or defaults).
201
     *
202
     * @return HttpResponse
203
     *
204
     * @throws \InvalidArgumentException Thrown when provided arguments are invalid.
205
     */
206
    protected static function buildSuccessResponse($data = null, int $api_code = null, array $placeholders = null,
207
                                                   int $http_code = null, int $json_opts = null): HttpResponse
208
    {
209
        $http_code = $http_code ?? static::DEFAULT_HTTP_CODE_OK;
210 4
        $api_code = $api_code ?? BaseApiCodes::OK();
211
212
        Validator::assertInt('api_code', $api_code);
213 4
        Validator::assertInt('http_code', $http_code);
214
        Validator::assertIntRange('http_code', $http_code, 200, 299);
215
216
        return static::make(true, $api_code, $api_code, $data, $http_code, $placeholders, null, $json_opts);
217
    }
218
219
    /**
220
     * Builds error Response object. Supports optional arguments passed to Lang::get() if associated error
221
     * message uses placeholders as well as return data payload
222
     *
223
     * @param integer           $api_code      Your API code to be returned with the response object.
224
     * @param array|null        $placeholders  Placeholders passed to Lang::get() for message placeholders
225 1
     *                                         substitution or @null if none.
226
     * @param object|array|null $data          Array of primitives and supported objects to be returned in 'data' node
227
     *                                         of the JSON response, single supported object or @null if there's no
228 1
     *                                         to be returned.
229
     * @param integer|null      $http_code     HTTP code to be used for HttpResponse sent or @null
230
     *                                         for default DEFAULT_HTTP_CODE_ERROR.
231
     * @param integer|null      $json_opts     See http://php.net/manual/en/function.json-encode.php for supported
232
     *                                         options or pass @null to use value from your config (or defaults).
233
     *
234
     * @return HttpResponse
235
     */
236
    public static function error(int $api_code, array $placeholders = null, $data = null, int $http_code = null,
237
                                 int $encoding_options = null): HttpResponse
238
    {
239
        return static::buildErrorResponse($data, $api_code, $http_code, $placeholders, $encoding_options);
240
    }
241
242
    /**
243 1
     * @param integer           $api_code      Your API code to be returned with the response object.
244
     * @param object|array|null $data          Array of primitives and supported objects to be returned in 'data' node
245
     *                                         of the JSON response, single supported object or @null if there's no
246 1
     *                                         to be returned.
247
     * @param array|null        $placeholders  Placeholders passed to Lang::get() for message placeholders
248
     *                                         substitution or @null if none.
249
     * @param integer|null      $json_opts     See http://php.net/manual/en/function.json-encode.php for supported
250
     *                                         options or pass @null to use value from your config (or defaults).
251
     *
252
     * @return HttpResponse
253
     */
254
    public static function errorWithData(int $api_code, $data, array $placeholders = null,
255
                                         int $json_opts = null): HttpResponse
256
    {
257
        return static::buildErrorResponse($data, $api_code, null, $placeholders, $json_opts);
258 1
    }
259
260 1
    /**
261
     * @param integer           $api_code      Your API code to be returned with the response object.
262
     * @param object|array|null $data          Array of primitives and supported objects to be returned in 'data' node
263
     *                                         of the JSON response, single supported object or @null if there's no
264
     *                                         to be returned.
265
     * @param integer           $http_code     HTTP code to be used for HttpResponse sent.
266
     * @param array|null        $placeholders  Placeholders passed to Lang::get() for message placeholders
267
     *                                         substitution or @null if none.
268
     * @param integer|null      $json_opts     See http://php.net/manual/en/function.json-encode.php for supported
269
     *                                         options or pass @null to use value from your config (or defaults).
270
     *
271
     * @return HttpResponse
272
     *
273 1
     * @throws \InvalidArgumentException if http_code is @null
274
     */
275
    public static function errorWithDataAndHttpCode(int $api_code, $data, int $http_code, array $placeholders = null,
276 1
                                                    int $json_opts = null): HttpResponse
277 1
    {
278
        return static::buildErrorResponse($data, $api_code, $http_code, $placeholders, $json_opts);
279
    }
280
281
    /**
282
     * @param integer    $api_code     Your API code to be returned with the response object.
283
     * @param integer    $http_code    HTTP code to be used for HttpResponse sent or @null
284
     *                                 for default DEFAULT_HTTP_CODE_ERROR.
285
     * @param array|null $placeholders Placeholders passed to Lang::get() for message placeholders
286
     *                                 substitution or @null if none.
287
     *
288
     * @return HttpResponse
289
     *
290
     * @throws \InvalidArgumentException if http_code is @null
291 6
     */
292
    public static function errorWithHttpCode(int $api_code, int $http_code, array $placeholders = null): HttpResponse
293
    {
294
        return static::buildErrorResponse(null, $api_code, $http_code, $placeholders);
295 6
    }
296 6
297
    /**
298
     * @param integer           $api_code  Your API code to be returned with the response object.
299
     * @param string            $message   Custom message to be returned as part of error response
300
     * @param object|array|null $data      Array of primitives and supported objects to be returned in 'data' node
301
     *                                     of the JSON response, single supported object or @null if there's no
302
     *                                     to be returned.
303
     * @param integer|null      $http_code Optional HTTP status code to be used for HttpResponse sent
304
     *                                     or @null for DEFAULT_HTTP_CODE_ERROR
305
     * @param integer|null      $json_opts See http://php.net/manual/en/function.json-encode.php for supported
306 1
     *                                     options or pass @null to use value from your config (or defaults).
307
     *
308 1
     * @return HttpResponse
309
     */
310
    public static function errorWithMessageAndData(int $api_code, string $message, $data,
311
                                                   int $http_code = null, int $json_opts = null): HttpResponse
312
    {
313
        return static::buildErrorResponse($data, $api_code, $http_code, null,
314
            $message, null, $json_opts);
315
    }
316
317
    /**
318
     * @param integer           $api_code   Your API code to be returned with the response object.
319
     * @param string            $message    custom message to be returned as part of error response
320
     * @param object|array|null $data       Array of primitives and supported objects to be returned in 'data' node
321
     *                                      of the JSON response, single supported object or @null if there's no
322
     *                                      to be returned.
323
     * @param integer|null      $http_code  HTTP code to be used for HttpResponse sent or @null
324
     *                                      for default DEFAULT_HTTP_CODE_ERROR.
325
     * @param integer|null      $json_opts  See http://php.net/manual/en/function.json-encode.php for supported
326
     *                                      options or pass @null to use value from your config (or defaults).
327
     * @param array|null        $debug_data optional debug data array to be added to returned JSON.
328
     *
329
     * @return HttpResponse
330
     */
331 18
    public static function errorWithMessageAndDataAndDebug(int $api_code, string $message, $data,
332
                                                           int $http_code = null, int $json_opts = null,
333
                                                           array $debug_data = null): HttpResponse
334
    {
335 18
        return static::buildErrorResponse($data, $api_code, $http_code, null,
336 18
            $message, null, $json_opts, $debug_data);
337
    }
338 18
339
    /**
340 18
     * @param integer      $api_code  Your API code to be returned with the response object.
341 18
     * @param string       $message   Custom message to be returned as part of error response
342 16
     * @param integer|null $http_code HTTP code to be used with final response sent or @null
343
     *                                for default DEFAULT_HTTP_CODE_ERROR.
344 18
     *
345 2
     * @return HttpResponse
346
     */
347
    public static function errorWithMessage(int $api_code, string $message, int $http_code = null): HttpResponse
348 16
    {
349 16
        return static::buildErrorResponse(null, $api_code, $http_code, null, $message);
350
    }
351 15
352
    /**
353 15
     * Builds error Response object. Supports optional arguments passed to Lang::get() if associated error message
354 15
     * uses placeholders as well as return data payload
355
     *
356
     * @param object|array|null $data          Array of primitives and supported objects to be returned in 'data' node
357
     *                                         of the JSON response, single supported object or @null if there's no
358
     *                                         to be returned.
359
     * @param integer           $api_code      Your API code to be returned with the response object.
360
     * @param integer|null      $http_code     HTTP code to be used for HttpResponse sent or @null
361
     *                                         for default DEFAULT_HTTP_CODE_ERROR.
362
     * @param array|null        $placeholders  Placeholders passed to Lang::get() for message placeholders
363
     *                                         substitution or @null if none.
364
     * @param string|null       $message       custom message to be returned as part of error response
365
     * @param array|null        $headers       optional HTTP headers to be returned in error response
366
     * @param integer|null      $json_opts     See http://php.net/manual/en/function.json-encode.php for supported
367
     *                                         options or pass @null to use value from your config (or defaults).
368
     * @param array|null        $debug_data    optional debug data array to be added to returned JSON.
369
     *
370
     * @return HttpResponse
371
     *
372
     * @throws \InvalidArgumentException Thrown if $code is not correct, outside the range, equals OK code etc.
373
     *
374
     * @noinspection MoreThanThreeArgumentsInspection
375 35
     */
376
    protected static function buildErrorResponse($data, int $api_code, int $http_code = null,
377
                                                 array $placeholders = null,
378
                                                 string $message = null, array $headers = null,
379 35
                                                 int $json_opts = null,
380 35
                                                 array $debug_data = null): HttpResponse
381 35
    {
382
        $http_code = $http_code ?? static::DEFAULT_HTTP_CODE_ERROR;
383 35
        $headers = $headers ?? [];
384
385 34
        Validator::assertInt('api_code', $api_code);
386 34
387 1
        $code_ok = BaseApiCodes::OK();
388 1
        if ($api_code !== $code_ok) {
389 1
            Validator::assertIntRange('api_code', $api_code, BaseApiCodes::getMinCode(), BaseApiCodes::getMaxCode());
390
        }
391
        if ($api_code === $code_ok) {
392 33
            throw new \InvalidArgumentException(
393 2
                "Error response cannot use api_code of value  {$code_ok} which is reserved for OK");
394 2
        }
395 2
396
        Validator::assertInt('http_code', $http_code);
397
        Validator::assertIntRange('http_code', $http_code, static::ERROR_HTTP_CODE_MIN, static::ERROR_HTTP_CODE_MAX);
398
399
        $msg_or_api_code = $message ?? $api_code;
400
401 31
        return static::make(false, $api_code, $msg_or_api_code, $data, $http_code,
402 23
            $placeholders, $headers, $json_opts, $debug_data);
403 23
    }
404
405 2
    /**
406
     * @param boolean           $success         @true if response reports successful operation, @false otherwise.
407
     * @param integer           $api_code        Your API code to be returned with the response object.
408 23
     * @param string|integer    $msg_or_api_code message string or valid API code to get message for
409 23
     * @param object|array|null $data            optional additional data to be included in response object
410
     * @param integer|null      $http_code       HTTP code for the HttpResponse or @null for either DEFAULT_HTTP_CODE_OK
411
     *                                           or DEFAULT_HTTP_CODE_ERROR depending on the $success.
412 31
     * @param array|null        $placeholders    Placeholders passed to Lang::get() for message placeholders
413 31
     *                                           substitution or @null if none.
414 28
     * @param array|null        $headers         Optional HTTP headers to be returned in the response.
415
     * @param integer|null      $json_opts       See http://php.net/manual/en/function.json-encode.php for supported
416
     *                                           options or pass @null to use value from your config (or defaults).
417
     * @param array|null        $debug_data      Optional debug data array to be added to returned JSON.
418
     *
419
     * @return HttpResponse
420
     *
421
     * @throws \InvalidArgumentException If $api_code is neither a string nor valid integer code.
422
     * @throws \InvalidArgumentException if $data is an object of class that is not configured in "classes" mapping.
423
     *
424
     * @noinspection MoreThanThreeArgumentsInspection
425
     */
426
    protected static function make(bool $success, int $api_code, $msg_or_api_code, $data = null,
427
                                   int $http_code = null, array $placeholders = null, array $headers = null,
428
                                   int $json_opts = null, array $debug_data = null): HttpResponse
429
    {
430
        $headers = $headers ?? [];
431
        $http_code = $http_code ?? ($success ? static::DEFAULT_HTTP_CODE_OK : static::DEFAULT_HTTP_CODE_ERROR);
432 31
        $json_opts = $json_opts ?? Config::get(self::CONF_KEY_ENCODING_OPTIONS, static::DEFAULT_ENCODING_OPTIONS);
433
434
        Validator::assertInt('encoding_options', $json_opts);
435
436 31
        Validator::assertInt('api_code', $api_code);
437
        if (!BaseApiCodes::isCodeValid($api_code)) {
438 31
            $min = BaseApiCodes::getMinCode();
439 28
            $max = BaseApiCodes::getMaxCode();
440
            throw new \InvalidArgumentException("API code value ({$api_code}) is out of allowed range {$min}-{$max}");
441 12
        }
442
443
        return Response::json(
444
            static::buildResponse($success, $api_code, $msg_or_api_code, $placeholders, $data, $debug_data),
445
            $http_code, $headers, $json_opts);
446 28
    }
447 28
448 28
    /**
449 28
     * If $msg_or_api_code is integer value, returns human readable message associated with that code (with
450 28
     * fallback to built-in default string if no api code mapping is set. If $msg_or_api_code is a string,
451
     * returns it unaltered.
452
     *
453 28
     * @param boolean    $success      @true if response reports successful operation, @false otherwise.
454 2
     * @param integer    $api_code     Your API code to be returned with the response object.
455 2
     * @param array|null $placeholders Placeholders passed to Lang::get() for message placeholders
456
     *                                 substitution or @null if none.
457
     *
458 28
     * @return string
459
     */
460
    protected static function getMessageForApiCode(bool $success, int $api_code, array $placeholders = null): string
461
    {
462
        // We got integer value here not a message string, so we need to check if we have the mapping for
463
        // this string already configured.
464
        $key = BaseApiCodes::getCodeMessageKey($api_code);
465
        if ($key === null) {
466
            // nope, let's get the default one instead, based of
467
            $fallback_code = $success ? BaseApiCodes::OK() : BaseApiCodes::NO_ERROR_MESSAGE();
468
            $key = BaseApiCodes::getCodeMessageKey($fallback_code);
469
        }
470
471
        $placeholders = $placeholders ?? [];
472
        if (!array_key_exists('api_code', $placeholders)) {
473
            $placeholders['api_code'] = $api_code;
474
        }
475
476
        return \Lang::get($key, $placeholders);
477
    }
478
479
    /**
480
     * Creates standardised API response array. This is final method called in the whole pipeline before we
481
     * return final JSON back to client. If you want to manipulate your response, this is the place to do that.
482
     * If you set APP_DEBUG to true, 'code_hex' field will be additionally added to reported JSON for easier
483
     * manual debugging.
484
     *
485
     * @param boolean           $success         @true if response reports successful operation, @false otherwise.
486
     * @param integer           $api_code        Your API code to be returned with the response object.
487
     * @param string|integer    $msg_or_api_code Message string or valid API code to get message for.
488
     * @param array|null        $placeholders    Placeholders passed to Lang::get() for message placeholders
489
     *                                           substitution or @null if none.
490
     * @param object|array|null $data            API response data if any
491
     * @param array|null        $debug_data      optional debug data array to be added to returned JSON.
492
     *
493
     * @return array response ready to be encoded as json and sent back to client
494
     *
495
     * @throws \RuntimeException in case of missing or invalid "classes" mapping configuration
496
     */
497
    protected static function buildResponse(bool $success, int $api_code,
498
                                            $msg_or_api_code, array $placeholders = null,
499
                                            $data = null, array $debug_data = null): array
500
    {
501
        // ensure $data is either @null, array or object of class with configured mapping.
502
        $converter = new Converter();
503
504
        $data = $converter->convert($data);
505
        if ($data !== null && !is_object($data)) {
506
            // ensure we get object in final JSON structure in data node
507
            $data = (object)$data;
508
        }
509
510
        // get human readable message for API code or use message string (if given instead of API code)
511
        if (is_int($msg_or_api_code)) {
512
            $message = self::getMessageForApiCode($success, $msg_or_api_code, $placeholders);
513
        } else {
514
            Validator::assertString('message', $msg_or_api_code);
515
            $message = $msg_or_api_code;
516
        }
517
518
        /** @noinspection PhpUndefinedClassInspection */
519
        $response = [
520
            static::KEY_SUCCESS => $success,
521
            static::KEY_CODE    => $api_code,
522
            static::KEY_LOCALE  => \App::getLocale(),
523
            static::KEY_MESSAGE => $message,
524
            static::KEY_DATA    => $data,
525
        ];
526
527
        if ($debug_data !== null) {
528
            $debug_key = Config::get(static::CONF_KEY_DEBUG_DEBUG_KEY, self::KEY_DEBUG);
529
            $response[ $debug_key ] = $debug_data;
530
        }
531
532
        return $response;
533
    }
534
535
}
536