• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/lib/sync/managers/incomingmanager.php
  • Класс: BitrixCalendarSyncManagersIncomingManager
  • Вызов: IncomingManager::importEvent
private function importEvent(
	Event $event,
	string $vendorId,
	string $vendorVersion = null,
	array $params = []
): Result
{
	$prepareResult = function (string $action, string $entityType, $entity)
	{
		return [
			'type' => $entityType,
			'action' => $action,
			'value' => $entity,
		];
	};

	$result = new Result();

	$mapper = new CoreMappersEvent();

	$link = (new EventConnectionFactory())->getEventConnection([
		'filter' => [
			'CONNECTION_ID' => $this->connection->getId(),
			'=VENDOR_EVENT_ID' => $vendorId,
		],
		'connection' => $this->connection,
	]);
	// TODO: explode to 2 methods
	if ($link)
	{
		if ($vendorVersion && $link->getEntityTag() === $vendorVersion)
		{
			$resultData = $prepareResult('skipped', 'link', $link);
		}
		elseif (
			empty($event->getDateModified())
			|| empty($link->getEvent()->getDateModified())
			|| ($link->getEvent()->getDateModified()->getTimestamp() >= $event->getDateModified()->getTimestamp())
		)
		{
			$resultData = $prepareResult('skipped', 'link', $link);
		}
		else
		{
			try {
				$event->setId($link->getEvent()->getId());
				$event->setOwner(CoreRoleHelper::getRole(
						$this->connection->getOwner()->getId(),
						$this->connection->getOwner()->getType(),
				));
				$this->mergeReminders($event, $link->getEvent());
				$mapper->update($event, [
					'originalFrom' => $this->connection->getVendor()->getCode(),
					'userId' => $this->connection->getOwner()->getId(),
				]);
				EventConnectionTable::update($link->getId(), [
					'ENTITY_TAG' => $vendorVersion,
					'DATA' => $params['data'] ?? null,
				]);
				$resultData = $prepareResult('updated', 'link', $link);

			}
			catch (Exception $e) {
				$resultData = $prepareResult('error', 'link', $link);
				$result->addError(new Error($e->getMessage(), $e->getCode()));
			}
		}
	}
	else
	{
		try
		{
			$event->setOwner(CoreRoleHelper::getRole(
				$this->connection->getOwner()->getId(),
				$this->connection->getOwner()->getType(),
			));
			$newEvent = $mapper->create($event, [
				'originalFrom' => $this->connection->getVendor()->getCode(),
				'userId' => $this->connection->getOwner()->getId(),
			]);
			$linkResult = EventConnectionTable::add([
				'EVENT_ID' => $newEvent->getId(),
				'CONNECTION_ID' => $this->connection->getId(),
				'VENDOR_EVENT_ID' => $vendorId,
				'SYNC_STATUS' => Dictionary::SYNC_STATUS['success'],
				'ENTITY_TAG' => $vendorVersion,
				'VERSION' => 1,
				'DATA' => $params['data'] ?? null,
			]);
			if ($linkResult->isSuccess())
			{
				$resultData = $prepareResult('imported', 'eventId', $newEvent->getId());
			}
			else
			{
				$resultData = $prepareResult('error', 'eventId', $newEvent->getId());
				$result->addError(reset($linkResult->getErrors()));
			}
		}
		catch (Exception $e)
		{
			$resultData = $prepareResult('error', 'vendorId', $vendorId);
			$result->addError(new Error($e->getMessage()));
		}
	}

	return $result->setData($resultData ?? []);
}