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 ?? []);
}