• Модуль: im
  • Путь к файлу: ~/bitrix/modules/im/lib/access/chatauthprovider.php
  • Класс: BitrixImAccessChatAuthProvider
  • Вызов: ChatAuthProvider::updateChatCodesByRelations
public function updateChatCodesByRelations(int $chatId): void
{
	if ($chatId > 0)
	{
		$connection = BitrixMainApplication::getConnection();
		$helper = $connection->getSqlHelper();
		$providerId = $helper->forSql($this->id);
		$accessCode = $helper->forSql($this->generateAccessCode($chatId));

		$connection->queryExecute(/** @lang mysql */ "
			INSERT INTO b_user_access (USER_ID, PROVIDER_ID, ACCESS_CODE)
			SELECT R.USER_ID, '{$providerId}', '{$accessCode}'
			FROM b_im_relation R 
				INNER JOIN b_user U ON R.USER_ID = U.ID
				LEFT JOIN b_user_access A 
					ON U.ID = A.USER_ID
					AND A.PROVIDER_ID = '{$providerId}'
					AND A.ACCESS_CODE = '{$accessCode}'
			WHERE 
				R.CHAT_ID = {$chatId}
				AND A.ID IS NULL
				AND (CASE 
					WHEN U.EXTERNAL_AUTH_ID = 'imconnector' AND POSITION('livechat|' in U.XML_Id) = 1 THEN 1
					WHEN U.EXTERNAL_AUTH_ID = 'imconnector' THEN 0
					ELSE 1
				END) = 1
		");
		$connection->queryExecute(/** @lang mysql */ "
			DELETE FROM b_user_access
			WHERE PROVIDER_ID = '{$providerId}'
				AND ACCESS_CODE = '{$accessCode}'
				AND USER_ID NOT IN(
					SELECT R.USER_ID
					FROM b_im_relation R
					WHERE R.CHAT_ID = {$chatId}
				)
		");

		$res = BitrixMainUserAccessTable::getList([
			'filter' => ['=ACCESS_CODE' => $accessCode],
			'select' => ['USER_ID']
		]);
		while ($row = $res->fetch())
		{
			CAccess::ClearCache($row['USER_ID']);
		}
	}
}