1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
vendorsynchronization.php
См. документацию.
1<?php
2
3namespace Bitrix\Calendar\Sync\Managers;
4
5use Bitrix\Calendar\Core;
6use Bitrix\Calendar\Core\Event\Event;
7use Bitrix\Calendar\Core\Section\Section;
8use Bitrix\Calendar\Internals\EventConnectionTable;
9use Bitrix\Calendar\Internals\EventTable;
10use Bitrix\Calendar\Internals\SectionConnectionTable;
11use Bitrix\Calendar\Sync\Connection\Connection;
12use Bitrix\Calendar\Sync\Connection\EventConnection;
13use Bitrix\Calendar\Sync\Connection\SectionConnection;
14use Bitrix\Calendar\Sync\Dictionary;
15use Bitrix\Calendar\Sync\Entities\SyncEvent;
16use Bitrix\Calendar\Sync\Exceptions\NotFoundException;
17use Bitrix\Calendar\Sync\Factories\FactoryInterface;
18use Bitrix\Calendar\Sync\Exceptions\ConflictException;
19use Bitrix\Calendar\Sync\Factories\PushFactoryInterface;
20use Bitrix\Calendar\Sync\Icloud;
21use Bitrix\Calendar\Sync\Push\Push;
22use Bitrix\Calendar\Sync\Util\Context;
23use Bitrix\Calendar\Sync\Util\EventContext;
24use Bitrix\Calendar\Sync\Util\Result;
25use Bitrix\Calendar\Sync\Util\SectionContext;
26use Bitrix\Main\ArgumentException;
27use Bitrix\Main\DI\ServiceLocator;
28use Bitrix\Main\Entity\ReferenceField;
29use Bitrix\Main\Error;
30use Bitrix\Main\ObjectNotFoundException;
31use Bitrix\Main\ObjectPropertyException;
32use Bitrix\Main\SystemException;
33use Bitrix\Main\Type\DateTime;
34use Exception;
35
37{
41 private FactoryInterface $factory;
45 private Core\Mappers\Factory $mapperFactory;
46
52 public function __construct(FactoryInterface $factory)
53 {
54 $this->factory = $factory;
55 $this->mapperFactory = ServiceLocator::getInstance()->get('calendar.service.mappers.factory');
56 }
57
68 public function createEvent(Event $event, EventContext $context): Result
69 {
70 $mainResult = new Result();
71 $data = [];
72 $factory = $this->factory;
73 $manager = $factory->getEventManager();
74
75 $sectionLink = $context->getSectionConnection();
76
77 if (!$sectionLink)
78 {
79 return $mainResult->setData([$factory->getConnection()->getVendor()->getCode() => [
80 'status' => Dictionary::SYNC_STATUS['failed'],
81 'message' => 'Section link not found', // TODO: Localize?
82 ]]);
83 }
84
85 $eventLink = $this->getEventConnection($event)
86 ?? (new EventConnection())
87 ->setEvent($event)
88 ->setConnection($sectionLink->getConnection());
89 if ($sectionLink->isActive())
90 {
91 try
92 {
93 $result = $manager->create($event, $context);
94 if ($result->isSuccess())
95 {
96 $resultData = $result->getData();
98 $eventLink
99 ->setVendorEventId($resultData['event']['id'])
100 ->setEntityTag($resultData['event']['etag'])
101 ->setVendorVersionId($resultData['event']['version'] ?? null)
102 ->setVersion($event->getVersion())
103 ->setLastSyncStatus($status);
104 if (!empty($result->getData()['data']))
105 {
106 $eventLink->setData($result->getData()['data']);
107 }
108 }
109 else
110 {
112 $eventLink->setLastSyncStatus($status);
113 }
114 $syncResult = [
115 'status' => $status,
116 'result' => $result,
117 ];
118 }
119 catch (NotFoundException $e)
120 {
121 // if section was not found on service
122 $sectionLink->setActive(false)->setSyncToken(null)->setPageToken(null);
123 $this->mapperFactory->getSectionConnection()->update($sectionLink);
124 }
125 }
126 // dont change to "else", because active status could change in the if section
127 if (!$sectionLink->isActive())
128 {
130 $eventLink->setLastSyncStatus($status)->setVendorEventId('');
131
132 $syncResult = [
133 'status' => $status,
134 ];
135 }
137 $eventLink = $eventLink->getId()
138 ? $this->mapperFactory->getEventConnection()->update($eventLink)
139 : $this->mapperFactory->getEventConnection()->create($eventLink);
140
141 $syncResult['eventConnectionId'] = $eventLink->getId();
142 $data['result'] = $syncResult;
143
144 return $mainResult->setData($data);
145 }
146
159 {
160 $mainResult = new Result();
161 $resultData = [];
162 $factory = $this->factory;
163 $sectionLink = $context->getSectionConnection();
164
165 if (!$sectionLink)
166 {
167 // TODO: this condition must be checked before call this method
168 $mainResult->addError(new Error('Section connection not found'));
169 return $mainResult;
170 }
171 $manager = $factory->getEventManager();
172 $eventLink = $context->getEventConnection();
173
174 if ($eventLink && $eventLink->getVendorEventId() && $sectionLink->isActive())
175 {
176 if ((int)$eventLink->getEventVersion() !== $event->getVersion())
177 {
178 try
179 {
180 $result = $manager->update($event, $context);
181 if ($result->isSuccess())
182 {
183 $status = Dictionary::SYNC_STATUS['success'];
184 $eventLink
185 ->setEntityTag($result->getData()['event']['etag'])
186 ->setVendorVersionId($result->getData()['event']['version'] ?? null)
187 ->setVersion($event->getVersion());
188 }
189 else
190 {
192 }
193 $eventLink->setLastSyncStatus($status);
194
195 $this->mapperFactory->getEventConnection()->update($eventLink);
196 }
197 catch (NotFoundException $e)
198 {
199 $this->mapperFactory->getEventConnection()->delete($eventLink);
200
201 return $this->createEvent($event, $context);
202 }
203 }
204 else
205 {
206 $status = Dictionary::SYNC_STATUS['success'];
207 $eventLink->setLastSyncStatus($status);
208 $this->mapperFactory->getEventConnection()->update($eventLink);
209 }
210
211 }
212 elseif ($eventLink && !$sectionLink->isActive())
213 {
215 $eventLink
216 ->setVersion($event->getVersion())
217 ->setLastSyncStatus($status)
218 ;
219 $this->mapperFactory->getEventConnection()->update($eventLink);
220 }
221 elseif (!$eventLink)
222 {
224 $eventLink = (new EventConnection())
225 ->setEvent($event)
226 ->setConnection($sectionLink->getConnection())
227 ->setLastSyncStatus($status)
228 ->setVersion($event->getVersion())
229 ;
230 $this->mapperFactory->getEventConnection()->create($eventLink);
231 }
232 else
233 {
235 }
236 $resultData[$factory->getConnection()->getVendor()->getCode()] = [
237 'status' => $status,
238 ];
239
240 return $mainResult->setData($resultData);
241 }
242
256 {
257 global $DB;
258 $mainResult = new Result();
259 $resultData = [];
260 $factory = $this->factory;
261 $sectionLink = $context->getSectionConnection();
262
263 if (!$sectionLink)
264 {
265 // TODO: can't be, maybe need log
266 $mainResult->addError(new Error('Section connection not found'));
267 return $mainResult;
268 }
269
270 $manager = $factory->getEventManager();
271 $eventLink = $context->getEventConnection();
272 if ($eventLink && $eventLink->getVendorEventId() && $sectionLink->isActive())
273 {
274 try
275 {
276 $result = $manager->delete($event, $context);
277 if ($result->isSuccess())
278 {
279 if ($event->getRecurringRule())
280 {
281 $childToDelete = [];
282 $childIds = EventConnectionTable::query()
283 ->setSelect(['ID', 'EVENT'])
284 ->where('EVENT.RECURRENCE_ID', $event->getParentId())
285 ->where('EVENT.OWNER_ID', $event->getOwner()->getId())
286 ->exec()
287 ;
288 while ($child = $childIds->fetch())
289 {
290 $childToDelete[] = $child['ID'];
291 }
292 if ($childToDelete)
293 {
294 $DB->Query("DELETE FROM b_calendar_event_connection
295 WHERE ID IN (" . implode(',', $childToDelete) . ")
296 AND CONNECTION_ID = '{$factory->getConnection()->getId()}';
297 ");
298 }
299
300 }
301
302 $status = Dictionary::SYNC_STATUS['success'];
303 $this->mapperFactory->getEventConnection()->delete($eventLink);
304 }
305 else
306 {
308 $eventLink->setLastSyncStatus($status);
309 $this->mapperFactory->getEventConnection()->update($eventLink);
310 }
311 }
312 catch (NotFoundException $e)
313 {
315 $this->mapperFactory->getEventConnection()->delete($eventLink);
316 }
317 }
318 elseif ($eventLink && !$sectionLink->isActive())
319 {
321 $eventLink->setLastSyncStatus($status);
322 $this->mapperFactory->getEventConnection()->update($eventLink);
323 }
324 else
325 {
326 $status = Dictionary::SYNC_STATUS['success'];
327 }
328 $resultData[$factory->getConnection()->getVendor()->getCode()] = [
329 'status' => $status,
330 ];
331
332 return $mainResult->setData($resultData);
333 }
334
346 public function createInstance(Event $event, EventContext $context): Result
347 {
348 $resultData = [];
349 $result = new Result();
350 $factory = $this->factory;
351
352 $sectionLink = $context->getSectionConnection();
353
354 if (!$sectionLink)
355 {
356 $result->addError(new Error('Section connection not found'));
357
358 return $result;
359 }
360
362 if ($masterEvent = $this->getMasterEvent($event))
363 {
364 $manager = $factory->getEventManager();
365 $masterLink = $this->getEventConnection($masterEvent);
366 if ($masterLink === null)
367 {
368 // error of Transition period. This situation is impossible in regular mode.
369 $result->addError(new Error('Series master event does not have connection with vendor'));
370
371 return $result;
372 }
373 $context->setEventConnection($masterLink);
374
375 $result = $manager->createInstance($event, $context);
376
377 if ($result->isSuccess())
378 {
379 $resultData = $result->getData();
380 $status = Dictionary::SYNC_STATUS['success'];
381 if ($factory->getCode() === Icloud\Helper::ACCOUNT_TYPE)
382 {
383 $masterLink
384 ->setVendorEventId($result->getData()['event']['id'])
385 ->setEntityTag($resultData['event']['etag'])
386 ->setLastSyncStatus($status)
387 ->setVersion($masterEvent->getVersion())
388 ;
389 $this->mapperFactory->getEventConnection()->update($masterLink);
390 }
391
392 $eventLink = (new EventConnection())
393 ->setEvent($event)
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)
399 ->setLastSyncStatus($status)
400 ->setVersion($event->getVersion())
401 ;
402 if ($factory->getCode() !== Icloud\Helper::ACCOUNT_TYPE)
403 {
404 $eventLink->setEntityTag($result->getData()['event']['etag'] ?? null);
405 }
406
407 $this->mapperFactory->getEventConnection()->create($eventLink);
408 }
409 else
410 {
412 $masterLink->setLastSyncStatus(Dictionary::SYNC_STATUS['update']);
413 $this->mapperFactory->getEventConnection()->update($masterLink);
414 }
415 }
416 else
417 {
419 $result->addError(new Error('Master event not found'));
420 }
421
422 $resultData[$factory->getConnection()->getVendor()->getCode()] = [
423 'result' => $result,
424 'status' => $status,
425 ];
426
427 return (new Result())->setData($resultData);
428 }
429
442 {
443 $result = new Result();
444 $resultData = [];
445 $factory = $this->factory;
446 $sectionLink = $context->getSectionConnection();
447 $eventLink = $context->getEventConnection();
448 if (!$sectionLink)
449 {
450 $result->addError(new Error('Section connection not found'));
451
452 return $result;
453 }
454 if (!$eventLink)
455 {
456 // Trying to create instance then, there are some broken events onto sync side
457 return $this->createInstance($event, $context);
458 }
459
460 if ($masterEvent = $this->getMasterEvent($event))
461 {
462 $manager = $factory->getEventManager();
463 $masterLink = $this->getEventConnection($masterEvent);
464
465 if ($masterLink === null)
466 {
467 // error of Transition period. This situation is impossible in regular mode.
468 $result->addError(new Error('Series master event does not have connection with vendor'));
469
470 return $result;
471 }
472
474 ->setEventConnection($masterLink)
475 ->add('sync', 'instanceLink', $eventLink)
476 ;
477
478 $result = $manager->updateInstance($event, $context);
479 if ($result->isSuccess())
480 {
481 $status = Dictionary::SYNC_STATUS['success'];
482 $eventLink
483 ->setLastSyncStatus($status)
484 ->setVersion($event->getVersion())
485 ->setVendorVersionId($result->getData()['event']['version'] ?? null)
486 ;
487 if (!empty($result->getData()['event']['id']))
488 {
489 $eventLink->setVendorEventId($result->getData()['event']['id']);
490 }
491 if ($factory->getCode() !== Icloud\Helper::ACCOUNT_TYPE)
492 {
493 $eventLink->setEntityTag($result->getData()['event']['etag'] ?? null);
494 }
495 $this->mapperFactory->getEventConnection()->update($eventLink);
496
497 if ($factory->getCode() === Icloud\Helper::ACCOUNT_TYPE)
498 {
499 $masterLink
500 ->setEntityTag($result->getData()['event']['etag'])
501 ->setLastSyncStatus($status)
502 ->setVersion($masterEvent->getVersion())
503 ;
504 $this->mapperFactory->getEventConnection()->update($masterLink);
505 }
506 }
507 else
508 {
510 $masterLink->setLastSyncStatus(Dictionary::SYNC_STATUS['update']);
511 $this->mapperFactory->getEventConnection()->update($masterLink);
512 }
513 }
514 else
515 {
517 $result->addError(new Error('Master event not found'));
518 }
519
520 $resultData[$factory->getConnection()->getVendor()->getCode()] = [
521 'result' => $result,
522 'status' => $status,
523 ];
524
525 return (new Result())->setData($resultData);
526 }
527
536 {
537 $mainResult = new Result();
538 $result = new Result();
539 $resultData = [];
540 $factory = $this->factory;
541 $excludeDate = $context->sync['excludeDate'] ?? null;
542
543 if (!$excludeDate)
544 {
545 $mainResult->addError(new Error('Not found info about exclude date'));
546 return $mainResult;
547 }
548 $sectionLink = $context->getSectionConnection();
549 $masterLink = $context->getEventConnection();
550
551 if ($masterLink && $sectionLink)
552 {
553 $manager = $factory->getEventManager();
554 $result = $manager->deleteInstance($event, $context);
555 if ($result->isSuccess())
556 {
557 $status = Dictionary::SYNC_STATUS['success'];
558 $masterLink
559 ->setEntityTag($result->getData()['event']['etag'] ?? null)
560 ->setLastSyncStatus($status)
561 ->setVersion($masterLink->getEvent()->getVersion())
562 ;
563 }
564 else
565 {
567 $masterLink->setLastSyncStatus(Dictionary::SYNC_STATUS['update']);
568 }
569
570 $this->mapperFactory->getEventConnection()->update($masterLink);
571 }
572 else
573 {
575 $result->addError(new Error('Link not found'));
576 }
577
578 $resultData[$factory->getConnection()->getVendor()->getCode()] = [
579 'result' => $result,
580 'status' => $status,
581 ];
582
583 return $result->setData($resultData);
584 }
585
593 public function createRecurrence(SyncEvent $recurrenceEvent, EventContext $context): Result
594 {
595 $mainResult = new Result();
596 $resultData = [];
597 $factory = $this->factory;
598 $manager = $factory->getEventManager();
600 $sectionLink = $context->getSectionConnection();
601 if (!$sectionLink)
602 {
603 $mainResult->addError(new Error('Section connection not found'));
604
605 return $mainResult;
606 }
607 $context->add('sync', 'vendorSectionId', $sectionLink->getVendorSectionId());
608
609 $recurrenceEvent->getEvent()->setUid(null);
610
611 $result = $manager->createRecurrence($recurrenceEvent, $sectionLink, $context);
612
613 if ($result->isSuccess())
614 {
615 $masterResult = $this->createEventLink($recurrenceEvent, $this->factory->getConnection()->getId());
616
618 foreach ($recurrenceEvent->getInstanceMap()->getCollection() as $instance)
619 {
620 $instanceResult[] = $this->createEventLink($instance, $this->factory->getConnection()->getId());
621 }
622
623 $status = Dictionary::SYNC_STATUS['success'];
624 }
625
626 else
627 {
629 }
630
631 $resultData[$factory->getConnection()->getVendor()->getCode()] = [
632 'result' => $result,
633 'status' => $status,
634 'linkMasterResult' => $masterResult ?? null,
635 'linkInstancesResult' => $instanceResult ?? null,
636 ];
637
638 return $mainResult->setData($resultData);
639 }
640
648 public function updateRecurrence(SyncEvent $recurrenceEvent, EventContext $context): Result
649 {
650 $mainResult = new Result();
651 $resultData = [];
652 $factory = $this->factory;
653 $manager = $factory->getEventManager();
655 $sectionLink = $context->getSectionConnection();
656 if (!$sectionLink)
657 {
658 return $mainResult->addError(new Error('Section connection not found'));
659
660 }
661 $context->add('sync', 'vendorSectionId', $sectionLink->getVendorSectionId());
662
663 if ($recurrenceEvent->getEventConnection()?->getVendorEventId() === null)
664 {
665 return $mainResult->addError(new Error('Event connection not found'));
666 }
667
668 $recurrenceEvent->getEvent()->setUid(
669 $recurrenceEvent->getEventConnection()?->getVendorEventId()
670 );
671
672 if ((int)$recurrenceEvent->getEventConnection()?->getEventVersion() === $recurrenceEvent->getEvent()->getVersion())
673 {
674 $result = new Result();
675 $result->setData([
676 'event' => [
677 'id' => $recurrenceEvent->getEventConnection()?->getVendorEventId(),
678 'etag' => $recurrenceEvent->getEventConnection()?->getEntityTag(),
679 ],
680 ]);
681 $status = Dictionary::SYNC_STATUS['success'];
682 }
683 else
684 {
685 try
686 {
687 $result = $manager->updateRecurrence($recurrenceEvent, $sectionLink, $context);
688 if ($result->isSuccess())
689 {
690 $masterResult = $this->updateEventLink($recurrenceEvent);
691 $instanceResult = [];
693 foreach ($recurrenceEvent->getInstanceMap()->getCollection() as $instance)
694 {
695 if ($instance->getEventConnection() && $instance->getEventConnection()->getId())
696 {
697 $instanceResult[] = $this->updateEventLink($instance);
698 }
699 else
700 {
701 $instanceResult[] = $this->createEventLink(
702 $instance,
703 $this->factory->getConnection()->getId()
704 );
705 }
706 }
707
708 $status = Dictionary::SYNC_STATUS['success'];
709 }
710 else
711 {
713 }
714 }
715 catch (NotFoundException $e)
716 {
717 $recurrenceEvent->getEvent()->setUid(null);
718
719 return $this->createRecurrence($recurrenceEvent, $context);
720 }
721 }
722
723 $resultData[$factory->getConnection()->getVendor()->getCode()] = [
724 'result' => $result,
725 'status' => $status,
726 'linkMasterResult' => $masterResult ?? null,
727 'linkInstancesResult' => $instanceResult ?? null,
728 ];
729
730 return $mainResult->setData($resultData);
731 }
732
746 {
747 $mainResult = new Result();
748 $resultData = [];
749 $factory = $this->factory;
750 $manager = $factory->getSectionManager();
751 $context->add('sync', 'connection', $factory->getConnection());
752
753 if ($sectionLink = $context->getSectionConnection())
754 {
755 $resultData['sectionConnection'] = $sectionLink;
757 // TODO: what to do?
758 }
759 else
760 {
761 $safeCreate = static function (Section $section, SectionContext $context) use ($manager)
762 {
763 $result = new Result();
764 $counter = 0;
765 $originalName = $section->getName();
766 do
767 {
768 try
769 {
770 $result = $manager->create($section, $context);
771 $success = true;
772 }
773 catch (ConflictException $e)
774 {
775 $counter++;
776 $section->setName($originalName . " ($counter)");
777 $success = false;
778 }
779 }
780 while (!$success);
781
782 $section->setName($originalName);
783
784 return $result;
785 };
786
787 $result = $safeCreate($section, $context);
788 if ($result->isSuccess())
789 {
790 $status = Dictionary::SYNC_STATUS['success'];
791 $sectionLink = (new SectionConnection())
792 ->setSection($section)
793 ->setConnection($factory->getConnection())
794 ->setVendorSectionId($result->getData()['id'])
795 ->setVersionId($result->getData()['version'])
796 ->setActive(true)
797 ->setLastSyncStatus($status)
798 ->setLastSyncDate(new Core\Base\Date())
799 ;
800 $this->mapperFactory->getSectionConnection()->create($sectionLink);
801
802 $resultData['sectionConnection'] = $sectionLink;
803 }
804 else
805 {
806 $mainResult->addErrors($result->getErrors());
808 }
809 }
810
811 $resultData[$factory->getConnection()->getVendor()->getCode()] = [
812 'status' => $status,
813 ];
814
815 return $mainResult->setData($resultData);
816 }
817
827 {
828 $mainResult = new Result();
829 $result = new Result();
830 $factory = $this->factory;
831
832 if ($sectionLink = $context->getSectionConnection())
833 {
834 $manager = $factory->getSectionManager();
835 if ($sectionLink->isActive())
836 {
837 try
838 {
839 $result = $manager->update($section, $context);
840 if ($result->isSuccess())
841 {
842 $status = Dictionary::SYNC_STATUS['success'];
843 $sectionLink->setVersionId($result->getData()['version']);
844 }
845 else
846 {
848 $mainResult->addErrors($result->getErrors());
849 }
850 }
851 catch (NotFoundException $e)
852 {
853 $sectionLink->setActive(false);
854 $status = Dictionary::SYNC_STATUS['inactive'];
855 }
856
857 $sectionLink
858 ->setLastSyncStatus($status)
859 ->setLastSyncDate(new Core\Base\Date());
860 $this->mapperFactory->getSectionConnection()->update($sectionLink);
861 }
862 else
863 {
864 $status = Dictionary::SYNC_STATUS['inactive'];
865 }
866 }
867 else
868 {
870 // TODO: think, what to do in this case. Call the creation or throw exception
871 }
872
873 $resultData = [
874 $factory->getConnection()->getVendor()->getCode() => [
875 'status' => $status,
876 ],
877 'error' => $result->getData()['error'] ?? '',
878 ];
879
880 return $mainResult->setData($resultData);
881 }
882
890 {
891 $mainResult = new Result();
892 $resultData = [];
893 $factory = $this->factory;
894 $manager = $factory->getSectionManager();
895
896 if (($sectionLink = $context->getSectionConnection()) && $sectionLink->isActive())
897 {
898 $sectionLink->setSection($section);
899 $result = $manager->delete($section, $context);
900 if ($result->isSuccess())
901 {
902 $status = Dictionary::SYNC_STATUS['success'];
903 }
904 else
905 {
907 $mainResult->addErrors($result->getErrors());
908 $sectionLink
909 ->setLastSyncStatus($status)
910 ->setLastSyncDate(new Core\Base\Date())
911 ;
912 $this->mapperFactory->getSectionConnection()->update($sectionLink);
913 }
914 }
915 else
916 {
918 }
919
920 $resultData[$factory->getConnection()->getVendor()->getCode()] = [
921 'status' => $status,
922 ];
923
924 return $mainResult->setData($resultData);
925 }
926
940 public function upEventVersion(Event $event, Connection $connection, string $version)
941 {
942 $link = EventConnectionTable::query()
943 ->setSelect(['ID'])
944 ->addFilter('CONNECTION_ID', $connection->getId())
945 ->addFilter('EVENT_ID', $event->getId())
946 ->exec()
947 ->fetchObject()
948 ;
949
950 if ($link)
951 {
952 EventConnectionTable::update($link->getId(), [
953 'fields' => [
954 'VERSION' => $version,
955 ],
956 ]);
957 }
958 }
959
963 public function canSubscribeSection(): bool
964 {
965 return $this->factory->canSubscribeSection();
966 }
967
971 public function canSubscribeConnection(): bool
972 {
973 return $this->factory->canSubscribeConnection();
974 }
975
982 {
983 return $this->factory->getPushManager()->addSectionPush($link);
984 }
985
989 public function subscribeConnection(): Result
990 {
991 return $this->factory->getPushManager()->addConnectionPush($this->factory->getConnection());
992 }
993
999 public function renewPush(Push $push): Result
1000 {
1001 if ($manager = $this->factory->getPushManager())
1002 {
1003 return $manager->renewPush($push);
1004 }
1005
1006 return (new Result())->addError(new Error('Push manager for service not found', 404));
1007 }
1008
1014 public function unsubscribeSection(Push $push): Result
1015 {
1016 return $this->factory->getPushManager()->deletePush($push);
1017 }
1018
1024 public function unsubscribeConnection(Push $push): Result
1025 {
1026 return $this->factory->getPushManager()->deletePush($push);
1027 }
1028
1037 private function getEventConnection(Event $event): ?EventConnection
1038 {
1039 return $this->mapperFactory->getEventConnection()->getMap([
1040 '=EVENT_ID' => $event->getId(),
1041 '=CONNECTION_ID' => $this->factory->getConnection()->getId(),
1042 ])->fetch();
1043 }
1044
1053 private function getMasterEvent(Event $event): ?Event
1054 {
1055 return $this->mapperFactory->getEvent()->getMap([
1056 '=PARENT_ID' => $event->getRecurrenceId(),
1057 '=OWNER_ID' => $event->getOwner()->getId(),
1058 ])->fetch();
1059 }
1060
1068 private function createEventLink(SyncEvent $syncEvent, int $connectionId): \Bitrix\Main\ORM\Data\AddResult
1069 {
1070 // TODO: change to mapper->create;
1071 // $this->mapperFactory->getEventConnection()->create();
1072 return EventConnectionTable::add([
1073 'EVENT_ID' => $syncEvent->getEvent()->getId(),
1074 'CONNECTION_ID' => $connectionId,
1075 'VENDOR_EVENT_ID' => $syncEvent->getEventConnection()
1076 ? $syncEvent->getEventConnection()->getVendorEventId()
1077 : null
1078 ,
1079 'SYNC_STATUS' => Dictionary::SYNC_STATUS['success'],
1080 'VERSION' => $syncEvent->getEvent()->getVersion(),
1081 'ENTITY_TAG' => $syncEvent->getEventConnection()
1082 ? $syncEvent->getEventConnection()->getEntityTag()
1083 : null
1084 ,
1085 ]);
1086 }
1087
1094 private function updateEventLink(SyncEvent $syncEvent): Result
1095 {
1096 $newLink = $this->mapperFactory->getEventConnection()->update($syncEvent->getEventConnection());
1097
1098 return (new Result())->setData(['eventConnection' => $newLink]);
1099 }
1100}
$connection
Определения actionsdefinitions.php:38
getMap($filter, int $limit=null, array $order=null)
Определения mapper.php:207
const SYNC_STATUS
Определения dictionary.php:16
upEventVersion(Event $event, Connection $connection, string $version)
Определения vendorsynchronization.php:940
updateEvent(Event $event, EventContext $context)
Определения vendorsynchronization.php:158
updateSection(Section $section, SectionContext $context)
Определения vendorsynchronization.php:826
createSection(Section $section, SectionContext $context)
Определения vendorsynchronization.php:745
deleteSection(Section $section, SectionContext $context)
Определения vendorsynchronization.php:889
__construct(FactoryInterface $factory)
Определения vendorsynchronization.php:52
updateInstance(Event $event, EventContext $context)
Определения vendorsynchronization.php:441
deleteInstance(Event $event, EventContext $context)
Определения vendorsynchronization.php:535
deleteEvent(Event $event, EventContext $context)
Определения vendorsynchronization.php:255
Определения error.php:15
Определения event.php:5
addError(Error $error)
Определения result.php:50
Определения date.php:9
$data['IS_AVAILABLE']
Определения .description.php:13
$result
Определения get_property_values.php:14
global $DB
Определения cron_frame.php:29
$context
Определения csv_new_setup.php:223
$success
Определения mail_entry.php:69
$status
Определения session.php:10
Определения aliases.php:105
trait Error
Определения error.php:11
$manager
Определения office365push.php:39
$counter
Определения options.php:5
$event
Определения prolog_after.php:141
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
$instance
Определения ps_b24_final.php:14