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;
}