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