![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/mautic.corals.io/app/bundles/IntegrationsBundle/Sync/Helper/ |
<?php declare(strict_types=1); namespace Mautic\IntegrationsBundle\Sync\Helper; use Mautic\IntegrationsBundle\Entity\ObjectMapping; use Mautic\IntegrationsBundle\Entity\ObjectMappingRepository; use Mautic\IntegrationsBundle\Event\InternalObjectFindEvent; use Mautic\IntegrationsBundle\IntegrationEvents; use Mautic\IntegrationsBundle\Sync\DAO\Mapping\MappingManualDAO; use Mautic\IntegrationsBundle\Sync\DAO\Mapping\RemappedObjectDAO; use Mautic\IntegrationsBundle\Sync\DAO\Mapping\UpdatedObjectMappingDAO; use Mautic\IntegrationsBundle\Sync\DAO\Sync\Order\ObjectChangeDAO; use Mautic\IntegrationsBundle\Sync\DAO\Sync\Report\ObjectDAO; use Mautic\IntegrationsBundle\Sync\Exception\FieldNotFoundException; use Mautic\IntegrationsBundle\Sync\Exception\ObjectDeletedException; use Mautic\IntegrationsBundle\Sync\Exception\ObjectNotFoundException; use Mautic\IntegrationsBundle\Sync\Exception\ObjectNotSupportedException; use Mautic\IntegrationsBundle\Sync\SyncDataExchange\Internal\ObjectProvider; use Mautic\IntegrationsBundle\Sync\SyncDataExchange\MauticSyncDataExchange; use Mautic\LeadBundle\Model\FieldModel; use Symfony\Component\EventDispatcher\EventDispatcherInterface; class MappingHelper { public function __construct( private FieldModel $fieldModel, private ObjectMappingRepository $objectMappingRepository, private ObjectProvider $objectProvider, private EventDispatcherInterface $dispatcher ) { } /** * @throws ObjectDeletedException * @throws ObjectNotFoundException * @throws ObjectNotSupportedException */ public function findMauticObject(MappingManualDAO $mappingManualDAO, string $internalObjectName, ObjectDAO $integrationObjectDAO): ObjectDAO { // Check if this contact is already tracked if ($internalObject = $this->objectMappingRepository->getInternalObject( $mappingManualDAO->getIntegration(), $integrationObjectDAO->getObject(), $integrationObjectDAO->getObjectId(), $internalObjectName )) { if ($internalObject['is_deleted']) { throw new ObjectDeletedException(); } return new ObjectDAO( $internalObjectName, $internalObject['internal_object_id'], new \DateTime($internalObject['last_sync_date'], new \DateTimeZone('UTC')) ); } // We don't know who this is so search Mautic $uniqueIdentifierFields = $this->fieldModel->getUniqueIdentifierFields(['object' => $internalObjectName]); $identifiers = []; foreach ($uniqueIdentifierFields as $field => $fieldLabel) { try { $integrationField = $mappingManualDAO->getIntegrationMappedField($integrationObjectDAO->getObject(), $internalObjectName, $field); if ($integrationValue = $integrationObjectDAO->getField($integrationField)) { $identifiers[$field] = $integrationValue->getValue()->getNormalizedValue(); } } catch (FieldNotFoundException) { } } if (empty($identifiers)) { // No fields found to search for contact so return null return new ObjectDAO($internalObjectName, null); } try { $event = new InternalObjectFindEvent( $this->objectProvider->getObjectByName($internalObjectName) ); } catch (ObjectNotFoundException) { // Throw this exception for BC. throw new ObjectNotSupportedException(MauticSyncDataExchange::NAME, $internalObjectName); } $event->setFieldValues($identifiers); $this->dispatcher->dispatch( $event, IntegrationEvents::INTEGRATION_FIND_INTERNAL_RECORDS, ); $foundObjects = $event->getFoundObjects(); if (!$foundObjects) { // No contacts were found return new ObjectDAO($internalObjectName, null); } // Match found! $objectId = $foundObjects[0]['id']; // Let's store the relationship since we know it $objectMapping = new ObjectMapping(); $objectMapping->setLastSyncDate($integrationObjectDAO->getChangeDateTime()) ->setIntegration($mappingManualDAO->getIntegration()) ->setIntegrationObjectName($integrationObjectDAO->getObject()) ->setIntegrationObjectId($integrationObjectDAO->getObjectId()) ->setInternalObjectName($internalObjectName) ->setInternalObjectId($objectId); $this->saveObjectMapping($objectMapping); return new ObjectDAO($internalObjectName, $objectId); } /** * Returns corresponding Mautic entity class name for the given Mautic object. * * @throws ObjectNotSupportedException */ public function getMauticEntityClassName(string $internalObject): string { try { return $this->objectProvider->getObjectByName($internalObject)->getEntityName(); } catch (ObjectNotFoundException) { // Throw this exception instead to keep BC. throw new ObjectNotSupportedException(MauticSyncDataExchange::NAME, $internalObject); } } /** * @throws ObjectDeletedException */ public function findIntegrationObject(string $integration, string $integrationObjectName, ObjectDAO $internalObjectDAO): ObjectDAO { if ($integrationObject = $this->objectMappingRepository->getIntegrationObject( $integration, $internalObjectDAO->getObject(), $internalObjectDAO->getObjectId(), $integrationObjectName )) { if ($integrationObject['is_deleted']) { throw new ObjectDeletedException(); } return new ObjectDAO( $integrationObjectName, $integrationObject['integration_object_id'], new \DateTime($integrationObject['last_sync_date'], new \DateTimeZone('UTC')) ); } return new ObjectDAO($integrationObjectName, null); } /** * @param ObjectMapping[] $mappings */ public function saveObjectMappings(array $mappings): void { foreach ($mappings as $mapping) { $this->saveObjectMapping($mapping); } } public function updateObjectMappings(array $mappings): void { foreach ($mappings as $mapping) { try { $this->updateObjectMapping($mapping); } catch (ObjectNotFoundException) { continue; } } } /** * @param RemappedObjectDAO[] $mappings */ public function remapIntegrationObjects(array $mappings): void { foreach ($mappings as $mapping) { $this->objectMappingRepository->updateIntegrationObject( $mapping->getIntegration(), $mapping->getOldObjectName(), $mapping->getOldObjectId(), $mapping->getNewObjectName(), $mapping->getNewObjectId() ); } } /** * @param ObjectChangeDAO[] $objects */ public function markAsDeleted(array $objects): void { foreach ($objects as $object) { $this->objectMappingRepository->markAsDeleted($object->getIntegration(), $object->getObject(), $object->getObjectId()); } } private function saveObjectMapping(ObjectMapping $objectMapping): void { $this->objectMappingRepository->saveEntity($objectMapping); $this->objectMappingRepository->detachEntity($objectMapping); } /** * @throws ObjectNotFoundException */ private function updateObjectMapping(UpdatedObjectMappingDAO $updatedObjectMappingDAO): void { /** @var ObjectMapping $objectMapping */ $objectMapping = $this->objectMappingRepository->findOneBy( [ 'integration' => $updatedObjectMappingDAO->getIntegration(), 'integrationObjectName' => $updatedObjectMappingDAO->getIntegrationObjectName(), 'integrationObjectId' => $updatedObjectMappingDAO->getIntegrationObjectId(), ] ); if (!$objectMapping) { throw new ObjectNotFoundException($updatedObjectMappingDAO->getIntegrationObjectName().':'.$updatedObjectMappingDAO->getIntegrationObjectId()); } $objectMapping->setLastSyncDate($updatedObjectMappingDAO->getObjectModifiedDate()); $this->saveObjectMapping($objectMapping); // Make the ObjectMapping available to the IntegrationEvents::INTEGRATION_BATCH_SYNC_COMPLETED_* events $updatedObjectMappingDAO->setObjectMapping($objectMapping); } }