• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/sync/managers/eventqueuemanager.php
  • Класс: BitrixCalendarSyncManagersEventQueueManager
  • Вызов: EventQueueManager::checkEvents
static function checkEvents(): ?string
{
	if (
		!Loader::includeModule('calendar')
		|| !Loader::includeModule('dav')
	)
	{
		return null;
	}

	$qm = self::createInstance();

	$entriesDb = $qm::getEventListDb();
	while ($queueItem = $entriesDb->Fetch())
	{
		$connection = $qm->getConnectionForQueueItem($queueItem);

		$event = $qm->mapperFactory->getEvent()->getEntity((int)$queueItem['EVENT_ID']);
		if (!$event)
		{
			continue;
		}

		$context = $qm->prepareEventContext(
			[
				'connection' => $connection,
				'event' => $event,
				'queueItem' => $queueItem,
			]
		);

		if ($event->getOwner() === null || $event->getOwner()->getId() === null)
		{
			$eventConnection = $context->getEventConnection();
			if ($eventConnection !== null)
			{
				$qm->mapperFactory->getEventConnection()->update(
					$eventConnection->setLastSyncStatus(Dictionary::SYNC_STATUS['success'])
				);
			}

			continue;
		}

		$factory = FactoryBuilder::create($connection->getVendor()->getCode(), $connection, $context);
		$syncManager = new VendorSynchronization($factory);
		$result = null;

		try
		{
			switch ($queueItem['SYNC_STATUS'])
			{
				case Dictionary::SYNC_STATUS['create']:
					$result = $syncManager->createEvent($event, $context);
					break;
				case Dictionary::SYNC_STATUS['recreate']:
					$result = $syncManager->deleteEvent($event, $context);
					// TODO: create eventConnection with status "create"
					$result = $syncManager->createEvent($event, $context);
					break;
				case Dictionary::SYNC_STATUS['update']:
					$result = $syncManager->updateEvent($event, $context);
					break;
				case Dictionary::SYNC_STATUS['delete']:
					$result = $syncManager->deleteEvent($event, $context);
					break;
			}
		}
		catch (Exception $e)
		{
		}

		$eventLink = $qm->mapperFactory->getEventConnection()->getMap(
			[
				'=EVENT_ID' => $event->getId(),
				'=CONNECTION_ID' => $factory->getConnection()->getId(),
			]
		)->fetch();

		if (!is_null($eventLink))
		{
			$retryCount = $eventLink->getRetryCount() + 1;
			$currentNextSyncTry = $connection->getNextSyncTry();
			if ($result && $result->isSuccess())
			{
				$resultData = $result->getData();

				if (
					is_array($resultData)
					&& (isset($resultData[$factory->getConnection()->getVendor()->getCode()])
						&& $resultData[$factory->getConnection()->getVendor()->getCode()]['status']
						=== Dictionary::SYNC_STATUS['success']
						|| ($resultData['status'] ?? null) === Dictionary::SYNC_STATUS['success'])
				)
				{
					$eventLink->setLastSyncStatus(Dictionary::SYNC_STATUS['success']);
					$retryCount = 0;
					$currentNextSyncTry = null;
				}
			}

			if (
				$eventLink->getLastSyncStatus() !== Dictionary::SYNC_STATUS['success']
				&& $retryCount > self::MAX_RETRY_COUNT
			)
			{
				$eventLink->setLastSyncStatus(Dictionary::SYNC_STATUS['failed']);
			}

			$eventLink->setRetryCount($retryCount);
			$qm->mapperFactory->getEventConnection()->update($eventLink);
		}
		else
		{
			$retryCount = 0;
			$currentNextSyncTry = null;
		}

		$connection->setNextSyncTry(
			self::prepareNextSyncTry(
				$currentNextSyncTry,
				$retryCount
			)
		);
	}

	$qm->saveConnections();

	return "\Bitrix\Calendar\Sync\Managers\EventQueueManager::checkEvents();";
}