Commit 4c93c6f7 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

WIP renommage clé 'url' en 'select'

parent 61c805ad
Loading
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -70,7 +70,21 @@ return [
                    // Identifiant de la connexion à l'API source (cf. clé 'connections' plus haut)
                    'connection' => 'geo',

                    // Complément de l'URL de l'API permettant l'interrogation des données
                    // URL à concaténer à l'URL de la connexion, permettant l'interrogation des données
                    // Formats d'URL possibles :
                    // - string, ex : '/search/?q=authIdHal_i:123'
                    // - array<string>, ex : ['/search/?q=authIdHal_i:123', '/search/?q=authIdHal_i:789']
                    // - array<array<string>>,
                    //   ex 1 : ```
                    //      [
                    //          ['select' => '/search/?q=authIdHal_i:123'],
                    //          ['select' => '/search/?q=authIdHal_i:789'],
                    //      ]```
                    //   ex 2 (spécification de colonnes valuées à ajouter aux données obtenues) : ```
                    //      [
                    //          ['select' => '/search/?q=authIdHal_i:123', 'columns' => ['hal_id' => '123']],
                    //          ['select' => '/search/?q=authIdHal_i:789', 'columns' => ['hal_id' => '789']],
                    //      ]```
                    'select' => '/regions?fields=nom,code',

                    // Taille des pages de données demandée à l'API (si supportée par l'API)
+0 −4
Original line number Diff line number Diff line
@@ -5,7 +5,6 @@ namespace UnicaenDbImport\Config;
use Assert\Assertion;
use Assert\AssertionFailedException;
use Psr\Container\ContainerInterface;
use SplPriorityQueue;
use UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface;
use UnicaenDbImport\Filter\ColumnValue\SameColumnValueFilter;

@@ -28,7 +27,6 @@ trait ColumnValueFilterConfigFactoryTrait
        $columnValueFilter = $sourceConfig[$key] ?? [];

        $filterInstances = [];
//        $filterInstances = new SplPriorityQueue();
        foreach ((array)$columnValueFilter as $nameOrIndex => $spec) {
            try {
                $filterInstance = $this->getColumnValueFilter($spec, $container);
@@ -39,8 +37,6 @@ trait ColumnValueFilterConfigFactoryTrait
                throw ConfigException::invalidValueForKey($key);
            }
            $filterInstances[$filterInstance->getColumn()] = $filterInstance;
//            $priority = $spec['priority'] ?? 0;
//            $filterInstances->insert($filterInstance, $priority);
        }

        return $filterInstances;
+1 −1
Original line number Diff line number Diff line
@@ -118,7 +118,7 @@ class Source implements SourceInterface
            return '(Generator)';
        } elseif (is_iterable($select)) {
            if ($select[0] ?? null) {
                $url = $select[0]['url'] ?? $select[0];
                $url = $select[0]['select'] ?? $select[0];
                return '[' . $url . ', ...]';
            } else {
                return ":-( ITERABLE VIDE";
+30 −30
Original line number Diff line number Diff line
@@ -111,11 +111,10 @@ class ApiService
        $columnValuesToInject = [];
        foreach ($urls as $url) {
            if (is_array($url)) {
                $urlString = $url['url'];
                $urlString = $url['select'];
                if (array_key_exists('columns', $url)) {
                    $columnValuesToInject = $url['columns'];
                }
                unset($url['url']);
            } else {
                $urlString = $url;
            }
@@ -145,8 +144,7 @@ class ApiService
        $url = $urls[0];

        if (is_array($url)) {
            $urlString = $url['url'];
            unset($url['url']);
            $urlString = $url['select'];
        } else {
            $urlString = $url;
        }
@@ -166,12 +164,14 @@ class ApiService
     *
     * NB : Dès lors que $pageSize > 0, l'interrogation se fait page par page.
     *
     * @param string $url
     * @param integer $pageSize
     * @param int $page
     * @param string $pageSizeParam
     * @param string $pageParam
     * @return stdClass[]
     * @param string $url URL où est envoyée la requête
     * @param int $pageSize Taille de page (i.e. nombre d'enregistrements demandés)
     * @param int $page Numéro de la page demandée
     * @param string $pageSizeParam Nom du paramètre spécifiant la taille de page
     * @param string $pageParam Nom du paramètre spécifiant le numéro de page
     * @param ResponseDataExtractorInterface|null $dataExtractor Eventuel forçage du data extractor à utiliser
     * @param array $columnValuesToInject Eventuelles colonnes valuées à ajouter aus données obtenues
     *
     * @throws \UnicaenDbImport\Service\Exception\ApiServiceException
     */
    protected function callApi(
@@ -217,7 +217,7 @@ class ApiService
            /** @var stdClass[] $data */
            $data = $dataExtractor->extractDataFromResponse($responseData);

            // injection éventuelle de colonnes (avec leurs valeurs)
            // injection éventuelle de colonnes valuées
            if (count($columnValuesToInject) > 0) {
                foreach ($data as $i => $d) {
                    foreach ($columnValuesToInject as $name => $value) {
@@ -251,12 +251,11 @@ class ApiService
    {
        $urlPrefix = $connection->getUrl();

        $selects = $this->normalizedSelect($source);
        $urls = $this->normalizedSelect($source);

        foreach ($selects as $i => $select) {
        foreach ($urls as $i => $select) {
            if (is_array($select)) {
                $selectString = $select['url'];
                unset($select['url']);
                $selectString = $select['select'];
            } else {
                $selectString = $select;
            }
@@ -266,13 +265,13 @@ class ApiService
            $urlString = $urlPrefix . '/' . $selectString;

            if (is_array($select)) {
                $select['url'] = $urlString;
                $select['select'] = $urlString;
            } else {
                $selects[$i] = $selectString;
                $urls[$i] = $selectString;
            }
        }

        return $selects;
        return $urls;
    }

    protected function normalizedSelect(SourceInterface $source): iterable
@@ -283,23 +282,25 @@ class ApiService
            $selects = $select;
            foreach ($selects as $sel) {
                if (is_array($sel)) {
                    Assert::keyExists($sel, 'url', "Clé url non trouvée !");
                } elseif (!is_string($sel)) {
                    throw new RuntimeException(sprintf(
                        "Type de select inattendu pour la source '%s'",
                        $source->getName()
                    Assert::keyExists($sel, 'select', "Clé 'select' non trouvée dans l'URL fournie au format array");
                } else {
                    Assert::string($sel, sprintf(
                        "Un type de select inattendu a été spécifié pour la source '%s' : %s",
                        $source->getName(),
                        is_object($sel) ? get_class($sel) : gettype($sel)
                    ));
                }
            }
            return $select;
        } elseif (is_string($select)) {
            return [$select];
        } else {
            throw new RuntimeException(sprintf(
                "Format inattendu de spécification du/des selects pour la source '%s'",
                $source->getName()
            ));
        }

        throw new InvalidArgumentException(sprintf(
            "Un type de select inattendu a été spécifié pour la source '%s' : %s",
            $source->getName(),
            gettype($select)
        ));
    }

    /**
@@ -315,10 +316,9 @@ class ApiService
    }

    /**
     * @param array $config
     * @throws AssertionFailedException
     */
    private function loadConfig(array $config)
    private function loadConfig(array $config): void
    {
        Assertion::keyIsset($config, 'url');