• Модуль: 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;
}