• Модуль: rest
  • Путь к файлу: ~/bitrix/modules/rest/lib/preset/provider.php
  • Класс: BitrixRestPresetProvider
  • Вызов: Provider::saveApp
static function saveApp($data)
{
	$app = [];
	$return = [];
	$errorList = [];
	if ($data['ID'] > 0)
	{
		$dbApp = AppTable::getList(
			[
				'filter' => [
					'=ID' => $data['ID'],
				],
				'limit' => 1
			]
		);
		if ($app = $dbApp->fetch())
		{
			$data['FIELDS'] = array_merge($app, $data['FIELDS']);
		}
	}

	if (count($data['FIELDS']['SCOPE']) <= 0)
	{
		$errorList[] = Loc::getMessage('INTEGRATION_PRESET_PROVIDER_ERROR_EMPTY_SCOPE');
	}

	if (empty($errorList))
	{
		foreach (GetModuleEvents('rest', 'OnRestLocalAppSave', true) as $eventHandler)
		{
			$eventResult = ExecuteModuleEventEx($eventHandler, [$app, &$data['FIELDS']]);
			if ($eventResult !== null)
			{
				$errorList[] = strip_tags($eventResult);
			}
		}
	}

	if (empty($errorList) && empty($data['FIELDS']['URL']))
	{
		$errorList[] = Loc::getMessage('INTEGRATION_PRESET_PROVIDER_ERROR_INCORRECT_URL');
	}

	if (empty($errorList))
	{
		try
		{
			$appFields = [
				'URL' => $data['FIELDS']['URL'],
				'URL_INSTALL' => $data['FIELDS']['URL_INSTALL'],
				'CLIENT_ID' => $data['FIELDS']['CLIENT_ID'],
				'CODE' => $data['FIELDS']['CLIENT_ID'],
				'SCOPE' => implode(',', $data['FIELDS']['SCOPE']),
				'STATUS' => AppTable::STATUS_LOCAL,
				'APP_NAME' => $data['FIELDS']['APP_NAME'],
				'MOBILE' => $data['FIELDS']['MOBILE'],
			];
			if ($app['ID'] > 0)
			{
				$result = AppTable::update($app['ID'], $appFields);
			}
			else
			{
				$appFields['INSTALLED'] = (!empty($data['FIELDS']['URL_INSTALL'])
					&& $data['FIELDS']['ONLY_API'] !== 'Y') ? AppTable::NOT_INSTALLED : AppTable::INSTALLED;
				$result = AppTable::add($appFields);
				if ($result->isSuccess())
				{
					Analytic::logToFile(
						'integrationAppCreated',
						'integration' . $data['INTEGRATION_ID'],
						$data['INTEGRATION_CODE'],
						'code'
					);
				}
			}

			if ($result->isSuccess())
			{
				$return['ID'] = $result->getId();

				AppLangTable::deleteByApp($return['ID']);
				if ($data['FIELDS']['ONLY_API'] === 'N')
				{
					foreach ($data['LANG_NAME'] as $lang => $name)
					{
						AppLangTable::add(
							[
								'APP_ID' => $return['ID'],
								'LANGUAGE_ID' => $lang,
								'MENU_NAME' => $name
							]
						);
					}
				}
				else
				{
					if (
						$data['FIELDS']['ONLY_API'] === 'Y'
						&& !empty($app['URL_INSTALL'])
						&& $data['FIELDS']['URL_INSTALL'] != $app['URL_INSTALL']
					)
					{
						$event = EventTable::getList(
							[
								'filter' => [
									'=APP_ID' => $return['ID'],
									'=EVENT_NAME' => 'ONAPPINSTALL',
								],
								'limit' => 1
							]
						);
						if ($eventInstall = $event->fetch())
						{
							// checkCallback is already called inside checkFields
							$result = EventTable::update(
								$eventInstall['ID'],
								[
									'APP_ID' => $return['ID'],
									'EVENT_NAME' => 'ONAPPINSTALL',
									'EVENT_HANDLER' => $data['FIELDS']['URL_INSTALL'],
								]
							);
						}
					}

					if (!empty($data['FIELDS']['URL_INSTALL']) && empty($app['URL_INSTALL']))
					{
						// checkCallback is already called inside checkFields
						$result = EventTable::add(
							[
								'APP_ID' => $return['ID'],
								'EVENT_NAME' => 'ONAPPINSTALL',
								'EVENT_HANDLER' => $data['FIELDS']['URL_INSTALL'],
							]
						);
						if ($result->isSuccess())
						{
							Sender::bind('rest', 'OnRestAppInstall');
						}
					}

					if ($app['ID'] <= 0)
					{
						AppTable::install($return['ID']);
					}
				}

				if (defined('BX_COMP_MANAGED_CACHE'))
				{
					global $CACHE_MANAGER;
					$CACHE_MANAGER->ClearByTag('sonet_group');
				}
			}
			else
			{
				$errorList = $result->getErrorMessages();
			}
		}
		catch (BitrixRestOAuthException $e)
		{
			$errorList[] = $e->getMessage();
		}

		if (empty($errorList) && $data['PLACEMENTS'])
		{
			$title = '';
			$placementListOld = [];
			$updateIDList = [];
			$addList = [];
			$data['PLACEMENTS'] = is_array($data['PLACEMENTS']) ? $data['PLACEMENTS'] : [];

			$placementLangList = [];
			foreach ($data['PLACEMENTS_LANG_LIST'] as $lang => $fields)
			{
				if (!empty($fields['TITLE']))
				{
					$placementLangList[$lang] = [
						'LANGUAGE_ID' => $lang,
						'TITLE' => $fields['TITLE'],
					];
				}
			}

			$langList = Lang::listLanguage();
			$defaultLang = $langList[0];
			if (!empty($placementLangList))
			{
				foreach ($langList as $lang)
				{
					if (isset($placementLangList[$lang]))
					{
						$title = $placementLangList[$lang]['TITLE'];
						break;
					}
				}
			}

			if ($title === '')
			{
				$title = $data['APP_NAME'];
				$placementLangList[$defaultLang] = [
					'LANGUAGE_ID' => $defaultLang,
					'TITLE' => $title,
				];
			}

			$accessPlacement = Rest::getAccessPlacement($data['FIELDS']['SCOPE']);
			$placementRes = PlacementTable::getList(
				[
					'filter' => [
						'=APP_ID' => $return['ID']
					]
				]
			);
			if ($placementList = $placementRes->fetchAll())
			{
				$placementListOld = array_column($placementList, 'PLACEMENT', 'ID');
			}

			foreach ($data['PLACEMENTS'] as $placement)
			{
				if (!in_array($placement, $accessPlacement))
				{
					$errorList[] = Loc::getMessage(
						"INTEGRATION_PRESET_PROVIDER_ERROR_ACCESS_PLACEMENT",
						[
							'#PLACEMENT_CODE#' => $placement
						]
					) ;
					continue;
				}

				$key = array_search($placement, $placementListOld);
				if ($key !== false)
				{
					$updateIDList[] = $key;
					unset($placementListOld[$key]);
				}
				else
				{
					$addList[] = [
						'APP_ID' => $return['ID'],
						'PLACEMENT' => $placement,
						'PLACEMENT_HANDLER' => $data['PLACEMENT_HANDLER_URL'],
						'TITLE' => $title,
					];
				}
			}
			if (!empty($placementListOld))
			{
				foreach (array_keys($placementListOld) as $place)
				{
					PlacementTable::delete($place);
				}
			}

			if (!empty($updateIDList))
			{
				$resultPlacementBind = PlacementTable::updateMulti(
					$updateIDList,
					[
						'PLACEMENT_HANDLER' => $data['PLACEMENT_HANDLER_URL'],
						'TITLE' => $title,
					]
				);
				if ($resultPlacementBind->isSuccess())
				{
					foreach ($updateIDList as $id)
					{
						PlacementLangTable::deleteByPlacement((int) $id);
						foreach ($placementLangList as $fields)
						{
							$fields['PLACEMENT_ID'] = $id;
							$resultPlacementLang = PlacementLangTable::add($fields);
							if (!$resultPlacementLang->isSuccess())
							{
								$errors = $resultPlacementLang->getErrorMessages();
								if (is_array($errors))
								{
									$errorList = array_merge($errorList, $errors);
								}
							}
						}
					}
				}
				else
				{
					$errors = $resultPlacementBind->getErrorMessages();
					if (is_array($errors))
					{
						$errorList = array_merge($errorList, $errors);
					}
				}
			}

			if (count($addList) > 0)
			{
				Analytic::logToFile(
					'integrationPlacementCreated',
					'integration' . $data['INTEGRATION_ID'],
					$data['INTEGRATION_CODE'],
					'integrationCode'
				);
				foreach ($addList as $item)
				{
					$resultPlacementBind = PlacementTable::add($item);
					if ($resultPlacementBind->isSuccess())
					{
						$id = (int) $resultPlacementBind->getId();
						foreach ($placementLangList as $fields)
						{
							$fields['PLACEMENT_ID'] = $id;
							$resultPlacementLang = PlacementLangTable::add($fields);
							if (!$resultPlacementLang->isSuccess())
							{
								$errors = $resultPlacementLang->getErrorMessages();
								if (is_array($errors))
								{
									$errorList = array_merge($errorList, $errors);
								}
							}
						}
						Analytic::logToFile(
							'integrationPlacementCreated',
							'integration' . $data['INTEGRATION_ID'],
							$item['PLACEMENT'],
							'placementCode'
						);
					}
					else
					{
						$errors = $resultPlacementBind->getErrorMessages();
						if (is_array($errors))
						{
							$errorList = array_merge($errorList, $errors);
						}
					}
				}
			}
		}
	}

	if (!empty($errorList))
	{
		$return['errors'] = $errorList;
	}

	return $return;
}