- Модуль: im
- Путь к файлу: ~/bitrix/modules/im/lib/update/chatconfigconnectionsrestorer.php
- Класс: BitrixImUpdateChatConfigConnectionsRestorer
- Вызов: ChatConfigConnectionsRestorer::execute
function execute(array &$option)
{
if (!Loader::includeModule(self::$moduleId))
{
return false;
}
$haveEventHandlersRestored = Option::get(self::$moduleId, 'have_event_handlers_restored', 'N');
if ($haveEventHandlersRestored !== 'Y')
{
$this->restoreEventHandlers();
}
$params = Option::get(self::$moduleId, self::OPTION_NAME, '');
$params = $params !== '' ? @unserialize($params, ['allowed_classes' => false]) : [];
$params = is_array($params) ? $params : [];
if (empty($params))
{
$params = [
'default_group_id' => $this->getDefaultGroupId(),
'last_recovered_user' => 0,
];
}
$notRecoveredUserIdList =
BitrixMainUserTable::query()
->addSelect('ID')
->registerRuntimeField(
'OPTION_USER',
(new BitrixMainORMFieldsRelationsReference(
'OPTION_USER',
BitrixImModelOptionUserTable::getEntity(),
BitrixMainORMQueryJoin::on('this.ID', 'ref.USER_ID')
))->configureJoinType(BitrixMainORMQueryJoin::TYPE_LEFT)
)
->whereNull('OPTION_USER.USER_ID')
->where('IS_REAL_USER', 'Y')
->where('ID', '>', $params['last_recovered_user'])
->addOrder('ID')
->setLimit(100)
->fetchAll()
;
if (empty($notRecoveredUserIdList))
{
Option::delete(self::$moduleId, ['name' => self::OPTION_NAME]);
Option::delete(self::$moduleId, ['name' => 'have_event_handlers_restored']);
return false;
}
$notRecoveredUserIdList = array_map(static fn($user) => (int)$user['ID'], $notRecoveredUserIdList);
$userPresetList =
OptionGroupTable::query()
->addSelect('ID')
->addSelect('USER_ID')
->whereIn('USER_ID', $notRecoveredUserIdList)
->fetchAll()
;
$flippedNotRecoveredUserIdList = array_flip($notRecoveredUserIdList);
foreach ($userPresetList as $userPreset)
{
$insertFields = [
'USER_ID' => (int)$userPreset['USER_ID'],
'GENERAL_GROUP_ID' => (int)$userPreset['ID'],
'NOTIFY_GROUP_ID' => (int)$userPreset['ID'],
];
$updateFields = [
'GENERAL_GROUP_ID' => (int)$userPreset['ID'],
'NOTIFY_GROUP_ID' => (int)$userPreset['ID'],
];
OptionUserTable::merge($insertFields, $updateFields);
$params['last_recovered_user'] = (int)$userPreset['ID'];
unset($flippedNotRecoveredUserIdList[(int)$userPreset['USER_ID']]);
}
foreach (array_flip($flippedNotRecoveredUserIdList) as $userId)
{
$insertFields = [
'USER_ID' => $userId,
'GENERAL_GROUP_ID' => $params['default_group_id'],
'NOTIFY_GROUP_ID' => $params['default_group_id']
];
$updateFields = [
'GENERAL_GROUP_ID' => $params['default_group_id'],
'NOTIFY_GROUP_ID' => $params['default_group_id'],
];
OptionUserTable::merge($insertFields, $updateFields);
$params['last_recovered_user'] = $userId;
}
$params = serialize($params);
Option::set(self::$moduleId, self::OPTION_NAME, $params);
return true;
}