- Модуль: calendar
- Путь к файлу: ~/bitrix/modules/calendar/lib/sync/googleapipush.php
- Класс: BitrixCalendarSyncGoogleApiPush
- Вызов: GoogleApiPush::renewWatchChannels
static function renewWatchChannels()
{
$pushRows = [];
$connectionIds = [];
$sectionIds = [];
$pushesDb = PushTable::getList([
'filter' => [
'<=EXPIRES' => (new TypeDateTime())->add('+1 day'),
],
'order' => [
'EXPIRES' => 'ASC',
],
'limit' => self::RENEW_LIMIT,
]);
while ($row = $pushesDb->fetch())
{
$pushRows[] = $row;
if ($row['ENTITY_TYPE'] === self::TYPE_CONNECTION)
{
$connectionIds[] = (int)$row['ENTITY_ID'];
}
if ($row['ENTITY_TYPE'] === self::TYPE_SECTION)
{
$sectionIds[] = (int)$row['ENTITY_ID'];
}
}
if (!empty($pushRows))
{
global $DB;
$sections = [];
$connections = [];
if (!empty($sectionIds))
{
$sectionResult = $DB->query("SELECT * FROM b_calendar_section WHERE ID IN (" . implode(',', $sectionIds) . ")");
while($row = $sectionResult->fetch())
{
$sections[$row['ID']] = $row;
if (!empty($row['CAL_DAV_CON']) && !in_array((int)$row['CAL_DAV_CON'], $connectionIds, true))
{
$connectionIds[] = (int)$row['CAL_DAV_CON'];
}
}
}
if (!empty($connectionIds))
{
$connectionResult = $DB->query("SELECT * FROM b_dav_connections WHERE ID IN (" . implode(',', $connectionIds) . ")");
while($row = $connectionResult->fetch())
{
$connections[$row['ID']] = $row;
}
}
foreach ($pushRows as $row)
{
$channelInfo = false;
if ($row['ENTITY_TYPE'] === self::TYPE_CONNECTION && !empty($connections[$row['ENTITY_ID']]))
{
$connectionData = $connections[$row['ENTITY_ID']];
if (is_string($connectionData['LAST_RESULT']) && self::isAuthError($connectionData['LAST_RESULT']))
{
continue;
}
$googleApiConnection = new GoogleApiSync($connectionData['ENTITY_ID'], $connectionData['ID']);
$googleApiConnection->stopChannel($row['CHANNEL_ID'], $row['RESOURCE_ID']);
self::deletePushChannel($row);
$channelInfo = $googleApiConnection->startWatchCalendarList($connectionData['NAME']);
}
elseif ($row['ENTITY_TYPE'] === self::TYPE_SECTION && !empty($sections[$row['ENTITY_ID']]))
{
$section = $sections[$row['ENTITY_ID']];
if (
(!empty($connectionData)
&& is_string($connectionData['LAST_RESULT'])
&& self::isAuthError($connectionData['LAST_RESULT'])
)
|| self::isVirtualCalendar($section['GAPI_CALENDAR_ID'], $section['EXTERNAL_TYPE'])
)
{
continue;
}
$connectionData = $connections[$section['CAL_DAV_CON']];
$googleApiConnection = new GoogleApiSync($section['OWNER_ID'], $section['CAL_DAV_CON']);
$googleApiConnection->stopChannel($row['CHANNEL_ID'], $row['RESOURCE_ID']);
self::deletePushChannel($row);
$channelInfo = $googleApiConnection->startWatchEventsChannel($section['GAPI_CALENDAR_ID']);
}
else
{
self::deletePushChannel($row);
}
if (
$channelInfo
&& isset($channelInfo['id'], $channelInfo['resourceId'])
&& isset($googleApiConnection)
)
{
$googleApiConnection->updateSuccessLastResultConnection();
PushTable::add([
'ENTITY_TYPE' => $row['ENTITY_TYPE'],
'ENTITY_ID' => $row['ENTITY_ID'],
'CHANNEL_ID' => $channelInfo['id'],
'RESOURCE_ID' => $channelInfo['resourceId'],
'EXPIRES' => $channelInfo['expiration'],
'NOT_PROCESSED' => 'N'
]);
}
}
}
if (count($pushRows) < 4)
{
CAgent::removeAgent("\Bitrix\Calendar\Sync\GoogleApiPush::renewWatchChannels();", "calendar");
return false;
}
return false;
}