• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/sync/googleapipush.php
  • Класс: BitrixCalendarSyncGoogleApiPush
  • Вызов: GoogleApiPush::createWatchChannels
static function createWatchChannels($start = 0)
{
	$pushOptionEnabled = COption::getOptionString('calendar', 'sync_by_push', false);
	if (!$pushOptionEnabled && !CCalendar::isBitrix24())
	{
		return null;
	}

	$lastId = $start;
	if(!Loader::includeModule('dav'))
	{
		return false;
	}

	$davConnections = CDavConnection::getList(
		["ID" => "ASC"],
		[
			'ACCOUNT_TYPE' => GoogleHelper::GOOGLE_ACCOUNT_TYPE_API,
			'>ID' => $start
		],
		false,
		['nTopCount' => self::CREATE_LIMIT]
	);

	$connections = [];
	$pushConnectionIds = [];
	while($row = $davConnections->fetch())
	{
		//connectivity check
		if (!self::isConnectionError($row['LAST_RESULT']))
		{
			$lastId = $row['ID'];
			$connections[] = $row;
			$pushConnectionIds[] = $row['ID'];
		}
	}

	if(!empty($connections))
	{
		$result = PushTable::getList(
			[
				'filter' => [
					'=ENTITY_TYPE' => self::TYPE_CONNECTION,
					'=ENTITY_ID' => $pushConnectionIds,
				],
			]
		);

		$pushChannels = [];
		while($row = $result->fetch())
		{
			$pushChannels[$row['ENTITY_ID']] = $row;
		}

		foreach($connections as $davConnection)
		{
			if(isset($pushChannels[$davConnection['ID']]))
			{
				continue;
			}

			$googleApiConnection = new GoogleApiSync($davConnection['ENTITY_ID'], $davConnection['ID']);
			$channelInfo = $googleApiConnection->startWatchCalendarList($connections['NAME']);
			if($channelInfo && isset($channelInfo['id'], $channelInfo['resourceId']))
			{
				self::deletePushChannel(["ENTITY_TYPE" => self::TYPE_CONNECTION, 'ENTITY_ID' => $davConnection['ID']]);
				$googleApiConnection->updateSuccessLastResultConnection();
				PushTable::add([
					'ENTITY_TYPE' => self::TYPE_CONNECTION,
					'ENTITY_ID' => $davConnection['ID'],
					'CHANNEL_ID' => $channelInfo['id'],
					'RESOURCE_ID' => $channelInfo['resourceId'],
					'EXPIRES' => $channelInfo['expiration'],
					'NOT_PROCESSED' => 'N'
				]);
			}
		}
	}

	if($lastId == $start)
	{
		CAgent::removeAgent("\Bitrix\Calendar\Sync\GoogleApiPush::createWatchChannels(".$start.");", "calendar");
		CAgent::removeAgent("\Bitrix\Calendar\Sync\GoogleApiPush::createWatchChannels(0);", "calendar");
		return null;
	}

	return false;
}