165 lines
5.4 KiB
PHP
Executable File
165 lines
5.4 KiB
PHP
Executable File
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Mautic\IntegrationsBundle\Helper;
|
|
|
|
use Mautic\IntegrationsBundle\Exception\InvalidFormOptionException;
|
|
use Mautic\IntegrationsBundle\Integration\Interfaces\ConfigFormSyncInterface;
|
|
use Mautic\IntegrationsBundle\Mapping\MappedFieldInfoInterface;
|
|
use Mautic\IntegrationsBundle\Sync\DAO\Mapping\ObjectMappingDAO;
|
|
|
|
class FieldMergerHelper
|
|
{
|
|
/**
|
|
* @var MappedFieldInfoInterface[]
|
|
*/
|
|
private ?array $allFields = null;
|
|
|
|
public function __construct(
|
|
private ConfigFormSyncInterface $integrationObject,
|
|
private array $currentFieldMappings,
|
|
) {
|
|
}
|
|
|
|
/**
|
|
* @throws InvalidFormOptionException
|
|
*/
|
|
public function mergeSyncFieldMapping(string $object, array $updatedFieldMappings): void
|
|
{
|
|
$this->allFields = $this->integrationObject->getAllFieldsForMapping($object);
|
|
|
|
$this->removeNonExistentFieldMappings($object);
|
|
|
|
$this->bindUpdatedFieldMappings($object, $updatedFieldMappings);
|
|
}
|
|
|
|
public function getFieldMappings(): array
|
|
{
|
|
return $this->currentFieldMappings;
|
|
}
|
|
|
|
private function removeNonExistentFieldMappings(string $object): void
|
|
{
|
|
if (!isset($this->currentFieldMappings[$object])) {
|
|
$this->currentFieldMappings[$object] = [];
|
|
}
|
|
|
|
// Remove any fields that no longer exist
|
|
$this->currentFieldMappings[$object] = array_intersect_key($this->currentFieldMappings[$object], $this->allFields);
|
|
}
|
|
|
|
/**
|
|
* @throws InvalidFormOptionException
|
|
*/
|
|
private function bindUpdatedFieldMappings(string $object, array $updatedFieldMappings): void
|
|
{
|
|
// Merge updated fields into current fields
|
|
foreach ($updatedFieldMappings as $fieldName => $fieldMapping) {
|
|
if (!isset($this->allFields[$fieldName])) {
|
|
// Ignore as this field doesn't exist
|
|
continue;
|
|
}
|
|
|
|
if (isset($this->currentFieldMappings[$object][$fieldName]) && !$fieldMapping) {
|
|
// Mapping was deleted
|
|
unset($this->currentFieldMappings[$object][$fieldName]);
|
|
|
|
continue;
|
|
}
|
|
|
|
if (isset($this->currentFieldMappings[$object][$fieldName])) {
|
|
// Merge the data
|
|
$this->currentFieldMappings[$object][$fieldName] = [
|
|
'mappedField' => $this->getMergedMappedField($fieldMapping, $object, $fieldName),
|
|
'syncDirection' => $this->getMergedSyncDirection($fieldMapping, $object, $fieldName),
|
|
];
|
|
|
|
continue;
|
|
}
|
|
|
|
if (empty($fieldMapping['mappedField'])) {
|
|
// Ignore this one because just direction was updated without a mapped field
|
|
|
|
continue;
|
|
}
|
|
|
|
if (empty($fieldMapping['syncDirection'])) {
|
|
$fieldMapping['syncDirection'] = $this->getDefaultSyncDirection($object, $fieldName);
|
|
}
|
|
|
|
$this->currentFieldMappings[$object][$fieldName] = $fieldMapping;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @throws InvalidFormOptionException
|
|
*/
|
|
private function getDefaultSyncDirection(string $object, string $fieldName): string
|
|
{
|
|
$supportedDirections = $this->getSupportedSyncDirections($fieldName);
|
|
|
|
if (!empty($this->currentFieldMappings[$object][$fieldName]['syncDirection'])
|
|
&& in_array(
|
|
$this->currentFieldMappings[$object][$fieldName]['syncDirection'],
|
|
$supportedDirections
|
|
)) {
|
|
// Keep the already configured value
|
|
return $this->currentFieldMappings[$object][$fieldName]['syncDirection'];
|
|
}
|
|
|
|
return reset($supportedDirections);
|
|
}
|
|
|
|
/**
|
|
* @throws InvalidFormOptionException
|
|
*/
|
|
private function getSupportedSyncDirections(string $fieldName): array
|
|
{
|
|
$field = $this->allFields[$fieldName];
|
|
$supportedDirections = [];
|
|
|
|
if ($field->isBidirectionalSyncEnabled()) {
|
|
$supportedDirections[] = ObjectMappingDAO::SYNC_BIDIRECTIONALLY;
|
|
}
|
|
|
|
if ($field->isToIntegrationSyncEnabled()) {
|
|
$supportedDirections[] = ObjectMappingDAO::SYNC_TO_INTEGRATION;
|
|
}
|
|
|
|
if ($field->isToMauticSyncEnabled()) {
|
|
$supportedDirections[] = ObjectMappingDAO::SYNC_TO_MAUTIC;
|
|
}
|
|
|
|
if (empty($supportedDirections)) {
|
|
throw new InvalidFormOptionException('field "'.$field->getName().'" must allow at least 1 direction for sync');
|
|
}
|
|
|
|
return $supportedDirections;
|
|
}
|
|
|
|
private function getMergedSyncDirection(array $fieldMapping, string $object, string $fieldName): string
|
|
{
|
|
if (empty($fieldMapping['syncDirection'])) {
|
|
return $this->getDefaultSyncDirection($object, $fieldName);
|
|
}
|
|
|
|
$supportedDirections = $this->getSupportedSyncDirections($fieldName);
|
|
if (in_array($fieldMapping['syncDirection'], $supportedDirections)) {
|
|
return $fieldMapping['syncDirection'];
|
|
}
|
|
|
|
return reset($supportedDirections);
|
|
}
|
|
|
|
private function getMergedMappedField(array $fieldMapping, string $object, string $fieldName): string
|
|
{
|
|
if (empty($fieldMapping['mappedField'])) {
|
|
// Updating just the sync direction so return original value
|
|
return $this->currentFieldMappings[$object][$fieldName]['mappedField'];
|
|
}
|
|
|
|
return $fieldMapping['mappedField'];
|
|
}
|
|
}
|