From af186a701304368f0ce5fd20f6e48099f99c8e1e Mon Sep 17 00:00:00 2001 From: Clemente Raposo Date: Sat, 2 Jan 2021 20:28:52 +0000 Subject: [PATCH] Add RecordList FilterMappers - Refactor LegacyFilterMapper to allow adding mappers per type - Add date and date time mappers to convert to proper format -- Api should receive fields in internal format -- Legacy search expects user format -- Convert to user format when calling legacy search - Add multienum to correctly process criteria -- Api search criteria receive an array of values -- For other fields legacy expects just one value not an array -- For multienum legacy expects an array of values -- Add mapper to send array of values to legacy for multienums --- config/services.yaml | 8 +++ core/legacy/Data/BaseListDataHandler.php | 2 +- .../FilterMapper/FilterMapperInterface.php | 20 +++++++ .../Data/FilterMapper/FilterMappers.php | 59 ++++++++++++++++++ .../Data/FilterMapper}/LegacyFilterMapper.php | 21 ++++--- .../FilterMapper/Mappers/DateFilterMapper.php | 60 +++++++++++++++++++ .../Mappers/DateTimeFilterMapper.php | 60 +++++++++++++++++++ .../Mappers/DefaultFilterMapper.php | 36 +++++++++++ .../Mappers/MultiEnumFilterMapper.php | 31 ++++++++++ core/legacy/DateTimeHandler.php | 42 +++++++++++++ .../BulkActions/CsvExportBulkAction.php | 2 +- .../Series/LeadByStatusCountTest.php | 10 +++- .../OpportunitiesBySalesStagePipelineTest.php | 7 ++- 13 files changed, 345 insertions(+), 13 deletions(-) create mode 100644 core/legacy/Data/FilterMapper/FilterMapperInterface.php create mode 100644 core/legacy/Data/FilterMapper/FilterMappers.php rename core/{src/Service => legacy/Data/FilterMapper}/LegacyFilterMapper.php (82%) create mode 100644 core/legacy/Data/FilterMapper/Mappers/DateFilterMapper.php create mode 100644 core/legacy/Data/FilterMapper/Mappers/DateTimeFilterMapper.php create mode 100644 core/legacy/Data/FilterMapper/Mappers/DefaultFilterMapper.php create mode 100644 core/legacy/Data/FilterMapper/Mappers/MultiEnumFilterMapper.php diff --git a/config/services.yaml b/config/services.yaml index d282b8b79..3398a1bf8 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -58,6 +58,8 @@ services: tags: [ 'system.config.mapper' ] App\Legacy\Data\PresetListDataHandlerInterface: tags: [ 'app.data.preset.handler' ] + App\Legacy\Data\FilterMapper\FilterMapperInterface: + tags: [ 'app.data.filter.mapper' ] App\Service\StatisticsProviderInterface: tags: [ 'app.data.statistics.handler' ] @@ -149,3 +151,9 @@ services: # and use the value of the 'getKey' method to index the services arguments: - !tagged { tag: 'app.data.statistics.handler', default_index_method: 'getKey' } + + App\Legacy\Data\FilterMapper\FilterMappers: + # inject all services tagged with app.data.filter.mapper as first argument + # and use the value of the 'getType' method to index the services + arguments: + - !tagged { tag: 'app.data.filter.mapper', default_index_method: 'getType' } diff --git a/core/legacy/Data/BaseListDataHandler.php b/core/legacy/Data/BaseListDataHandler.php index a312d68ac..55f49b7f8 100644 --- a/core/legacy/Data/BaseListDataHandler.php +++ b/core/legacy/Data/BaseListDataHandler.php @@ -2,7 +2,7 @@ namespace App\Legacy\Data; -use App\Service\LegacyFilterMapper; +use App\Legacy\Data\FilterMapper\LegacyFilterMapper; use BeanFactory; use InvalidArgumentException; use ListViewDataPort; diff --git a/core/legacy/Data/FilterMapper/FilterMapperInterface.php b/core/legacy/Data/FilterMapper/FilterMapperInterface.php new file mode 100644 index 000000000..f71f5f2d7 --- /dev/null +++ b/core/legacy/Data/FilterMapper/FilterMapperInterface.php @@ -0,0 +1,20 @@ +getType(); + $this->registry[$type] = $handler; + } + + } + + /** + * Get the mapper for field type + * @param string $type + * @return FilterMapperInterface + * @throws ItemNotFoundException + */ + public function get(string $type): FilterMapperInterface + { + + if (empty($this->registry[$type])) { + throw new ItemNotFoundException(self::MSG_HANDLER_NOT_FOUND); + } + + return $this->registry[$type]; + } + + /** + * Has mapper for the given type + * @param string $type + * @return bool + */ + public function hasMapper(string $type): bool + { + return !(empty($this->registry[$type])); + } +} diff --git a/core/src/Service/LegacyFilterMapper.php b/core/legacy/Data/FilterMapper/LegacyFilterMapper.php similarity index 82% rename from core/src/Service/LegacyFilterMapper.php rename to core/legacy/Data/FilterMapper/LegacyFilterMapper.php index a81500d3b..ba1bccba3 100644 --- a/core/src/Service/LegacyFilterMapper.php +++ b/core/legacy/Data/FilterMapper/LegacyFilterMapper.php @@ -1,6 +1,6 @@ filterOperatorMap = $filterOperatorMap; + $this->mappers = $mappers; } /** @@ -74,15 +80,16 @@ class LegacyFilterMapper */ protected function mapFilterValue(string $mappedValue, array $item) { + $fieldType = $item['fieldType'] ?? ''; + + if ($mappedValue === 'values') { - if (count($item['values']) === 1) { - $legacyValue = $item['values'][0]; - } else { - $legacyValue = $item['values']; + if ($this->mappers->hasMapper($fieldType)) { + return $this->mappers->get($fieldType)->mapValue($mappedValue, $item); } - return $legacyValue; + return $this->mappers->get('default')->mapValue($mappedValue, $item); } $operator = $item['operator'] ?? ''; diff --git a/core/legacy/Data/FilterMapper/Mappers/DateFilterMapper.php b/core/legacy/Data/FilterMapper/Mappers/DateFilterMapper.php new file mode 100644 index 000000000..b7a7ea87e --- /dev/null +++ b/core/legacy/Data/FilterMapper/Mappers/DateFilterMapper.php @@ -0,0 +1,60 @@ +dateTimeHandler = $dateTimeHandler; + } + + /** + * @inheritDoc + */ + public function getType(): string + { + return 'date'; + } + + /** + * @inheritDoc + */ + public function mapValue(string $mappedValue, array $criteriaItem) + { + /** @var array */ + $values = $criteriaItem['values'] ?? []; + + if (empty($values)) { + return []; + } + + $mapped = []; + + foreach ($values as $value) { + if (empty($value)) { + continue; + } + $mapped[] = $this->dateTimeHandler->toUserDate($value); + } + + $legacyValue = $mapped; + if (count($mapped) === 1) { + $legacyValue = $mapped[0]; + } + + return $legacyValue; + } +} diff --git a/core/legacy/Data/FilterMapper/Mappers/DateTimeFilterMapper.php b/core/legacy/Data/FilterMapper/Mappers/DateTimeFilterMapper.php new file mode 100644 index 000000000..0da6c11fc --- /dev/null +++ b/core/legacy/Data/FilterMapper/Mappers/DateTimeFilterMapper.php @@ -0,0 +1,60 @@ +dateTimeHandler = $dateTimeHandler; + } + + /** + * @inheritDoc + */ + public function getType(): string + { + return 'datetime'; + } + + /** + * @inheritDoc + */ + public function mapValue(string $mappedValue, array $criteriaItem) + { + /** @var array */ + $values = $criteriaItem['values'] ?? []; + + if (empty($values)) { + return []; + } + + $mapped = []; + + foreach ($values as $value) { + if (empty($value)) { + continue; + } + $mapped[] = $this->dateTimeHandler->toUserDateTime($value); + } + + $legacyValue = $mapped; + if (count($mapped) === 1) { + $legacyValue = $mapped[0]; + } + + return $legacyValue; + } +} diff --git a/core/legacy/Data/FilterMapper/Mappers/DefaultFilterMapper.php b/core/legacy/Data/FilterMapper/Mappers/DefaultFilterMapper.php new file mode 100644 index 000000000..f660168e5 --- /dev/null +++ b/core/legacy/Data/FilterMapper/Mappers/DefaultFilterMapper.php @@ -0,0 +1,36 @@ +datetimeFormatMap); } + + /** + * To user date format + * @param string $dateString + * @return string + */ + public function toUserDate(string $dateString): string + { + return $this->getFormatter()->toUserDate($dateString); + } + + /** + * To user date format + * @param string $dateString + * @return string + */ + public function toUserDateTime(string $dateString): string + { + return $this->getFormatter()->toUserDateTime($dateString); + } + + /** + * @return DateFormatService + */ + protected function getFormatter(): DateFormatService + { + if ($this->formatter !== null) { + return $this->formatter; + } + + /* @noinspection PhpIncludeInspection */ + require_once 'include/portability/Services/DateTime/DateFormatService.php'; + $this->formatter = new DateFormatService(); + + return $this->formatter; + } } diff --git a/core/src/Service/BulkActions/CsvExportBulkAction.php b/core/src/Service/BulkActions/CsvExportBulkAction.php index 502a81d57..579537f12 100644 --- a/core/src/Service/BulkActions/CsvExportBulkAction.php +++ b/core/src/Service/BulkActions/CsvExportBulkAction.php @@ -4,7 +4,7 @@ namespace App\Service\BulkActions; use ApiPlatform\Core\Exception\InvalidArgumentException; use App\Entity\Process; -use App\Service\LegacyFilterMapper; +use App\Legacy\Data\FilterMapper\LegacyFilterMapper; use App\Service\ModuleNameMapperInterface; use App\Service\ProcessHandlerInterface; diff --git a/tests/unit/core/legacy/Statistics/Series/LeadByStatusCountTest.php b/tests/unit/core/legacy/Statistics/Series/LeadByStatusCountTest.php index f00cd299b..a1cede945 100644 --- a/tests/unit/core/legacy/Statistics/Series/LeadByStatusCountTest.php +++ b/tests/unit/core/legacy/Statistics/Series/LeadByStatusCountTest.php @@ -2,16 +2,20 @@ namespace App\Tests\unit\core\legacy\Statistics; +use App\Legacy\Data\FilterMapper\FilterMappers; +use App\Legacy\Data\FilterMapper\LegacyFilterMapper; use App\Legacy\Data\RecordMapper; use App\Legacy\ModuleNameMapperHandler; -use App\Service\LegacyFilterMapper; use App\Tests\_mock\Mock\core\legacy\Data\ListDataQueryHandlerMock; use App\Tests\_mock\Mock\core\legacy\Statistics\Series\LeadsByStatusCountMock; use App\Tests\UnitTester; use BeanFactory; use Codeception\Test\Unit; +use EmptyIterator; use Exception; +; + /** * Class LeadByStatusCountTest * @package App\Tests @@ -124,7 +128,9 @@ class LeadByStatusCountTest extends Unit $legacyScope ); - $legacyFilterMapper = new LegacyFilterMapper([]); + $filterMappers = new FilterMappers(new EmptyIterator()); + + $legacyFilterMapper = new LegacyFilterMapper([], $filterMappers); $recordMapper = new RecordMapper($moduleNameMapper); $queryHandler = new ListDataQueryHandlerMock($legacyFilterMapper, $recordMapper); diff --git a/tests/unit/core/legacy/Statistics/Series/OpportunitiesBySalesStagePipelineTest.php b/tests/unit/core/legacy/Statistics/Series/OpportunitiesBySalesStagePipelineTest.php index 6df80cd3f..58f668386 100644 --- a/tests/unit/core/legacy/Statistics/Series/OpportunitiesBySalesStagePipelineTest.php +++ b/tests/unit/core/legacy/Statistics/Series/OpportunitiesBySalesStagePipelineTest.php @@ -2,14 +2,16 @@ namespace App\Tests\unit\core\legacy\Statistics; +use App\Legacy\Data\FilterMapper\FilterMappers; +use App\Legacy\Data\FilterMapper\LegacyFilterMapper; use App\Legacy\Data\RecordMapper; use App\Legacy\ModuleNameMapperHandler; -use App\Service\LegacyFilterMapper; use App\Tests\_mock\Mock\core\legacy\Data\ListDataQueryHandlerMock; use App\Tests\_mock\Mock\core\legacy\Statistics\Series\OpportunitiesBySalesStagePipelineMock; use App\Tests\UnitTester; use BeanFactory; use Codeception\Test\Unit; +use EmptyIterator; use Exception; /** @@ -48,7 +50,8 @@ class OpportunitiesBySalesStagePipelineTest extends Unit $legacyScope ); - $legacyFilterMapper = new LegacyFilterMapper([]); + $filterMappers = new FilterMappers(new EmptyIterator()); + $legacyFilterMapper = new LegacyFilterMapper([], $filterMappers); $recordMapper = new RecordMapper($moduleNameMapper); $queryHandler = new ListDataQueryHandlerMock($legacyFilterMapper, $recordMapper);