Commit 8926ada6 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Extraction d'un trait ColumnValueFilterConfigFactoryTrait permettant de...

Extraction d'un trait ColumnValueFilterConfigFactoryTrait permettant de configurer des filtres de colonnes pour autre chose qu'un import.
parent 4b23a5a9
Loading
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
Changelog
=========

7.2.1
-----
- Extraction d'un trait ColumnValueFilterConfigFactoryTrait permettant de configurer des filtres de colonnes pour autre chose qu'un import. 

7.2.0
-----
- Suppression de la dépendance avec unicaen/app, et avec laminas/laminas-dependency-plugin.
+84 −0
Original line number Diff line number Diff line
<?php

namespace UnicaenDbImport\Config;

use Assert\Assertion;
use Assert\AssertionFailedException;
use Psr\Container\ContainerInterface;
use UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface;
use UnicaenDbImport\Filter\ColumnValue\SameColumnValueFilter;

trait ColumnValueFilterConfigFactoryTrait
{
    /**
     * Instancie les éventuels {@see ColumnValueFilterInterface} spécifiés dans la config, dans la clé de config spécifié.
     * Un {@see ContainerInterface} doit être fourni pour obtenir les éventuels filtres spécifiés via un nom de service.
     *
     * @return \UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface[]
     *
     * @throws \Psr\Container\ContainerExceptionInterface
     * @throws \Psr\Container\NotFoundExceptionInterface
     * @throws \UnicaenDbImport\Config\ConfigException
     */
    protected function getColumnValueFilters(array              $sourceConfig,
                                             string             $key,
                                             ContainerInterface $container): array
    {
        $columnValueFilter = $sourceConfig[$key] ?? [];

        $filterInstances = [];
        foreach ((array)$columnValueFilter as $nameOrIndex => $spec) {
            try {
                $filterInstance = $this->getColumnValueFilter($spec, $container);
            } catch (ConfigException $e) {
                throw ConfigException::invalidValueForKey($key, null, $e);
            }
            if ($filterInstance === NULL) {
                throw ConfigException::invalidValueForKey($key);
            }
            $filterInstances[$nameOrIndex] = $filterInstance;
        }

        return $filterInstances;
    }

    /**
     * @throws \Psr\Container\NotFoundExceptionInterface
     * @throws \Psr\Container\ContainerExceptionInterface
     * @throws \UnicaenDbImport\Config\ConfigException
     */
    protected function getColumnValueFilter(ColumnValueFilterInterface|string|array $spec,
                                            ContainerInterface                      $container): ?ColumnValueFilterInterface
    {
        $filterInstance = NULL;

        if (is_array($spec)) {
            try {
                Assertion::keyExists($spec, $key = 'name');
            } catch (AssertionFailedException $e) {
                throw ConfigException::missingKey($key);
            }
            $filterInstance = $this->getColumnValueFilter($spec[$key], $container);
            $filterParams = $spec['params'] ?? [];
            $filterInstance->setParams($filterParams);
        } elseif (is_string($spec)) {
            if ($container->has($spec)) {
                $filterInstance = $container->get($spec);
                if (!$filterInstance instanceof ColumnValueFilterInterface) {
                    throw ConfigException::invalidValue($spec, "service implémentant " . ColumnValueFilterInterface::class);
                }
            } elseif (class_exists($spec)) {
                $filterInstance = new $spec();
                if (!$filterInstance instanceof ColumnValueFilterInterface) {
                    throw ConfigException::invalidValue($spec, "instance de type " . ColumnValueFilterInterface::class);
                }
            } else {
                $filterInstance = new SameColumnValueFilter(['column' => $spec]);
            }
        } elseif ($spec instanceof ColumnValueFilterInterface) {
            $filterInstance = $spec;
        }

        return $filterInstance;
    }
}
 No newline at end of file
+6 −61
Original line number Diff line number Diff line
@@ -13,11 +13,11 @@ use UnicaenDbImport\Domain\Source;
use UnicaenDbImport\Domain\Synchro;
use UnicaenDbImport\Filter\ColumnName\ArrayMapColumnNameFilter;
use UnicaenDbImport\Filter\ColumnName\ColumnNameFilterInterface;
use UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface;
use UnicaenDbImport\Filter\ColumnValue\SameColumnValueFilter;

