Loading CHANGELOG.md +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading config/module.config.php +8 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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, Loading config/unicaen-db-import.local.php.dist +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading src/UnicaenDbImport/Service/Api/ApiService.php +6 −28 Original line number Diff line number Diff line Loading @@ -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; /** Loading @@ -25,6 +26,8 @@ use UnicaenDbImport\Service\Exception\ApiServiceException; class ApiService { use LoggerAwareTrait; // use DataNormalizersAwareTrait; use ResponseDataExtractorsAwareTrait; /** * @var array Loading Loading @@ -148,7 +151,6 @@ class ApiService $rows = []; $p = 1; $knownPageCount = 0; do { $finalUrl = $url; Loading @@ -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++; Loading @@ -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 Loading src/UnicaenDbImport/Service/Api/ApiServiceFactory.php +13 −2 Original line number Diff line number Diff line Loading @@ -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
CHANGELOG.md +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
config/module.config.php +8 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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, Loading
config/unicaen-db-import.local.php.dist +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
src/UnicaenDbImport/Service/Api/ApiService.php +6 −28 Original line number Diff line number Diff line Loading @@ -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; /** Loading @@ -25,6 +26,8 @@ use UnicaenDbImport\Service\Exception\ApiServiceException; class ApiService { use LoggerAwareTrait; // use DataNormalizersAwareTrait; use ResponseDataExtractorsAwareTrait; /** * @var array Loading Loading @@ -148,7 +151,6 @@ class ApiService $rows = []; $p = 1; $knownPageCount = 0; do { $finalUrl = $url; Loading @@ -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++; Loading @@ -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 Loading
src/UnicaenDbImport/Service/Api/ApiServiceFactory.php +13 −2 Original line number Diff line number Diff line Loading @@ -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