PageRenderTime 42ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/modules/sale/lib/delivery/rest/handlerservice.php

https://gitlab.com/alexprowars/bitrix
PHP | 447 lines | 400 code | 21 blank | 26 comment | 20 complexity | de0aa7248c611938bad178bf211a14df MD5 | raw file
  1. <?php
  2. namespace Bitrix\Sale\Delivery\Rest;
  3. use Bitrix\Main,
  4. Bitrix\Sale,
  5. Bitrix\Rest\AccessException,
  6. Bitrix\Rest\RestException;
  7. if (!Main\Loader::includeModule('rest'))
  8. {
  9. return;
  10. }
  11. /**
  12. * Class RestHandler
  13. * @package Bitrix\Sale\Delivery\Rest
  14. */
  15. class HandlerService extends BaseService
  16. {
  17. private const ERROR_HANDLER_ADD = 'ERROR_HANDLER_ADD';
  18. private const ERROR_HANDLER_UPDATE = 'ERROR_HANDLER_UPDATE';
  19. private const ERROR_HANDLER_DELETE = 'ERROR_HANDLER_DELETE';
  20. private const ERROR_CHECK_FAILURE = 'ERROR_CHECK_FAILURE';
  21. private const ERROR_HANDLER_ALREADY_EXIST = 'ERROR_HANDLER_ALREADY_EXIST';
  22. private const ERROR_HANDLER_NOT_FOUND = 'ERROR_HANDLER_NOT_FOUND';
  23. /**
  24. * @param array $data
  25. * @param \CRestServer $server
  26. * @return array
  27. */
  28. private static function prepareHandlerParams(array $data, \CRestServer $server): array
  29. {
  30. $data = self::prepareIncomingParams($data);
  31. $data['APP_ID'] = $server->getClientId();
  32. return $data;
  33. }
  34. /**
  35. * @param array $params
  36. * @throws Main\ArgumentException
  37. * @throws Main\ObjectPropertyException
  38. * @throws Main\SystemException
  39. * @throws RestException
  40. */
  41. private static function checkParamsOnAddHandler(array $params): void
  42. {
  43. if (empty($params['NAME']))
  44. {
  45. throw new RestException('Parameter NAME is not defined', self::ERROR_CHECK_FAILURE);
  46. }
  47. if (empty($params['CODE']))
  48. {
  49. throw new RestException('Parameter CODE is not defined', self::ERROR_CHECK_FAILURE);
  50. }
  51. self::checkSettings($params['SETTINGS']);
  52. self::checkProfiles($params['PROFILES']);
  53. $deliveryRestHandler = Internals\DeliveryRestHandlerTable::getList([
  54. 'filter' => [
  55. '=CODE' => $params['CODE']
  56. ]
  57. ])->fetch();
  58. if ($deliveryRestHandler)
  59. {
  60. throw new RestException('Handler already exists!', self::ERROR_HANDLER_ALREADY_EXIST);
  61. }
  62. }
  63. /**
  64. * @param array $params
  65. * @throws RestException
  66. * @throws AccessException
  67. */
  68. private static function checkParamsOnUpdateHandler(array $params): void
  69. {
  70. if (empty($params['ID']))
  71. {
  72. throw new RestException('Parameter ID is not defined', self::ERROR_CHECK_FAILURE);
  73. }
  74. if (array_key_exists('NAME', $params) && empty($params['NAME']))
  75. {
  76. throw new RestException('Parameter NAME is not defined', self::ERROR_CHECK_FAILURE);
  77. }
  78. if (array_key_exists('CODE', $params) && empty($params['CODE']))
  79. {
  80. throw new RestException('Parameter CODE is not defined', self::ERROR_CHECK_FAILURE);
  81. }
  82. if (array_key_exists('SETTINGS', $params))
  83. {
  84. self::checkSettings($params['SETTINGS']);
  85. }
  86. if (array_key_exists('PROFILES', $params))
  87. {
  88. self::checkProfiles($params['PROFILES']);
  89. }
  90. $deliveryRestHandler = Internals\DeliveryRestHandlerTable::getList(array(
  91. 'filter' => array(
  92. 'ID' => $params['ID']
  93. )
  94. ))->fetch();
  95. if (!$deliveryRestHandler)
  96. {
  97. throw new RestException('Handler not found', self::ERROR_HANDLER_NOT_FOUND);
  98. }
  99. if ($params['APP_ID'] && !empty($deliveryRestHandler['APP_ID']) && $deliveryRestHandler['APP_ID'] !== $params['APP_ID'])
  100. {
  101. throw new AccessException();
  102. }
  103. }
  104. /**
  105. * @param $params
  106. * @throws RestException
  107. * @throws AccessException
  108. */
  109. private static function checkParamsOnDeleteHandler($params): void
  110. {
  111. if (empty($params['ID']))
  112. {
  113. throw new RestException('Parameter ID is not defined', self::ERROR_CHECK_FAILURE);
  114. }
  115. $deliveryRestHandler = Internals\DeliveryRestHandlerTable::getList(array(
  116. 'filter' => array(
  117. 'ID' => $params['ID']
  118. )
  119. ))->fetch();
  120. if (!$deliveryRestHandler)
  121. {
  122. throw new RestException('Handler not found', self::ERROR_HANDLER_NOT_FOUND);
  123. }
  124. if ($params['APP_ID'] && !empty($deliveryRestHandler['APP_ID']) && $deliveryRestHandler['APP_ID'] !== $params['APP_ID'])
  125. {
  126. throw new AccessException();
  127. }
  128. $deliveryListResult = Sale\Delivery\Services\Manager::getList([
  129. 'select' => ['ID', 'CLASS_NAME', 'CONFIG'],
  130. 'filter' => [
  131. '=CLASS_NAME' => '\\'.\Sale\Handlers\Delivery\RestHandler::class,
  132. ],
  133. ]);
  134. $deliveryIdList = [];
  135. while ($delivery = $deliveryListResult->fetch())
  136. {
  137. if ($delivery['CONFIG']['MAIN']['REST_CODE'] === $deliveryRestHandler['CODE'])
  138. {
  139. $deliveryIdList[] = $delivery['ID'];
  140. }
  141. }
  142. if ($deliveryIdList)
  143. {
  144. throw new RestException(
  145. 'There are deliveries with this handler: '.implode(', ', $deliveryIdList),
  146. self::ERROR_HANDLER_DELETE
  147. );
  148. }
  149. }
  150. /**
  151. * @param $query
  152. * @param $n
  153. * @param \CRestServer $server
  154. * @return array|false|int
  155. * @throws RestException
  156. */
  157. public static function addHandler($query, $n, \CRestServer $server)
  158. {
  159. self::checkDeliveryPermission();
  160. $params = self::prepareHandlerParams($query, $server);
  161. self::checkParamsOnAddHandler($params);
  162. if (isset($params['SETTINGS']['CONFIG']) && is_array($params['SETTINGS']['CONFIG']))
  163. {
  164. $params['SETTINGS']['CONFIG'] = [
  165. 'ITEMS' => self::convertArrayForSaving($params['SETTINGS']['CONFIG'], '[SETTINGS][CONFIG][]'),
  166. ];
  167. }
  168. $data = [
  169. 'NAME' => $params['NAME'],
  170. 'CODE' => $params['CODE'],
  171. 'SORT' => $params['SORT'] ?: 100,
  172. 'DESCRIPTION' => $params['DESCRIPTION'],
  173. 'SETTINGS' => $params['SETTINGS'],
  174. 'PROFILES' => self::convertArrayForSaving($params['PROFILES'], '[PROFILES][]'),
  175. 'APP_ID' => $params['APP_ID'],
  176. ];
  177. $result = Internals\DeliveryRestHandlerTable::add($data);
  178. if ($result->isSuccess())
  179. {
  180. return $result->getId();
  181. }
  182. $error = implode("\n", $result->getErrorMessages());
  183. throw new RestException($error, self::ERROR_HANDLER_ADD);
  184. }
  185. /**
  186. * @param $query
  187. * @param $n
  188. * @param \CRestServer $server
  189. * @return bool
  190. * @throws RestException
  191. */
  192. public static function updateHandler($query, $n, \CRestServer $server): bool
  193. {
  194. self::checkDeliveryPermission();
  195. $params = self::prepareHandlerParams($query, $server);
  196. self::checkParamsOnUpdateHandler($params);
  197. $fields = [];
  198. foreach (['CODE', 'NAME', 'DESCRIPTION', 'SETTINGS', 'PROFILES'] as $field)
  199. {
  200. if (!array_key_exists($field, $params))
  201. {
  202. continue;
  203. }
  204. if ($field === 'PROFILES')
  205. {
  206. $value = self::convertArrayForSaving($params[$field], '[PROFILES][]');
  207. }
  208. elseif ($field === 'SETTINGS')
  209. {
  210. if (isset($params[$field]['CONFIG']) && is_array($params[$field]['CONFIG']))
  211. {
  212. $params[$field]['CONFIG'] = [
  213. 'ITEMS' => self::convertArrayForSaving($params[$field]['CONFIG'], '[SETTINGS][CONFIG][]'),
  214. ];
  215. }
  216. $value = $params[$field];
  217. }
  218. else
  219. {
  220. $value = $params[$field];
  221. }
  222. $fields[$field] = $value;
  223. }
  224. $result = Internals\DeliveryRestHandlerTable::update($params['ID'], $fields);
  225. if ($result->isSuccess())
  226. {
  227. return true;
  228. }
  229. $error = implode("\n", $result->getErrorMessages());
  230. throw new RestException($error, self::ERROR_HANDLER_UPDATE);
  231. }
  232. /**
  233. * @param $query
  234. * @param $n
  235. * @param \CRestServer $server
  236. * @return bool
  237. * @throws RestException
  238. */
  239. public static function deleteHandler($query, $n, \CRestServer $server): bool
  240. {
  241. self::checkDeliveryPermission();
  242. $params = self::prepareHandlerParams($query, $server);
  243. self::checkParamsOnDeleteHandler($params);
  244. $result = Internals\DeliveryRestHandlerTable::delete($params['ID']);
  245. if ($result->isSuccess())
  246. {
  247. return true;
  248. }
  249. $error = implode("\n", $result->getErrorMessages());
  250. throw new RestException($error, self::ERROR_HANDLER_DELETE);
  251. }
  252. /**
  253. * @param $query
  254. * @param $n
  255. * @param \CRestServer $server
  256. * @return array
  257. */
  258. public static function getHandlerList($query, $n, \CRestServer $server): array
  259. {
  260. self::checkDeliveryPermission();
  261. $result = [];
  262. $handlersList = array_values(Sale\Delivery\Services\Manager::getRestHandlerList());
  263. foreach ($handlersList as $handler)
  264. {
  265. /**
  266. * Profiles
  267. */
  268. $profiles = [];
  269. if (isset($handler['PROFILES']) && is_array($handler['PROFILES']))
  270. {
  271. $profiles = self::convertArrayForOutput($handler['PROFILES']);
  272. }
  273. $handler['PROFILES'] = $profiles;
  274. /**
  275. * Settings
  276. */
  277. $settings = $handler['SETTINGS'];
  278. $config = [];
  279. if (isset($settings['CONFIG']['ITEMS']) && is_array($settings['CONFIG']['ITEMS']))
  280. {
  281. $config = self::convertArrayForOutput($settings['CONFIG']['ITEMS']);
  282. }
  283. $settings['CONFIG'] = $config;
  284. $handler['SETTINGS'] = $settings;
  285. $result[] = $handler;
  286. }
  287. return $result;
  288. }
  289. /**
  290. * @param $profiles
  291. * @throws RestException
  292. */
  293. private static function checkProfiles($profiles): void
  294. {
  295. if (empty($profiles) || !is_array($profiles))
  296. {
  297. throw new RestException('Parameter PROFILES is not defined', self::ERROR_CHECK_FAILURE);
  298. }
  299. }
  300. /**
  301. * @param $settings
  302. * @throws RestException
  303. */
  304. private static function checkSettings($settings): void
  305. {
  306. if (empty($settings) || !is_array($settings))
  307. {
  308. throw new RestException('Parameter SETTINGS is not defined', self::ERROR_CHECK_FAILURE);
  309. }
  310. if (empty($settings['CALCULATE_URL']))
  311. {
  312. throw new RestException(
  313. 'Parameter SETTINGS[CALCULATE_URL] is not defined',
  314. self::ERROR_CHECK_FAILURE
  315. );
  316. }
  317. elseif (!is_string($settings['CALCULATE_URL']))
  318. {
  319. throw new RestException(
  320. 'Parameter SETTINGS[CALCULATE_URL] must be of string type',
  321. self::ERROR_CHECK_FAILURE
  322. );
  323. }
  324. if (
  325. !empty($settings['CREATE_DELIVERY_REQUEST_URL'])
  326. && !is_string($settings['CREATE_DELIVERY_REQUEST_URL'])
  327. )
  328. {
  329. throw new RestException(
  330. 'Parameter SETTINGS[CREATE_DELIVERY_REQUEST_URL] must be of string type',
  331. self::ERROR_CHECK_FAILURE
  332. );
  333. }
  334. if (
  335. !empty($settings['CANCEL_DELIVERY_REQUEST_URL'])
  336. && !is_string($settings['CANCEL_DELIVERY_REQUEST_URL'])
  337. )
  338. {
  339. throw new RestException(
  340. 'Parameter SETTINGS[CANCEL_DELIVERY_REQUEST_URL] must be of string type',
  341. self::ERROR_CHECK_FAILURE
  342. );
  343. }
  344. if (empty($settings['CONFIG']) || !is_array($settings['CONFIG']))
  345. {
  346. throw new RestException('Parameter SETTINGS[CONFIG] is not defined', self::ERROR_CHECK_FAILURE);
  347. }
  348. }
  349. /**
  350. * @param array $items
  351. * @param string $path
  352. * @return array
  353. * @throws RestException
  354. */
  355. private static function convertArrayForSaving(array $items, string $path = ''): array
  356. {
  357. $result = [];
  358. foreach ($items as $item)
  359. {
  360. if (!isset($item['CODE']))
  361. {
  362. throw new RestException(
  363. ($path === '' ? '' : $path . ' ') . 'Item CODE is not specified',
  364. self::ERROR_CHECK_FAILURE
  365. );
  366. }
  367. $profileCode = $item['CODE'];
  368. unset($item['CODE']);
  369. $result[$profileCode] = $item;
  370. }
  371. return $result;
  372. }
  373. /**
  374. * @param array $items
  375. * @return array
  376. */
  377. private static function convertArrayForOutput(array $items): array
  378. {
  379. $result = [];
  380. foreach ($items as $profileCode => $item)
  381. {
  382. $item['CODE'] = $profileCode;
  383. $result[] = $item;
  384. }
  385. return $result;
  386. }
  387. }