class ConfigFactory
{
    use ColumnValueFilterConfigFactoryTrait;

    const CONFIG_ROOT_KEY = 'import';

    /**
@@ -320,8 +320,8 @@ class ConfigFactory
        $connectionName = $sourceConfig['connection'];
        $sourceConfig['connection'] = $this->getConnectionByName($connectionName);

        $sourceConfig['computed_columns'] = $this->getColumnValueFilterInstances($sourceConfig, 'computed_columns');
        $sourceConfig['column_value_filter'] = $this->getColumnValueFilterInstances($sourceConfig, 'column_value_filter');
        $sourceConfig['computed_columns'] = $this->getColumnValueFilterInstances($sourceConfig, 'computed_columns', $this->container);
        $sourceConfig['column_value_filter'] = $this->getColumnValueFilterInstances($sourceConfig, 'column_value_filter', $this->container);

        $columnNameFilter = $sourceConfig['column_name_filter'] ?? null;
        if ($columnNameFilter !== null) {
@@ -343,7 +343,7 @@ class ConfigFactory
        $connectionName = $destinationConfig['connection'];
        $destinationConfig['connection'] = $this->getConnectionByName($connectionName);

        $destinationConfig['column_value_filter'] = $this->getColumnValueFilterInstances($destinationConfig, 'column_value_filter');
        $destinationConfig['column_value_filter'] = $this->getColumnValueFilterInstances($destinationConfig, 'column_value_filter', $this->container);

        return Destination::fromConfig($destinationConfig);
    }
@@ -522,61 +522,6 @@ class ConfigFactory
     */
    private function getColumnValueFilterInstances(array $sourceConfig, string $key): array
    {
        $columnValueFilter = $sourceConfig[$key] ?? [];

        $filterInstances = [];
        foreach ((array) $columnValueFilter as $nameOrIndex => $spec) {
            try {
                $filterInstance = $this->getFilterInstance($spec);
            } catch (ConfigException $e) {
                throw ConfigException::invalidValueForKey($key, null, $e);
            }
            if ($filterInstance === NULL) {
                throw ConfigException::invalidValueForKey($key);
            }
            $filterInstances[$nameOrIndex] = $filterInstance;
        }

        return $filterInstances;
    }

    /**
     * @param string|ColumnValueFilterInterface $spec
     * @throws \Psr\Container\ContainerExceptionInterface
     * @throws \Psr\Container\NotFoundExceptionInterface
     * @throws \UnicaenDbImport\Config\ConfigException
     */
    private function getFilterInstance($spec): ?ColumnValueFilterInterface
    {
        $filterInstance = NULL;

        if (is_array($spec)) {
            try {
                Assertion::keyExists($spec, $key = 'name');
            } catch (AssertionFailedException $e) {
                throw ConfigException::missingKey($key);
            }
            $filterInstance = $this->getFilterInstance($spec[$key]);
            $filterParams = $spec['params'] ?? [];
            $filterInstance->setParams($filterParams);
        } elseif (is_string($spec)) {
            if ($this->container->has($spec)) {
                $filterInstance = $this->container->get($spec);
                if (!$filterInstance instanceof ColumnValueFilterInterface) {
                    throw ConfigException::invalidValue($spec, "service implémentant " . ColumnValueFilterInterface::class);
                }
            } elseif (class_exists($spec)) {
                $filterInstance = new $spec;
                if (!$filterInstance instanceof ColumnValueFilterInterface) {
                    throw ConfigException::invalidValue($spec, "instance de type " . ColumnValueFilterInterface::class);
                }
            } else {
                $filterInstance = new SameColumnValueFilter(['column' => $spec]);
            }
        } elseif ($spec instanceof ColumnValueFilterInterface) {
            $filterInstance = $spec;
        }

        return $filterInstance;
        return $this->getColumnValueFilters($sourceConfig, $key, $this->container);
    }
}
 No newline at end of file