Add support for default mappers in RecordMapperRunner

This commit is contained in:
Clemente Raposo 2024-11-21 12:20:48 +00:00 committed by Jack Anderson
parent ca7479fff1
commit cc3bbd8e08
9 changed files with 180 additions and 48 deletions

View file

@ -39,6 +39,12 @@ interface BaseFieldMapperInterface extends BaseModuleMapperInterface
*/ */
public function getField(): string; public function getField(): string;
/**
* Set if mapper overrides type default
* @return bool
*/
public function replaceDefaultTypeMapper(): bool;
/** /**
* Map value to internal format * Map value to internal format
* @param Record $record * @param Record $record

View file

@ -28,8 +28,6 @@
namespace App\Data\Service\Record\Mappers; namespace App\Data\Service\Record\Mappers;
use Traversable;
class BaseFieldMapperRegistry class BaseFieldMapperRegistry
{ {
use RecordFieldMapperTrait; use RecordFieldMapperTrait;
@ -40,19 +38,26 @@ class BaseFieldMapperRegistry
protected array $registry = []; protected array $registry = [];
/** /**
* RecordLevelMapperInterface constructor. * @var BaseFieldMapperInterface[]
* @param Traversable $mappers
*/ */
public function __construct(Traversable $mappers) protected array $defaultMappers = [];
/**
* @var BaseFieldMapperInterface[]
*/
protected array $existingTypeDefaultOverrides = [];
/**
* RecordLevelMapperInterface constructor.
* @param BaseFieldMapperInterface[] $mappers
*/
public function __construct(array $mappers)
{ {
/**
* @var $mappers BaseFieldMapperInterface[]
*/
$this->addMappers($mappers); $this->addMappers($mappers);
} }
/** /**
* Get the field type mappers for the module and type * Get the field mappers for the module, field and mode
* @param string $module * @param string $module
* @param string $field * @param string $field
* @param string|null $mode * @param string|null $mode
@ -65,6 +70,42 @@ class BaseFieldMapperRegistry
return $this->filterMappersByModes($mappers, $mode); return $this->filterMappersByModes($mappers, $mode);
} }
/**
* Get default mapper for module, field and mode
* @param string $module
* @param string $field
* @param string $mode
* @return BaseFieldMapperInterface|null
*/
public function getDefaultMapper(string $module, string $field, string $mode): ?BaseFieldMapperInterface
{
$moduleDefault = $this->defaultMappers[$module . '-' . $field . '-' . $mode] ?? null;
if ($moduleDefault !== null) {
return $moduleDefault;
}
return $this->defaultMappers['default' . '-' . $field . '-' . $mode] ?? null;
}
/**
* Get default mapper for module, field and mode
* @param string $module
* @param string $field
* @param string $mode
* @return BaseFieldMapperInterface|null
*/
public function getTypeDefaultOverride(string $module, string $field, string $mode): ?BaseFieldMapperInterface
{
$moduleDefault = $this->existingTypeDefaultOverrides[$module . '-' . $field . '-' . $mode] ?? null;
if ($moduleDefault !== null) {
return $moduleDefault;
}
return $this->existingTypeDefaultOverrides['default' . '-' . $field . '-' . $mode] ?? null;
}
/** /**
* @param BaseFieldMapperInterface[] $mappers * @param BaseFieldMapperInterface[] $mappers
* @return void * @return void
@ -76,6 +117,21 @@ class BaseFieldMapperRegistry
$module = $handler->getModule() ?? ''; $module = $handler->getModule() ?? '';
$order = $handler->getOrder() ?? 0; $order = $handler->getOrder() ?? 0;
$moduleMappers = $this->registry[$module] ?? []; $moduleMappers = $this->registry[$module] ?? [];
$key = $handler->getKey();
if ($handler->replaceDefaultTypeMapper()) {
$key = 'default';
foreach ($handler->getModes() as $mode) {
$this->existingTypeDefaultOverrides[$module . '-' . $field . '-' . $mode] = $handler;
}
}
if ($key === 'default') {
foreach ($handler->getModes() as $mode) {
$this->defaultMappers[$module . '-' . $field . '-' . $mode] = $handler;
}
continue;
}
$this->addMapper($moduleMappers, $field, $order, $handler); $this->addMapper($moduleMappers, $field, $order, $handler);

View file

@ -34,6 +34,13 @@ class BaseFieldMapperRegistryFactory
{ {
public static function create(Traversable $mappers): BaseFieldMapperRegistry public static function create(Traversable $mappers): BaseFieldMapperRegistry
{ {
return new BaseFieldMapperRegistry($mappers); /**
* @var $mappers BaseFieldMapperInterface[]
*/
$parsed = [];
foreach ($mappers as $mapper) {
$parsed[] = $mapper;
}
return new BaseFieldMapperRegistry($parsed);
} }
} }

