- Модуль: im
- Путь к файлу: ~/bitrix/modules/im/lib/update/chatdiskaccess.php
- Класс: BitrixImUpdateChatDiskAccess
- Вызов: ChatDiskAccess::execute
public function execute(array &$result)
{
if (!Loader::includeModule(self::$moduleId))
{
return false;
}
global $pPERIOD;
$pPERIOD = 30; /** Increase agent delay. @see CAgent::ExecuteAgents */
$startTime = time();
$isCronRun =
!BitrixMainModuleManager::isModuleInstalled('bitrix24') &&
(php_sapi_name() === 'cli');
$return = false;
$params = Option::get(self::$moduleId, self::OPTION_NAME, '');
$params = $params !== '' ? @unserialize($params, ['allowed_classes' => false]) : [];
$params = is_array($params) ? $params : [];
if (empty($params))
{
$params = [
'lastId' => 0,
'number' => 0,
'count' => ChatTable::getCount([
'>DISK_FOLDER_ID' => 0,
]),
];
}
if ($params['count'] > 0)
{
$result['title'] = Loc::getMessage('IM_UPDATE_CHAT_DISK_ACCESS');
$result['progress'] = 1;
$result['steps'] = '';
$result['count'] = $params['count'];
$filter = [
'>DISK_FOLDER_ID' => 0,
];
if (isset($params['lastId']) && (int)$params['lastId'] > 0)
{
$filter[' ['ID', 'DISK_FOLDER_ID'],
'filter' => $filter,
'order' => ['ID' => 'DESC'],
'offset' => 0,
'limit' => 1000,
]);
$connection = BitrixMainApplication::getConnection();
$accessProvider = new BitrixImAccessChatAuthProvider;
$found = false;
while ($row = $chatList->fetch())
{
$chatId = (int)$row['ID'];
$folderId = (int)$row['DISK_FOLDER_ID'];
$accessProvider->updateChatCodesByRelations($chatId);
$accessCode = $accessProvider->generateAccessCode($chatId);
$connection->queryExecute(/** @lang mysql */ "
INSERT INTO b_disk_simple_right (OBJECT_ID, ACCESS_CODE)
SELECT P.OBJECT_ID, '{$accessCode}'
FROM
b_disk_object_path P
WHERE
P.OBJECT_ID != {$folderId}
AND P.PARENT_ID = {$folderId}
");
$params['lastId'] = $chatId;
$params['number']++;
$found = true;
if (!$isCronRun && (time() - $startTime >= 30))
{
break;
}
}
if ($found)
{
Option::set(self::$moduleId, self::OPTION_NAME, serialize($params));
$return = true;
}
$result['progress'] = floor($params['number'] * 100 / $params['count']);
$result['steps'] = $params['number'];
if ($found === false)
{
Option::delete(self::$moduleId, array('name' => self::OPTION_NAME));
}
}
return $return;
}