58 $this->connection = $connection;
60 $this->factory = FactoryBuilder::create($connection->getVendor()->getCode(), $connection,
$context);
62 $this->mapperFactory = ServiceLocator::getInstance()->get(
'calendar.service.mappers.factory');
76 $mainResult =
new Result();
87 $excludeIds =
$params[
'excludeIds'] ?? [];
89 foreach ($this->fetchSections($excludeIds) as $section)
92 if ($sectionResult->isSuccess())
94 foreach ($sectionResult->getData() as
$key => $link)
96 $resultData[
'links'][
$key][] = $link;
98 $resultData[
'exported'][] = $section->getId();
102 $mainResult->addErrors($sectionResult->getErrors());
103 $resultData[
'exportErr'][] = $section->getId();
107 return $mainResult->setData($resultData);
134 $pushResult =
static function(
array $result) use (&$resultData)
140 if (
$result[
'entityType'] ===
'link')
142 $resultData[
'events'][
$result[
'action']] =
$result[
'entity']->getEvent()->getId();
150 foreach ($this->fetchSectionEvents($sectionLink->getSection(), $excludeEventIds) as $eventPack)
152 $exportResult = $this->exportEvent($eventPack, $sectionLink);
153 if ($exportResult->isSuccess())
155 $pushResult($exportResult->getData());
161 if ($eventPack[
'event'])
163 $id = $eventPack[
'event']->getId();
165 else if ($eventPack[
'master'])
167 $id = $eventPack[
'master']->getId();
169 $resultData[
'events'][
'error'] = $id;
173 return $result->setData($resultData);
185 public function export():
Result
187 $mainResult =
new Result();
190 foreach ($this->fetchSections() as $section)
193 if (!$sectionResult->isSuccess())
199 $sectionLink = $sectionResult->getData()[
'sectionConnection'] ??
null;
203 foreach ($this->fetchSectionEvents($section) as
$event)
205 $this->exportEvent(
$event, $sectionLink);
210 throw new ObjectPropertyException(
'Context object das not have sectionLink information');
214 return $mainResult->setData($resultData);
234 if ($link = $this->getSectionLink($section))
236 if ($link->isActive())
238 $result = $this->syncManager->updateSection($section, $sectionContext);
242 'sectionConnection' => $link,
247 &&
$result->getData()[
'error'] === 404
248 && $section->getExternalType() ===
'local'
251 $this->deleteSectionConnection($link);
252 $sectionContext->setSectionConnection(
null);
253 $result = $this->syncManager->createSection($section, $sectionContext);
259 $result = $this->syncManager->createSection($section, $sectionContext);
287 $mainResult =
new Result();
292 if ($link = $this->getSectionLink($section))
294 $sectionContext->setSectionConnection($link);
295 if ($link->isActive())
297 $result = $this->syncManager->updateSection($section, $sectionContext);
300 $resultData[
'updated'] = $link;
304 $resultData[
'error'] = $link;
309 $resultData[
'skipped'] = $link;
312 elseif ($section->getExternalType() !==
Core\
Section\Section::LOCAL_EXTERNAL_TYPE)
314 $resultData[
'skipped'] = $section;
318 $result = $this->syncManager->createSection($section, $sectionContext);
319 if (!empty(
$result->getData()[
'sectionConnection']))
321 $resultData[
'exported'] =
$result->getData()[
'sectionConnection'];
325 $result->addError(
new Error(
'Error of export section'));
326 $resultData[
'section'] = $section;
330 $mainResult->setData($resultData);
334 $mainResult->addError(
new Error($exception->getMessage()));
351 private function fetchSections(
array $exclude = []): Generator
353 $sectionList = SectionTable::getList([
355 '=CAL_TYPE' => $this->connection->getOwner()->getType(),
356 'OWNER_ID' => $this->connection->getOwner()->getId(),
357 'EXTERNAL_TYPE' => [
'local', $this->connection->getVendor()->getCode()],
364 while ($sectionDM = $sectionList->fetchObject())
366 $section = $mapper->getByEntityObject($sectionDM);
380 private function getSectionLink(\
Bitrix\
Calendar\
Core\Section\Section $section): ?SectionConnection
383 $map = $mapper->getMap([
384 '=SECTION_ID' => $section->getId(),
385 '=CONNECTION_ID' => $this->connection->getId(),
388 return match (
$map->count())
399 private function getFactory(): FactoryInterface
401 return $this->factory;
414 private function fetchSectionEvents(Core\Section\Section $section,
array $excludeEventIds = []): Generator
416 $timestamp = time() - self::TIME_SLICE;
417 $eventList = EventTable::getList([
424 '=SECTION_ID' => $section->getId(),
426 '!ID' => $excludeEventIds,
427 '>DATE_TO_TS_UTC' => $timestamp,
428 '!=MEETING_STATUS' =>
'N',
433 EventConnectionTable::class,
435 '=this.ID' =>
'ref.EVENT_ID',
436 'ref.CONNECTION_ID' => [
'?', $this->connection->getId()],
438 [
'join_type' =>
'LEFT']
441 ])->fetchCollection();
443 $eventList = $this->prepareEvents($eventList);
445 foreach ($eventList as $eventPack)
451 private function prepareEvents(EO_Event_Collection $events):
array
455 foreach ($events as
$event)
459 $recId =
$event->getParentId();
460 $result[$recId][
'type'] =
'recurrence';
463 else if (
$event->getRecurrenceId())
485 private function getEventLink(EO_Event $eventEntity): ?EventConnection
488 if ($link = $eventEntity->get(
'LINK'))
490 $link->setEvent($eventEntity);
492 return $this->mapperFactory->getEventConnection()->getByEntityObject($link);
509 private function exportEvent(
array $eventPack, SectionConnection $sectionLink): Result
511 if (!empty($eventPack[
'master']))
513 return $this->exportRecurrenceEvent($sectionLink, $eventPack);
516 if (!empty($eventPack[
'event']))
518 return $this->exportSimpleEvent($sectionLink, $eventPack[
'event']);
521 return (
new Result())->addError(
new Error(
'Unsupported eventpack format'));
538 $mainResult =
new Result();
539 if ($this->syncManager->canSubscribeSection())
542 $subscription = $pushManager->getPush(
546 if ($subscription && !$subscription->isExpired())
548 $result = $this->syncManager->renewPush($subscription);
551 $mainResult = $pushManager->renewPush($subscription,
$result->getData());
555 $mainResult->addError(
new Error(
'Error of renew subscription.'));
556 $mainResult->addErrors(
$result->getErrors());
561 $subscribeResult = $this->syncManager->subscribeSection($link);
562 if ($subscribeResult->isSuccess())
566 $pushManager->renewPush($subscription, $subscribeResult->getData());
572 $pushManager->addPush(
573 'SECTION_CONNECTION',
575 $subscribeResult->getData()
581 $e->getCode() === 400
596 $mainResult->addError(
new Error(
'Error of add subscription.'));
597 $mainResult->addErrors($subscribeResult->getErrors());
613 $mainResult =
new Result();
614 if ($this->syncManager->canSubscribeConnection())
617 $subscription = $pushManager->getPush(
619 $this->connection->getId()
622 if ($subscription && !$subscription->isExpired())
624 $result = $this->syncManager->renewPush($subscription);
627 $mainResult = $pushManager->renewPush($subscription,
$result->getData());
631 $mainResult->addError(
new Error(
'Error of renew subscription.'));
632 $mainResult->addErrors(
$result->getErrors());
637 $subscribeResult = $this->syncManager->subscribeConnection();
638 if ($subscribeResult->isSuccess())
640 if ($subscription !==
null)
642 $pushManager->renewPush($subscription, $subscribeResult->getData());
646 $pushManager->addPush(
648 $this->connection->getId(),
649 $subscribeResult->getData()
655 $mainResult->addError(
new Error(
'Error of add subscription.'));
656 $mainResult->addErrors($subscribeResult->getErrors());
674 if ($link->getConnection()->getId() && $link->getSection()->getId())
677 DELETE FROM b_calendar_event_connection
678 WHERE CONNECTION_ID = " . (
int)$link->getConnection()->getId() .
"
679 AND EVENT_ID IN (SELECT EV.ID FROM b_calendar_event EV
680 WHERE EV.SECTION_ID = " . (
int)$link->getSection()->getId() .
");"
686 SectionConnectionTable::delete($link->getId());
701 private function exportSimpleEvent(SectionConnection $sectionLink, EO_Event $eventData): Result
705 $context->add(
'sync',
'sectionLink', $sectionLink);
707 $event = $this->mapperFactory->getEvent()->getByEntityObject($eventData);
709 $eventLink = $this->getEventLink($eventData);
710 $eventContext = (
new EventContext())
712 ->setSectionConnection($sectionLink)
713 ->setEventConnection($eventLink)
716 if ($eventLink && !$eventLink->getVendorEventId())
718 $this->mapperFactory->getEventConnection()->delete($eventLink);
724 $resultUpdate = $this->syncManager->updateEvent(
$event, $eventContext);
726 'entityType' =>
'link',
727 'entity' => $eventLink,
728 'action' =>
'updated',
730 if (!$resultUpdate->isSuccess())
732 $result->addErrors($resultUpdate->getErrors());
737 $resultAdd = $this->syncManager->createEvent(
$event, $eventContext);
739 'entityType' =>
'link',
740 'action' =>
'exported',
742 if ($resultAdd->isSuccess())
744 if (!empty($resultAdd->getData()[
'eventConnectionId']))
746 $resultData[
'entity'] = $this->mapperFactory->getEventConnection()
747 ->getById($resultAdd->getData()[
'eventConnectionId'])
752 $resultData[
'entity'] = $this->mapperFactory->getEventConnection()->getMap([
753 '=EVENT_ID' =>
$event->getId(),
754 '=CONNECTION_ID' => $sectionLink->getConnection()->getId(),
761 'entityType' =>
'errorLink',
762 'action' =>
'exported',
764 $result->addErrors($resultAdd->getErrors());
768 return $result->setData($resultData);
778 private function exportRecurrenceEvent(SectionConnection $sectionLink,
array $eventData): Result
781 $context->setSectionConnection($sectionLink);
783 $recurrenceEvent = $this->buildRecurrenceEvent($eventData);
785 if ($recurrenceEvent->getEventConnection())
787 $context->setEventConnection($recurrenceEvent->getEventConnection());
788 $result = $this->syncManager->updateRecurrence($recurrenceEvent,
$context);
792 $result = $this->syncManager->createRecurrence($recurrenceEvent,
$context);
796 'entityType' =>
'link',
797 'action' =>
'updated',
800 return $result->setData($resultData);
809 private function buildRecurrenceEvent(
array $eventData): SyncEvent
811 $masterEvent = $this->mapperFactory->getEvent()->getByEntityObject($eventData[
'master']);
812 $masterLink = $this->getEventLink($eventData[
'master']);
813 $masterSyncEvent = (
new SyncEvent())
814 ->setEvent($masterEvent)
815 ->setEventConnection($masterLink)
817 if ($masterSyncEvent->getEventConnection() && !$masterSyncEvent->getEventConnection()->getVendorEventId())
819 $this->mapperFactory->getEventConnection()->delete($masterSyncEvent->getEventConnection());
820 $masterSyncEvent->setEventConnection(
null);
823 $instancesCollection =
new InstanceMap();
824 $instances = $eventData[
'instances'] ?? [];
827 $instanceEvent = $this->mapperFactory->getEvent()->getByEntityObject(
$instance);
828 $instanceLink = $this->getEventLink(
$instance);
829 $instanceSyncEvent = (
new SyncEvent())
830 ->setEvent($instanceEvent)
831 ->setEventConnection($instanceLink)
834 if ($instanceSyncEvent->getEventConnection() && !$instanceSyncEvent->getEventConnection()->getVendorEventId())
836 $this->mapperFactory->getEventConnection()->delete($instanceSyncEvent->getEventConnection());
837 $instanceSyncEvent->setEventConnection(
null);
839 $instancesCollection->add($instanceSyncEvent);
842 $masterSyncEvent->setInstanceMap($instancesCollection);
844 return $masterSyncEvent;
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)