View file

@ -28,8 +28,6 @@
namespace App\Data\Service\Record\Mappers; namespace App\Data\Service\Record\Mappers;
use Traversable;
class BaseFieldTypeMapperRegistry class BaseFieldTypeMapperRegistry
{ {
use RecordFieldMapperTrait; use RecordFieldMapperTrait;
@ -40,14 +38,16 @@ class BaseFieldTypeMapperRegistry
protected array $registry = []; protected array $registry = [];
/** /**
* BaseFieldTypeMapperRegistry constructor. * @var BaseFieldTypeMapperInterface[]
* @param Traversable $mappers
*/ */
public function __construct(Traversable $mappers) protected array $defaultMappers = [];
/**
* BaseFieldTypeMapperRegistry constructor.
* @param BaseFieldTypeMapperInterface[] $mappers
*/
public function __construct(array $mappers)
{ {
/**
* @var $mappers BaseFieldTypeMapperInterface[]
*/
$this->addMappers($mappers); $this->addMappers($mappers);
} }
@ -65,6 +65,24 @@ class BaseFieldTypeMapperRegistry
return $this->filterMappersByModes($mappers, $mode); return $this->filterMappersByModes($mappers, $mode);
} }
/**
* Get default mapper for module, field and mode
* @param string $module
* @param string $fieldType
* @param string $mode
* @return BaseFieldTypeMapperInterface|null
*/
public function getDefaultMapper(string $module, string $fieldType, string $mode): ?BaseFieldTypeMapperInterface
{
$moduleDefault = $this->defaultMappers[$module . '-' . $fieldType . '-' . $mode] ?? null;
if ($moduleDefault !== null) {
return $moduleDefault;
}
return $this->defaultMappers['default' . '-' . $fieldType . '-' . $mode] ?? null;
}
/** /**
* @param BaseFieldTypeMapperInterface[] $mappers * @param BaseFieldTypeMapperInterface[] $mappers
@ -73,12 +91,20 @@ class BaseFieldTypeMapperRegistry
protected function addMappers(iterable $mappers): void protected function addMappers(iterable $mappers): void
{ {
foreach ($mappers as $handler) { foreach ($mappers as $handler) {
$field = $handler->getFieldType(); $fieldType = $handler->getFieldType();
$module = $handler->getModule(); $module = $handler->getModule();
$order = $handler->getOrder() ?? 0; $order = $handler->getOrder() ?? 0;
$moduleMappers = $this->registry[$module] ?? []; $moduleMappers = $this->registry[$module] ?? [];
$key = $handler->getKey();
$this->addMapper($moduleMappers, $field, $order, $handler); if ($key === 'default') {
foreach ($handler->getModes() as $mode) {
$this->defaultMappers[$module . '-' . $fieldType . '-' . $mode] = $handler;
}
continue;
}
$this->addMapper($moduleMappers, $fieldType, $order, $handler);
$this->registry[$module] = $moduleMappers; $this->registry[$module] = $moduleMappers;
} }

View file

@ -34,6 +34,13 @@ class BaseFieldTypeMapperRegistryFactory
{ {
public static function create(Traversable $mappers): BaseFieldTypeMapperRegistry public static function create(Traversable $mappers): BaseFieldTypeMapperRegistry
{ {
return new BaseFieldTypeMapperRegistry($mappers); /**
* @var $mappers BaseFieldTypeMapperInterface[]
*/
$parsed = [];
foreach ($mappers as $mapper) {
$parsed[] = $mapper;
}
return new BaseFieldTypeMapperRegistry($parsed);
} }
} }

View file

@ -28,7 +28,6 @@
namespace App\Data\Service\Record\Mappers; namespace App\Data\Service\Record\Mappers;
use Traversable;
class BaseRecordMapperRegistry class BaseRecordMapperRegistry
{ {
@ -41,21 +40,15 @@ class BaseRecordMapperRegistry
/** /**
* BaseRecordMapperRegistry constructor. * BaseRecordMapperRegistry constructor.
* @param Traversable $mappers * @param BaseRecordMapperInterface[] $mappers
*/ */
public function __construct(Traversable $mappers) public function __construct(array $mappers)
{ {
/**
* @var $mappers BaseRecordMapperInterface[]
*/
$this->addMappers($mappers); $this->addMappers($mappers);
} }
/** /**
* Get the field type mappers for the module and type * Get the mappers for the module and mode
* @param string $module * @param string $module
* @param string|null $mode * @param string|null $mode
* @return BaseRecordMapperInterface[] * @return BaseRecordMapperInterface[]

View file

@ -34,6 +34,14 @@ class BaseRecordMapperRegistryFactory
{ {
public static function create(Traversable $mappers): BaseRecordMapperRegistry public static function create(Traversable $mappers): BaseRecordMapperRegistry
{ {
return new BaseRecordMapperRegistry($mappers); /**
* @var $mappers BaseRecordMapperInterface[]
*/
$parsed = [];
foreach ($mappers as $mapper) {
$parsed[] = $mapper;
}
return new BaseRecordMapperRegistry($parsed);
} }
} }

