Commit ad5ea686 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Capacité à traiter les réponses d'API au format Solr (refactorisation suite à...

Capacité à traiter les réponses d'API au format Solr (refactorisation suite à l'ajout de la notion de 'response data extractor').
parent 995b48e9
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ Changelog
- Import : possibilité de spécifier des colonnes dont la valeur est calculée (clé 'computed_columns').
- Possibilité de spécifier la liste des attributs/colonnes de la Source dans la config (clé 'columns').
- Possibilité de spécifier un tableau de filtres dans la clé 'column_value_filter' d'une source ou destination (et plus seulement un filtre unique).
- Capacité à traiter les réponses d'API au format Solr (refactorisation suite à l'ajout de la notion de 'response data extractor').
- Source : plus de mise en majuscules systématique de la 'source code column' et des 'columns'.

6.1.1
+8 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ use Doctrine\ORM\Mapping\Driver\XmlDriver;
use Doctrine\Persistence\Mapping\Driver\MappingDriverChain;
use Laminas\Router\Http\Literal;
use Laminas\Router\Http\Segment;
use Laminas\ServiceManager\Factory\InvokableFactory;
use UnicaenAuth\Guard\PrivilegeController;
use UnicaenDbImport\CodeGenerator\HelperAbstractFactory;
use UnicaenDbImport\Config\Config;
@@ -41,6 +42,9 @@ use UnicaenDbImport\Privilege\ObservationPrivilege;
use UnicaenDbImport\Privilege\SynchroPrivilege;
use UnicaenDbImport\Service\Api\ApiService;
use UnicaenDbImport\Service\Api\ApiServiceFactory;
use UnicaenDbImport\Service\Api\Response\DataExtractor\Array\ArrayResponseDataExtractor;
use UnicaenDbImport\Service\Api\Response\DataExtractor\Hal\HalResponseDataExtractor;
use UnicaenDbImport\Service\Api\Response\DataExtractor\Solr\SolrResponseDataExtractor;
use UnicaenDbImport\Service\CodeGenerator\CodeGeneratorPluginManager;
use UnicaenDbImport\Service\CodeGenerator\CodeGeneratorPluginManagerFactory;
use UnicaenDbImport\Service\Database\DatabaseService;
@@ -588,6 +592,10 @@ return [
            ImportLogDatabaseService::class => ImportLogDatabaseServiceFactory::class,
            ApiService::class => ApiServiceFactory::class,

            ArrayResponseDataExtractor::class => InvokableFactory::class,
            HalResponseDataExtractor::class => InvokableFactory::class,
            SolrResponseDataExtractor::class => InvokableFactory::class,

            CodeGeneratorPluginManager::class => CodeGeneratorPluginManagerFactory::class,

            SourceService::class => SourceServiceFactory::class,
+1 −0
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@ return [
            // Format: 'identifiant unique' => 'nom de la connexion Doctrine'
            //
            'default' => 'doctrine.connection.orm_default',
            'apogee' => 'doctrine.connection.orm_apogee',
            //
            // API.
            // Format: 'identifiant unique' => tableau de config Guzzle
+6 −28
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@ use UnicaenApp\Exception\RuntimeException;
use UnicaenDbImport\Connection\ApiConnection;
use UnicaenDbImport\Domain\DestinationInterface;
use UnicaenDbImport\Domain\SourceInterface;
use UnicaenDbImport\Service\Api\Response\DataExtractor\ResponseDataExtractorsAwareTrait;
use UnicaenDbImport\Service\Exception\ApiServiceException;

/**
@@ -25,6 +26,8 @@ use UnicaenDbImport\Service\Exception\ApiServiceException;
class ApiService
{
    use LoggerAwareTrait;
//    use DataNormalizersAwareTrait;
    use ResponseDataExtractorsAwareTrait;

    /**
     * @var array
@@ -148,7 +151,6 @@ class ApiService

        $rows = [];
        $p = 1;
        $knownPageCount = 0;
        do {
            $finalUrl = $url;

@@ -158,18 +160,14 @@ class ApiService
                $params[$pageSizeParam] = $pageSize;
            }
            if (!empty($params)) {
                $sep = strpos($finalUrl, '?') === FALSE ? '?' : '&';
                $sep = !str_contains($finalUrl, '?') ? '?' : '&';
                $finalUrl .= $sep . http_build_query($params);
            }

            $responseData = $this->get($finalUrl);

            // si l'API retourne des données au format HAL, le nombre de pages total est fourni, on prend !
            if (isset($responseData->page_count)) {
                $knownPageCount = $responseData->page_count;
            }

            $data = $this->normalizeResponseData($responseData);
            $knownPageCount = $this->extractDataPageCountFromResponse($responseData);
            $data = $this->extractDataFromResponse($responseData);

            $rows = array_merge($rows, $data);
            $p++;
@@ -192,26 +190,6 @@ class ApiService
        return $rows;
    }

    /**
     * @param array|stdClass $responseData
     * @return array
     */
    private function normalizeResponseData($responseData)
    {
        if (isset($responseData->page_count) && isset($responseData->{'_embedded'})) {
            // HAL
            $toArray = get_object_vars($responseData->{'_embedded'});
            $data = (array) reset($toArray);
            array_walk($data, function(stdClass $obj) {
                unset($obj->_links);
            });

            return $data;
        }

        return $responseData;
    }

    /**
     * @param ApiConnection   $connection
     * @param SourceInterface $source
+13 −2
Original line number Diff line number Diff line
@@ -4,18 +4,29 @@ namespace UnicaenDbImport\Service\Api;

use Psr\Container\ContainerInterface;
use Psr\Log\NullLogger;
use UnicaenDbImport\Service\Api\Response\DataExtractor\Array\ArrayResponseDataExtractor;
use UnicaenDbImport\Service\Api\Response\DataExtractor\Hal\HalResponseDataExtractor;
use UnicaenDbImport\Service\Api\Response\DataExtractor\Solr\SolrResponseDataExtractor;

class ApiServiceFactory
{
    /**
     * @param ContainerInterface $container
     * @return ApiService
     * @throws \Psr\Container\ContainerExceptionInterface
     * @throws \Psr\Container\NotFoundExceptionInterface
     */
    public function __invoke(ContainerInterface $container): ApiService
    {
        $service = new ApiService();
        $service->setLogger(new NullLogger()); // logger par défaut

        // response data extractors (priorisés)
        $halDataExtractor = $container->get(HalResponseDataExtractor::class); /** @var HalResponseDataExtractor $halDataExtractor */
        $solrDataExtractor = $container->get(SolrResponseDataExtractor::class); /** @var SolrResponseDataExtractor $solrDataExtractor */
        $arrayDataExtractor = $container->get(ArrayResponseDataExtractor::class); /** @var ArrayResponseDataExtractor $arrayDataExtractor */
        $service->addResponseDataExtractor($halDataExtractor, 30); // le + prioritaire
        $service->addResponseDataExtractor($solrDataExtractor, 20);
        $service->addResponseDataExtractor($arrayDataExtractor, 10);

        return $service;
    }
}
 No newline at end of file
Loading