1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
handlerservice.php
См. документацию.
1<?php
2
3namespace Bitrix\Sale\Delivery\Rest;
4
5use Bitrix\Main,
6 Bitrix\Sale,
7 Bitrix\Rest\AccessException,
8 Bitrix\Rest\RestException;
9
10if (!Main\Loader::includeModule('rest'))
11{
12 return;
13}
14
20{
21 private const ERROR_HANDLER_ADD = 'ERROR_HANDLER_ADD';
22 private const ERROR_HANDLER_UPDATE = 'ERROR_HANDLER_UPDATE';
23 private const ERROR_HANDLER_DELETE = 'ERROR_HANDLER_DELETE';
24 private const ERROR_CHECK_FAILURE = 'ERROR_CHECK_FAILURE';
25 private const ERROR_HANDLER_ALREADY_EXIST = 'ERROR_HANDLER_ALREADY_EXIST';
26 private const ERROR_HANDLER_NOT_FOUND = 'ERROR_HANDLER_NOT_FOUND';
27
33 private static function prepareHandlerParams(array $data, \CRestServer $server): array
34 {
36 $data['APP_ID'] = $server->getClientId();
37
38 return $data;
39 }
40
48 private static function checkParamsOnAddHandler(array $params): void
49 {
50 if (empty($params['NAME']))
51 {
52 throw new RestException('Parameter NAME is not defined', self::ERROR_CHECK_FAILURE);
53 }
54
55 if (empty($params['CODE']))
56 {
57 throw new RestException('Parameter CODE is not defined', self::ERROR_CHECK_FAILURE);
58 }
59
60 self::checkSettings($params['SETTINGS']);
61 self::checkProfiles($params['PROFILES']);
62
63 $deliveryRestHandler = Internals\DeliveryRestHandlerTable::getList([
64 'filter' => [
65 '=CODE' => $params['CODE']
66 ]
67 ])->fetch();
68 if ($deliveryRestHandler)
69 {
70 throw new RestException('Handler already exists!', self::ERROR_HANDLER_ALREADY_EXIST);
71 }
72 }
73
79 private static function checkParamsOnUpdateHandler(array $params): void
80 {
81 if (empty($params['ID']))
82 {
83 throw new RestException('Parameter ID is not defined', self::ERROR_CHECK_FAILURE);
84 }
85
86 if (array_key_exists('NAME', $params) && empty($params['NAME']))
87 {
88 throw new RestException('Parameter NAME is not defined', self::ERROR_CHECK_FAILURE);
89 }
90
91 if (array_key_exists('CODE', $params) && empty($params['CODE']))
92 {
93 throw new RestException('Parameter CODE is not defined', self::ERROR_CHECK_FAILURE);
94 }
95
96 if (array_key_exists('SETTINGS', $params))
97 {
98 self::checkSettings($params['SETTINGS']);
99 }
100
101 if (array_key_exists('PROFILES', $params))
102 {
103 self::checkProfiles($params['PROFILES']);
104 }
105
107 'filter' => array(
108 'ID' => $params['ID']
109 )
110 ))->fetch();
111 if (!$deliveryRestHandler)
112 {
113 throw new RestException('Handler not found', self::ERROR_HANDLER_NOT_FOUND);
114 }
115
116 if ($params['APP_ID'] && !empty($deliveryRestHandler['APP_ID']) && $deliveryRestHandler['APP_ID'] !== $params['APP_ID'])
117 {
118 throw new AccessException();
119 }
120 }
121
127 private static function checkParamsOnDeleteHandler($params): void
128 {
129 if (empty($params['ID']))
130 {
131 throw new RestException('Parameter ID is not defined', self::ERROR_CHECK_FAILURE);
132 }
133
135 'filter' => array(
136 'ID' => $params['ID']
137 )
138 ))->fetch();
139 if (!$deliveryRestHandler)
140 {
141 throw new RestException('Handler not found', self::ERROR_HANDLER_NOT_FOUND);
142 }
143
144 if ($params['APP_ID'] && !empty($deliveryRestHandler['APP_ID']) && $deliveryRestHandler['APP_ID'] !== $params['APP_ID'])
145 {
146 throw new AccessException();
147 }
148
149 $deliveryListResult = Sale\Delivery\Services\Manager::getList([
150 'select' => ['ID', 'CLASS_NAME', 'CONFIG'],
151 'filter' => [
152 '=CLASS_NAME' => '\\'.\Sale\Handlers\Delivery\RestHandler::class,
153 ],
154 ]);
155 $deliveryIdList = [];
156 while ($delivery = $deliveryListResult->fetch())
157 {
158 if ($delivery['CONFIG']['MAIN']['REST_CODE'] === $deliveryRestHandler['CODE'])
159 {
160 $deliveryIdList[] = $delivery['ID'];
161 }
162 }
163
164 if ($deliveryIdList)
165 {
166 throw new RestException(
167 'There are deliveries with this handler: '.implode(', ', $deliveryIdList),
168 self::ERROR_HANDLER_DELETE
169 );
170 }
171 }
172
180 public static function addHandler($query, $n, \CRestServer $server)
181 {
183 $params = self::prepareHandlerParams($query, $server);
184 self::checkParamsOnAddHandler($params);
185
186 if (isset($params['SETTINGS']['CONFIG']) && is_array($params['SETTINGS']['CONFIG']))
187 {
188 $params['SETTINGS']['CONFIG'] = [
189 'ITEMS' => self::convertArrayForSaving($params['SETTINGS']['CONFIG'], '[SETTINGS][CONFIG][]'),
190 ];
191 }
192
193 $data = [
194 'NAME' => $params['NAME'],
195 'CODE' => $params['CODE'],
196 'SORT' => $params['SORT'] ?: 100,
197 'DESCRIPTION' => $params['DESCRIPTION'],
198 'SETTINGS' => $params['SETTINGS'],
199 'PROFILES' => self::convertArrayForSaving($params['PROFILES'], '[PROFILES][]'),
200 'APP_ID' => $params['APP_ID'],
201 ];
202
204 if ($result->isSuccess())
205 {
206 return $result->getId();
207 }
208
209 $error = implode("\n", $result->getErrorMessages());
210 throw new RestException($error, self::ERROR_HANDLER_ADD);
211 }
212
220 public static function updateHandler($query, $n, \CRestServer $server): bool
221 {
223 $params = self::prepareHandlerParams($query, $server);
224
225 self::checkParamsOnUpdateHandler($params);
226
227 $fields = [];
228
230 'CODE',
231 'NAME',
232 'DESCRIPTION',
233 'SETTINGS',
234 'PROFILES',
235 'SORT',
236 ];
237
238 foreach ($allowedFields as $field)
239 {
240 if (!array_key_exists($field, $params))
241 {
242 continue;
243 }
244
245 if ($field === 'CODE')
246 {
247 $deliveryRestHandler = Internals\DeliveryRestHandlerTable::getList([
248 'filter' => [
249 '!ID' => $params['ID'],
250 '=CODE' => $params[$field],
251 ]
252 ])->fetch();
253 if ($deliveryRestHandler)
254 {
255 throw new RestException('Handler already exists!', self::ERROR_HANDLER_ALREADY_EXIST);
256 }
257 }
258
259 if ($field === 'SORT')
260 {
261 $value = (int)$params[$field];
262 }
263 elseif ($field === 'PROFILES')
264 {
265 $value = self::convertArrayForSaving($params[$field], '[PROFILES][]');
266 }
267 elseif ($field === 'SETTINGS')
268 {
269 if (isset($params[$field]['CONFIG']) && is_array($params[$field]['CONFIG']))
270 {
271 $params[$field]['CONFIG'] = [
272 'ITEMS' => self::convertArrayForSaving($params[$field]['CONFIG'], '[SETTINGS][CONFIG][]'),
273 ];
274 }
275
276 $value = $params[$field];
277 }
278 else
279 {
280 $value = $params[$field];
281 }
282
283 $fields[$field] = $value;
284 }
285
287 if ($result->isSuccess())
288 {
289 return true;
290 }
291
292 $error = implode("\n", $result->getErrorMessages());
293 throw new RestException($error, self::ERROR_HANDLER_UPDATE);
294 }
295
303 public static function deleteHandler($query, $n, \CRestServer $server): bool
304 {
306 $params = self::prepareHandlerParams($query, $server);
307
308 self::checkParamsOnDeleteHandler($params);
309
311 if ($result->isSuccess())
312 {
313 return true;
314 }
315
316 $error = implode("\n", $result->getErrorMessages());
317 throw new RestException($error, self::ERROR_HANDLER_DELETE);
318 }
319
326 public static function getHandlerList($query, $n, \CRestServer $server): array
327 {
329
330 $result = [];
331
332 $handlersList = array_values(Sale\Delivery\Services\Manager::getRestHandlerList());
333 foreach ($handlersList as $handler)
334 {
335 $resultItem = [
336 'ID' => (int)$handler['ID'],
337 'NAME' => (string)$handler['NAME'],
338 'CODE' => (string)$handler['CODE'],
339 'SORT' => (int)$handler['SORT'],
340 'DESCRIPTION' => (string)$handler['DESCRIPTION'],
341 ];
342
346 $profiles = [];
347 if (isset($handler['PROFILES']) && is_array($handler['PROFILES']))
348 {
349 $profiles = self::convertArrayForOutput($handler['PROFILES']);
350 }
351 $resultItem['PROFILES'] = $profiles;
352
356 $settings = $handler['SETTINGS'];
357 $config = [];
358 if (isset($settings['CONFIG']['ITEMS']) && is_array($settings['CONFIG']['ITEMS']))
359 {
360 $config = self::convertArrayForOutput($settings['CONFIG']['ITEMS']);
361 }
362 $settings['CONFIG'] = $config;
363 $resultItem['SETTINGS'] = $settings;
364
365 $result[] = $resultItem;
366 }
367
368 return $result;
369 }
370
375 private static function checkProfiles($profiles): void
376 {
377 if (empty($profiles) || !is_array($profiles))
378 {
379 throw new RestException('Parameter PROFILES is not defined', self::ERROR_CHECK_FAILURE);
380 }
381
382 $profileRequiredFields = [
383 'NAME',
384 'CODE',
385 ];
386 $profileAllowedFields = [
387 'NAME',
388 'CODE',
389 'DESCRIPTION',
390 ];
391 foreach ($profiles as $profile)
392 {
393 foreach ($profile as $key => $value)
394 {
395 if (!in_array($key, $profileAllowedFields, true))
396 {
397 $message =
398 'Unexpected profile key: ' . $key . '. Allowed keys: '
399 . implode(', ', $profileAllowedFields)
400 ;
401 throw new RestException($message, self::ERROR_CHECK_FAILURE);
402 }
403 }
404
405 foreach ($profileRequiredFields as $profileRequiredField)
406 {
407 if (
408 !isset($profile[$profileRequiredField])
409 || $profile[$profileRequiredField] === ''
410 )
411 {
412 throw new RestException(
413 'Profile field ' . $profileRequiredField . ' is not specified',
414 self::ERROR_CHECK_FAILURE
415 );
416 }
417 }
418 }
419 }
420
425 private static function checkSettings($settings): void
426 {
427 if (empty($settings) || !is_array($settings))
428 {
429 throw new RestException('Parameter SETTINGS is not defined', self::ERROR_CHECK_FAILURE);
430 }
431
432 if (empty($settings['CALCULATE_URL']))
433 {
434 throw new RestException(
435 'Parameter SETTINGS[CALCULATE_URL] is not defined',
436 self::ERROR_CHECK_FAILURE
437 );
438 }
439 elseif (!is_string($settings['CALCULATE_URL']))
440 {
441 throw new RestException(
442 'Parameter SETTINGS[CALCULATE_URL] must be of string type',
443 self::ERROR_CHECK_FAILURE
444 );
445 }
446
447 if (
448 !empty($settings['CREATE_DELIVERY_REQUEST_URL'])
449 && !is_string($settings['CREATE_DELIVERY_REQUEST_URL'])
450 )
451 {
452 throw new RestException(
453 'Parameter SETTINGS[CREATE_DELIVERY_REQUEST_URL] must be of string type',
454 self::ERROR_CHECK_FAILURE
455 );
456 }
457
458 if (
459 !empty($settings['CANCEL_DELIVERY_REQUEST_URL'])
460 && !is_string($settings['CANCEL_DELIVERY_REQUEST_URL'])
461 )
462 {
463 throw new RestException(
464 'Parameter SETTINGS[CANCEL_DELIVERY_REQUEST_URL] must be of string type',
465 self::ERROR_CHECK_FAILURE
466 );
467 }
468
469 if (isset($settings['CONFIG']))
470 {
471 if (!is_array($settings['CONFIG']))
472 {
473 throw new RestException(
474 'Parameter SETTINGS[CONFIG] must be of array type',
475 self::ERROR_CHECK_FAILURE
476 );
477 }
478
479 $configItemRequiredFields = [
480 'TYPE',
481 'CODE',
482 'NAME',
483 ];
484
485 foreach ($settings['CONFIG'] as $configItem)
486 {
487 $configItemAllowedFields = (isset($configItem['TYPE']) && $configItem['TYPE'] === 'ENUM')
488 ? [
489 'TYPE',
490 'CODE',
491 'NAME',
492 'OPTIONS',
493 ]
494 : [
495 'TYPE',
496 'CODE',
497 'NAME',
498 ]
499 ;
500
501 foreach ($configItem as $key => $value)
502 {
503 if (!in_array($key, $configItemAllowedFields, true))
504 {
505 $message =
506 'Unexpected config item key: ' . $key . '. Allowed keys: '
507 . implode(', ', $configItemAllowedFields)
508 ;
509 throw new RestException($message, self::ERROR_CHECK_FAILURE);
510 }
511 }
512
513 foreach ($configItemRequiredFields as $configItemRequiredField)
514 {
515 if (!isset($configItem[$configItemRequiredField]))
516 {
517 throw new RestException(
518 'Config item field ' . $configItemRequiredField . ' is not specified',
519 self::ERROR_CHECK_FAILURE
520 );
521 }
522 }
523 }
524 }
525 }
526
533 private static function convertArrayForSaving(array $items, string $path = ''): array
534 {
535 $result = [];
536
537 foreach ($items as $item)
538 {
539 if (!isset($item['CODE']))
540 {
541 throw new RestException(
542 ($path === '' ? '' : $path . ' ') . 'Item CODE is not specified',
543 self::ERROR_CHECK_FAILURE
544 );
545 }
546
547 $profileCode = $item['CODE'];
548 unset($item['CODE']);
549
550 $result[$profileCode] = $item;
551 }
552
553 return $result;
554 }
555
560 private static function convertArrayForOutput(array $items): array
561 {
562 $result = [];
563
564 foreach ($items as $profileCode => $item)
565 {
566 $item['CODE'] = $profileCode;
567
568 $result[] = $item;
569 }
570
571 return $result;
572 }
573}
$path
Определения access_edit.php:21
$allowedFields
Определения push.php:9
static includeModule($moduleName)
Определения loader.php:67
static getList(array $parameters=array())
Определения datamanager.php:431
static delete($primary)
Определения datamanager.php:1644
static add(array $data)
Определения datamanager.php:877
static update($primary, array $data)
Определения datamanager.php:1256
static prepareIncomingParams(array $data)
Определения baseservice.php:91
static checkDeliveryPermission()
Определения baseservice.php:82
static getHandlerList($query, $n, \CRestServer $server)
Определения handlerservice.php:326
static addHandler($query, $n, \CRestServer $server)
Определения handlerservice.php:180
static updateHandler($query, $n, \CRestServer $server)
Определения handlerservice.php:220
static deleteHandler($query, $n, \CRestServer $server)
Определения handlerservice.php:303
static getList(array $params=array())
Определения manager.php:82
getClientId()
Определения rest.php:362
$data['IS_AVAILABLE']
Определения .description.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$query
Определения get_search.php:11
$message
Определения payment.php:8
$settings
Определения product_settings.php:43
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$config
Определения quickway.php:69
if(empty($signedUserToken)) $key
Определения quickway.php:257
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$items
Определения template.php:224
$error
Определения subscription_card_product.php:20
$n
Определения update_log.php:107
$fields
Определения yandex_run.php:501