54 $this->factory = $factory;
55 $this->mapperFactory = ServiceLocator::getInstance()->get(
'calendar.service.mappers.factory');
70 $mainResult =
new Result();
72 $factory = $this->factory;
75 $sectionLink =
$context->getSectionConnection();
79 return $mainResult->setData([$factory->
getConnection()->getVendor()->getCode() => [
81 'message' =>
'Section link not found',
85 $eventLink = $this->getEventConnection(
$event)
86 ?? (
new EventConnection())
88 ->setConnection($sectionLink->getConnection());
89 if ($sectionLink->isActive())
96 $resultData =
$result->getData();
99 ->setVendorEventId($resultData[
'event'][
'id'])
100 ->setEntityTag($resultData[
'event'][
'etag'])
101 ->setVendorVersionId($resultData[
'event'][
'version'] ??
null)
102 ->setVersion(
$event->getVersion())
104 if (!empty(
$result->getData()[
'data']))
106 $eventLink->setData(
$result->getData()[
'data']);
112 $eventLink->setLastSyncStatus(
$status);
119 catch (NotFoundException $e)
122 $sectionLink->setActive(
false)->setSyncToken(
null)->setPageToken(
null);
123 $this->mapperFactory->getSectionConnection()->update($sectionLink);
127 if (!$sectionLink->isActive())
130 $eventLink->setLastSyncStatus(
$status)->setVendorEventId(
'');
137 $eventLink = $eventLink->getId()
138 ? $this->mapperFactory->getEventConnection()->update($eventLink)
139 : $this->mapperFactory->getEventConnection()->create($eventLink);
141 $syncResult[
'eventConnectionId'] = $eventLink->getId();
142 $data[
'result'] = $syncResult;
144 return $mainResult->setData(
$data);
160 $mainResult =
new Result();
162 $factory = $this->factory;
163 $sectionLink =
$context->getSectionConnection();
168 $mainResult->addError(
new Error(
'Section connection not found'));
171 $manager = $factory->getEventManager();
172 $eventLink =
$context->getEventConnection();
174 if ($eventLink && $eventLink->getVendorEventId() && $sectionLink->isActive())
176 if ((
int)$eventLink->getEventVersion() !==
$event->getVersion())
185 ->setEntityTag(
$result->getData()[
'event'][
'etag'])
186 ->setVendorVersionId(
$result->getData()[
'event'][
'version'] ??
null)
187 ->setVersion(
$event->getVersion());
193 $eventLink->setLastSyncStatus(
$status);
195 $this->mapperFactory->getEventConnection()->update($eventLink);
199 $this->mapperFactory->getEventConnection()->delete($eventLink);
207 $eventLink->setLastSyncStatus(
$status);
208 $this->mapperFactory->getEventConnection()->update($eventLink);
212 elseif ($eventLink && !$sectionLink->isActive())
216 ->setVersion(
$event->getVersion())
219 $this->mapperFactory->getEventConnection()->update($eventLink);
226 ->setConnection($sectionLink->getConnection())
228 ->setVersion(
$event->getVersion())
230 $this->mapperFactory->getEventConnection()->create($eventLink);
236 $resultData[$factory->getConnection()->getVendor()->getCode()] = [
240 return $mainResult->setData($resultData);
258 $mainResult =
new Result();
260 $factory = $this->factory;
261 $sectionLink =
$context->getSectionConnection();
266 $mainResult->addError(
new Error(
'Section connection not found'));
270 $manager = $factory->getEventManager();
271 $eventLink =
$context->getEventConnection();
272 if ($eventLink && $eventLink->getVendorEventId() && $sectionLink->isActive())
279 if (
$event->getRecurringRule())
282 $childIds = EventConnectionTable::query()
283 ->setSelect([
'ID',
'EVENT'])
284 ->where(
'EVENT.RECURRENCE_ID',
$event->getParentId())
285 ->where(
'EVENT.OWNER_ID',
$event->getOwner()->getId())
288 while ($child = $childIds->fetch())
290 $childToDelete[] = $child[
'ID'];
294 $DB->Query(
"DELETE FROM b_calendar_event_connection
295 WHERE ID IN (" . implode(
',', $childToDelete) .
")
296 AND CONNECTION_ID = '{$factory->getConnection()->getId()}';
303 $this->mapperFactory->getEventConnection()->delete($eventLink);
308 $eventLink->setLastSyncStatus(
$status);
309 $this->mapperFactory->getEventConnection()->update($eventLink);
315 $this->mapperFactory->getEventConnection()->delete($eventLink);
318 elseif ($eventLink && !$sectionLink->isActive())
321 $eventLink->setLastSyncStatus(
$status);
322 $this->mapperFactory->getEventConnection()->update($eventLink);
328 $resultData[$factory->getConnection()->getVendor()->getCode()] = [
332 return $mainResult->setData($resultData);
350 $factory = $this->factory;
352 $sectionLink =
$context->getSectionConnection();
356 $result->addError(
new Error(
'Section connection not found'));
362 if ($masterEvent = $this->getMasterEvent(
$event))
365 $masterLink = $this->getEventConnection($masterEvent);
366 if ($masterLink ===
null)
369 $result->addError(
new Error(
'Series master event does not have connection with vendor'));
373 $context->setEventConnection($masterLink);
379 $resultData =
$result->getData();
381 if ($factory->getCode() === Icloud\Helper::ACCOUNT_TYPE)
384 ->setVendorEventId(
$result->getData()[
'event'][
'id'])
385 ->setEntityTag($resultData[
'event'][
'etag'])
387 ->setVersion($masterEvent->getVersion())
389 $this->mapperFactory->getEventConnection()->update($masterLink);
392 $eventLink = (
new EventConnection())
394 ->setConnection($sectionLink->getConnection())
395 ->setVendorEventId(
$result->getData()[
'event'][
'id'])
396 ->setVendorVersionId(
$result->getData()[
'event'][
'version'] ??
null)
397 ->setRecurrenceId(
$result->getData()[
'event'][
'recurrence'] ??
null)
398 ->setData(
$result->getData()[
'event'][
'data'] ??
null)
400 ->setVersion(
$event->getVersion())
402 if ($factory->getCode() !== Icloud\Helper::ACCOUNT_TYPE)
404 $eventLink->setEntityTag(
$result->getData()[
'event'][
'etag'] ??
null);
407 $this->mapperFactory->getEventConnection()->create($eventLink);
413 $this->mapperFactory->getEventConnection()->update($masterLink);
422 $resultData[$factory->getConnection()->getVendor()->getCode()] = [
427 return (
new Result())->setData($resultData);
445 $factory = $this->factory;
446 $sectionLink =
$context->getSectionConnection();
447 $eventLink =
$context->getEventConnection();
450 $result->addError(
new Error(
'Section connection not found'));
460 if ($masterEvent = $this->getMasterEvent(
$event))
462 $manager = $factory->getEventManager();
463 $masterLink = $this->getEventConnection($masterEvent);
465 if ($masterLink ===
null)
468 $result->addError(
new Error(
'Series master event does not have connection with vendor'));
474 ->setEventConnection($masterLink)
475 ->add(
'sync',
'instanceLink', $eventLink)
484 ->setVersion(
$event->getVersion())
485 ->setVendorVersionId(
$result->getData()[
'event'][
'version'] ??
null)
487 if (!empty(
$result->getData()[
'event'][
'id']))
489 $eventLink->setVendorEventId(
$result->getData()[
'event'][
'id']);
491 if ($factory->getCode() !==
Icloud\Helper::ACCOUNT_TYPE)
493 $eventLink->setEntityTag(
$result->getData()[
'event'][
'etag'] ??
null);
495 $this->mapperFactory->getEventConnection()->update($eventLink);
497 if ($factory->getCode() ===
Icloud\Helper::ACCOUNT_TYPE)
500 ->setEntityTag(
$result->getData()[
'event'][
'etag'])
502 ->setVersion($masterEvent->getVersion())
504 $this->mapperFactory->getEventConnection()->update($masterLink);
511 $this->mapperFactory->getEventConnection()->update($masterLink);
520 $resultData[$factory->getConnection()->getVendor()->getCode()] = [
525 return (
new Result())->setData($resultData);
537 $mainResult =
new Result();
540 $factory = $this->factory;
541 $excludeDate =
$context->sync[
'excludeDate'] ??
null;
545 $mainResult->addError(
new Error(
'Not found info about exclude date'));
548 $sectionLink =
$context->getSectionConnection();
549 $masterLink =
$context->getEventConnection();
551 if ($masterLink && $sectionLink)
553 $manager = $factory->getEventManager();
559 ->setEntityTag(
$result->getData()[
'event'][
'etag'] ??
null)
561 ->setVersion($masterLink->getEvent()->getVersion())
570 $this->mapperFactory->getEventConnection()->update($masterLink);
578 $resultData[$factory->getConnection()->getVendor()->getCode()] = [
583 return $result->setData($resultData);
595 $mainResult =
new Result();
597 $factory = $this->factory;
600 $sectionLink =
$context->getSectionConnection();
603 $mainResult->addError(
new Error(
'Section connection not found'));
607 $context->add(
'sync',
'vendorSectionId', $sectionLink->getVendorSectionId());
609 $recurrenceEvent->getEvent()->setUid(
null);
615 $masterResult = $this->createEventLink($recurrenceEvent, $this->factory->getConnection()->getId());
618 foreach ($recurrenceEvent->getInstanceMap()->getCollection() as
$instance)
620 $instanceResult[] = $this->createEventLink(
$instance, $this->factory->getConnection()->getId());
631 $resultData[$factory->
getConnection()->getVendor()->getCode()] = [
634 'linkMasterResult' => $masterResult ??
null,
635 'linkInstancesResult' => $instanceResult ??
null,
638 return $mainResult->setData($resultData);
648 public function updateRecurrence(SyncEvent $recurrenceEvent, EventContext
$context): Result
650 $mainResult =
new Result();
652 $factory = $this->factory;
653 $manager = $factory->getEventManager();
655 $sectionLink =
$context->getSectionConnection();
658 return $mainResult->addError(
new Error(
'Section connection not found'));
661 $context->add(
'sync',
'vendorSectionId', $sectionLink->getVendorSectionId());
663 if ($recurrenceEvent->getEventConnection()?->getVendorEventId() ===
null)
665 return $mainResult->addError(
new Error(
'Event connection not found'));
668 $recurrenceEvent->getEvent()->setUid(
669 $recurrenceEvent->getEventConnection()?->getVendorEventId()
672 if ((
int)$recurrenceEvent->getEventConnection()?->getEventVersion() === $recurrenceEvent->getEvent()->getVersion())
677 'id' => $recurrenceEvent->getEventConnection()?->getVendorEventId(),
678 'etag' => $recurrenceEvent->getEventConnection()?->getEntityTag(),
690 $masterResult = $this->updateEventLink($recurrenceEvent);
691 $instanceResult = [];
693 foreach ($recurrenceEvent->getInstanceMap()->getCollection() as
$instance)
697 $instanceResult[] = $this->updateEventLink(
$instance);
701 $instanceResult[] = $this->createEventLink(
703 $this->factory->getConnection()->getId()
715 catch (NotFoundException $e)
717 $recurrenceEvent->getEvent()->setUid(
null);
719 return $this->createRecurrence($recurrenceEvent,
$context);
723 $resultData[$factory->getConnection()->getVendor()->getCode()] = [
726 'linkMasterResult' => $masterResult ??
null,
727 'linkInstancesResult' => $instanceResult ??
null,
730 return $mainResult->setData($resultData);
747 $mainResult =
new Result();
749 $factory = $this->factory;
750 $manager = $factory->getSectionManager();
751 $context->add(
'sync',
'connection', $factory->getConnection());
753 if ($sectionLink =
$context->getSectionConnection())
755 $resultData[
'sectionConnection'] = $sectionLink;
765 $originalName = $section->getName();
776 $section->setName($originalName .
" ($counter)");
782 $section->setName($originalName);
792 ->setSection($section)
793 ->setConnection($factory->getConnection())
794 ->setVendorSectionId(
$result->getData()[
'id'])
795 ->setVersionId(
$result->getData()[
'version'])
800 $this->mapperFactory->getSectionConnection()->create($sectionLink);
802 $resultData[
'sectionConnection'] = $sectionLink;
806 $mainResult->addErrors(
$result->getErrors());
811 $resultData[$factory->getConnection()->getVendor()->getCode()] = [
815 return $mainResult->setData($resultData);
828 $mainResult =
new Result();
830 $factory = $this->factory;
832 if ($sectionLink =
$context->getSectionConnection())
834 $manager = $factory->getSectionManager();
835 if ($sectionLink->isActive())
843 $sectionLink->setVersionId(
$result->getData()[
'version']);
848 $mainResult->addErrors(
$result->getErrors());
853 $sectionLink->setActive(
false);
860 $this->mapperFactory->getSectionConnection()->update($sectionLink);
874 $factory->getConnection()->getVendor()->getCode() => [
877 'error' =>
$result->getData()[
'error'] ??
'',
880 return $mainResult->setData($resultData);
891 $mainResult =
new Result();
893 $factory = $this->factory;
894 $manager = $factory->getSectionManager();
896 if (($sectionLink =
$context->getSectionConnection()) && $sectionLink->isActive())
898 $sectionLink->setSection($section);
907 $mainResult->addErrors(
$result->getErrors());
912 $this->mapperFactory->getSectionConnection()->update($sectionLink);
920 $resultData[$factory->getConnection()->getVendor()->getCode()] = [
924 return $mainResult->setData($resultData);
942 $link = EventConnectionTable::query()
945 ->addFilter(
'EVENT_ID',
$event->getId())
952 EventConnectionTable::update($link->getId(), [
954 'VERSION' => $version,
965 return $this->factory->canSubscribeSection();
973 return $this->factory->canSubscribeConnection();
983 return $this->factory->getPushManager()->addSectionPush($link);
991 return $this->factory->getPushManager()->addConnectionPush($this->factory->getConnection());
1001 if (
$manager = $this->factory->getPushManager())
1016 return $this->factory->getPushManager()->deletePush($push);
1026 return $this->factory->getPushManager()->deletePush($push);
1039 return $this->mapperFactory->getEventConnection()->
getMap([
1040 '=EVENT_ID' =>
$event->getId(),
1041 '=CONNECTION_ID' => $this->factory->getConnection()->getId(),
1055 return $this->mapperFactory->getEvent()->getMap([
1056 '=PARENT_ID' =>
$event->getRecurrenceId(),
1057 '=OWNER_ID' =>
$event->getOwner()->getId(),
1072 return EventConnectionTable::add([
1073 'EVENT_ID' => $syncEvent->getEvent()->getId(),
1074 'CONNECTION_ID' => $connectionId,
1075 'VENDOR_EVENT_ID' => $syncEvent->getEventConnection()
1076 ? $syncEvent->getEventConnection()->getVendorEventId()
1080 'VERSION' => $syncEvent->getEvent()->getVersion(),
1081 'ENTITY_TAG' => $syncEvent->getEventConnection()
1082 ? $syncEvent->getEventConnection()->getEntityTag()
1094 private function updateEventLink(SyncEvent $syncEvent): Result
1096 $newLink = $this->mapperFactory->getEventConnection()->update($syncEvent->getEventConnection());
1098 return (
new Result())->setData([
'eventConnection' => $newLink]);
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)