View file

@ -44,6 +44,20 @@ trait ModuleMapperTrait
$parentMap[$order] = $mappersByOrder; $parentMap[$order] = $mappersByOrder;
} }
/**
* @param array $mapperModes
* @param string $mode
* @return bool
*/
protected function isModeEnabled(array $mapperModes, string $mode): bool
{
$modeEnabled = false;
if (in_array($mode, $mapperModes, true)) {
$modeEnabled = true;
}
return $modeEnabled;
}
/** /**
* @param array $mappers * @param array $mappers
* @param string $mode * @param string $mode
@ -68,19 +82,5 @@ trait ModuleMapperTrait
return $modeMappers; return $modeMappers;
} }
/**
* @param array $mapperModes
* @param string $mode
* @return bool
*/
protected function isModeEnabled(array $mapperModes, string $mode): bool
{
$modeEnabled = false;
if (in_array($mode, $mapperModes, true)) {
$modeEnabled = true;
}
return $modeEnabled;
}
} }

View file

@ -31,7 +31,7 @@ use App\Data\Entity\Record;
use App\FieldDefinitions\Entity\FieldDefinition; use App\FieldDefinitions\Entity\FieldDefinition;
use App\FieldDefinitions\Service\FieldDefinitionsProviderInterface; use App\FieldDefinitions\Service\FieldDefinitionsProviderInterface;
class RecordMapperRunner implements RecordMapperRunnerInterface abstract class RecordMapperRunner implements RecordMapperRunnerInterface
{ {
protected BaseFieldMapperRegistry $fieldMapperRegistry; protected BaseFieldMapperRegistry $fieldMapperRegistry;
protected BaseFieldTypeMapperRegistry $fieldTypeMapperRegistry; protected BaseFieldTypeMapperRegistry $fieldTypeMapperRegistry;
@ -120,17 +120,46 @@ class RecordMapperRunner implements RecordMapperRunnerInterface
): void { ): void {
$fieldVardefs = $vardefs ?? []; $fieldVardefs = $vardefs ?? [];
$type = $fieldVardefs['type'] ?? ''; $type = $fieldVardefs['type'] ?? '';
$fieldMappers = $this->fieldMapperRegistry->getMappers($record->getModule(), $field, $mode);
if ($type !== '') { if ($type !== '') {
$this->runDefaultMapper($record, $type, $mode, $field, $direction, $fieldDefinitions);
$fieldTypeMappers = $this->fieldTypeMapperRegistry->getMappers($record->getModule(), $type, $mode); $fieldTypeMappers = $this->fieldTypeMapperRegistry->getMappers($record->getModule(), $type, $mode);
foreach ($fieldTypeMappers as $fieldTypeMapper) { foreach ($fieldTypeMappers as $fieldTypeMapper) {
$fieldTypeMapper->$direction($record, $fieldDefinitions, $field); $fieldTypeMapper->$direction($record, $fieldDefinitions, $field);
} }
} }
$fieldMappers = $this->fieldMapperRegistry->getMappers($record->getModule(), $field, $mode);
foreach ($fieldMappers as $fieldMapper) { foreach ($fieldMappers as $fieldMapper) {
$fieldMapper->$direction($record, $fieldDefinitions); $fieldMapper->$direction($record, $fieldDefinitions);
} }
} }
/**
* @param Record $record
* @param string $type
* @param string|null $mode
* @param string $field
* @param string $direction
* @param FieldDefinition $fieldDefinitions
* @return void
*/
protected function runDefaultMapper(
Record $record,
string $type,
?string $mode,
string $field,
string $direction,
FieldDefinition $fieldDefinitions
): void {
$default = $this->fieldTypeMapperRegistry->getDefaultMapper($record->getModule(), $type, $mode);
$defaultOverride = $this->fieldMapperRegistry->getTypeDefaultOverride($record->getModule(), $field, $mode);
if ($defaultOverride !== null) {
$defaultOverride->$direction($record, $fieldDefinitions);
} elseif ($default !== null) {
$default->$direction($record, $fieldDefinitions, $field);
}
}
} }