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