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

ResponseBuilder::make()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 20
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
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 3
cts 3
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
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