Commit 252871ab authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

Exemples !

parent fc44ce7e
Loading
Loading
Loading
Loading
Loading
+9 −5
Changes for Module.php: 9 added lines, 5 removed lines.
Original line number Diff line number Diff line
@@ -2,10 +2,12 @@

namespace UnicaenDbImportExemple;

use Laminas\Config\Factory as ConfigFactory;
use Laminas\Http\Request as HttpRequest;
use Laminas\Mvc\ModuleRouteListener;
use Laminas\Mvc\MvcEvent;
use Laminas\Stdlib\ArrayUtils;
use Laminas\Stdlib\Glob;

class Module
{
@@ -27,14 +29,16 @@ class Module
        );
    }


    
    public function getConfig(): array
    {
        return ArrayUtils::merge(
            include_once __DIR__ . '/config/module.config.php',
            include_once __DIR__ . '/config/db-import.global.config.php',
            include_once __DIR__ . '/config/db-import.local.config.php',
            true
        $paths = array_merge(
            [__DIR__ . '/config/module.config.php'],
            Glob::glob(__DIR__ . '/config/exemples/{,*.}{config}.php', Glob::GLOB_BRACE)
        );

        return ConfigFactory::fromFiles($paths);
    }

    public function getAutoloaderConfig(): array
+264 −0
Changes for config/exemples/import_api.config.php: 264 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php

namespace Application;

use Doctrine\DBAL\Driver\PDO\PgSQL\Driver;
use UnicaenDbImport\Domain\Import;
use UnicaenDbImport\Entity\Db\Source;
use UnicaenDbImport\Filter\ColumnValue\ConcatColumnValueFilter;
use UnicaenDbImport\Filter\ColumnValue\SameColumnValueFilter;
use UnicaenDbImport\Privilege\ImportPrivilege;
use UnicaenDbImport\Privilege\LogPrivilege;
use UnicaenDbImport\Privilege\ObservationPrivilege;
use UnicaenDbImport\Privilege\SynchroPrivilege;

return [
    'import' => [
        'imports' => [
            [
                // Nom unique de l'import.
                'name' => "exemple_import_api_region",

                // Nom de la classe de l'import, si besoin. Par défaut : \UnicaenDbImport\Domain\Import.
                //'class' => Import::class,

                // Eventuel nom de la config de base que cette config étend.
                //'extends' => 'default_config',

                'source' => [
                    // Nom unique de la source
                    'name' => 'API api.geo.gouv.fr',

                    // Code unique de la source
                    'code' => 'api_geo',

                    // Identifiant de la connexion à l'API source (cf. clé 'connections' plus haut)
                    'connection' => 'api_geo',

                    // 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)
                    //'page_size'          => 20,

                    // Liste exhaustive éventuelle des seuls attributs/colonnes qui nous intéressent dans la source.
                    // Si la clé est absente, tous les attributs/colonnes sont pris en compte.
                    'columns' => ['nom', 'code'],

                    // Liste éventuelle des colonnes/attributs dont la valeur est calculée.
                    // Tableau associatif de services ou de classes implémentant obligatoirement l'interface
                    // {@see \UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface} dont chaque clé est
                    // le nom de la colonne.
                    // Valeurs possibles pour chaque valeur associée à un nom de colonne :
                    // - string : nom de la colonne dont on veut reprendre la valeur (duplication) ;
                    // - tableau associatif spécifiant le filtre et paramètres de génération de la valeur.
                    //'computed_columns' => [
                    //    'sourceCode' => 'code', // la colonne calculée 'sourceCode' aura la même valeur que la colonne 'code'
                    //    //['name' => SameColumnValueFilter::class, 'params' => ['column' => 'nomUsuel', 'source_column' => 'nomPatronymique']],
                    //    //['name' => ConcatColumnValueFilter::class, 'params' => ['column' => 'libelleLong', 'columns' => ['code','libelleLong']]],
                    //    //['name' => ConcatColumnValueFilter::class, 'params' => ['column' => 'libelleLong', 'columns' => ['code',': ','libelleLong'], 'separator' => '']],
                    //],

                    // Filtres à appliquer pour transformer des valeurs de colonnes/attributs issues de la source
                    // en nouvelles valeurs de colonnes destination.
                    // Tableau ordonné de services ou de classes implémentant obligatoirement l'interface
                    // {@see \UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface}.
                    'column_value_filter' => [
                        // ['name' => ToLowercaseColumnValueFilter::class, 'params' => ['column' => 'code']],
                        // ['name' => SameColumnValueFilter::class, 'params' => ['column' => 'nomUsuel', 'source_column' => 'nomPatronymique']],
                    ],

                    // Spécification du filtre à utiliser pour transformer chaque nom de colonne/attribut source en
                    // le nom de la colonne dans la table destination. Valeurs possibles :
                    // - array : un filtre de type `\UnicaenDbImport\Filter\ColumnName\ArrayMapColumnNameFilter`
                    // sera instancié avec ce tableau de correspondance comme mapping ;
                    // - string : service ou classe de filtre à instancier,
                    // implémentant {@see \UnicaenDbImport\Filter\ColumnName\ColumnNameFilterInterface} ;
                    // NB : par défaut, `\UnicaenDbImport\Filter\ColumnName\DefaultColumnNameFilter::class`
                    // est utilisé.
                    'column_name_filter' => \UnicaenDbImport\Filter\ColumnName\DefaultColumnNameFilter::class,

                    // Nom de l'attribut/colonne dans les données source, contenant l'identifiant unique discriminant.
                    // NB : en cas de transformation de nom de colonne/attribut (clé 'column_name_filter'), c'est le
                    // nom transformé qu'il faut utiliser ici.
                    'source_code_column' => 'code',
                ],

                'destination' => [
                    // Nom unique de la destination
                    'name' => 'Table region',

                    // Identifiant de la connexion à la bdd destination (cf. clé 'connections' plus haut)
                    'connection' => 'db_destination',

                    // Nom de la table destination vers laquelle les données sont importées
                    'table' => 'region',

                    // Nom de la colonne dans la table destination contenant l'identifiant unique
                    'source_code_column' => 'code',

                    // Filtres de transformation à appliquer aux valeurs des colonnes destination.
                    // Tableau ordonné de services ou de classes implémentant obligatoirement l'interface
                    // {@see \UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface}.
                    'column_value_filter' => [],

                    // Stratégie à utiliser pour générer les valeurs dans la colonne ID (clé primaire).
                    // Si la stratégie est `'SEQUENCE'`, la séquence spécifiée par 'id_sequence' sera utilisée.
                    // Si la stratégie est `'IDENTITY'`, la valeur de l'ID des données sources sera utilisée.
                    // Si la stratégie est `null`, la colonne de la table destination devra avoir un type auto-incrémenté
                    // pour que l'insertion fonctionne.
                    'id_strategy' => null,

                    // Nom de la séquence permettant de générer les valeurs dans la colonne ID (clé primaire),
                    // dans le cas où la stratégie est 'SEQUENCE'.
                    // Si aucun nom n'est spécifié (`null`), c'est le nom de séquence par défaut qui sera généré et
                    // utilisé (exemple pour une table `region` : 'region_id_seq').
                    'id_sequence' => null,

                    // Forçage éventuel du nom de la table où seront inscrits les logs (créée automatiquement si nécessaire).
                    // En l'absence de ce forçage, le nom de la table sera 'import_log'.
                    'log_table' => 'import_log',
                ],
            ],

            [
                // Nom unique de l'import.
                'name' => "exemple_import_api_departement",

                // Nom de la classe de l'import, si besoin. Par défaut : \UnicaenDbImport\Domain\Import.
                //'class' => Import::class,

                // Eventuel nom de la config de base que cette config étend.
                //'extends' => 'default_config',

                // Configuration de la source de données à importer
                'source' => [
                    // Nom unique de la source
                    'name' => 'API api.geo.gouv.fr',

                    // Code unique de la source
                    'code' => 'api_geo',

                    // Identifiant de la connexion à l'API source (cf. clé 'connections' plus haut)
                    'connection' => 'api_geo',

                    // 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' => '/departements?fields=nom,code,codeRegion',

                    // Taille des pages de données demandée à l'API (si supportée par l'API)
                    //'page_size'          => 20,

                    // Liste exhaustive éventuelle des seuls attributs/colonnes qui nous intéressent dans la source.
                    // Si la clé est absente, tous les attributs/colonnes seront pris en compte, mais dans ce cas attention :
                    // une requête supplémentaire sera systématiquement réalisée pour obtenir la 1ere ligne des données source
                    // afin de découvrir la liste des attributs/colonnes (et cela peut avoir un coût non négligeable dans
                    // le cas d'une API ne supportant pas la paignation).
                    //'columns' => ['nom', 'code', 'codeRegion'],

                    // Liste éventuelle des colonnes/attributs dont la valeur est calculée.
                    // Tableau associatif de services ou de classes implémentant obligatoirement l'interface
                    // {@see \UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface} dont chaque clé est
                    // le nom de la colonne.
                    // Valeurs possibles pour chaque valeur associée à un nom de colonne :
                    // - string : nom de la colonne dont on veut reprendre la valeur (duplication) ;
                    // - tableau associatif spécifiant le filtre et paramètres de génération de la valeur.
                    //'computed_columns' => [
                    //    'sourceCode' => 'code', // la colonne calculée 'sourceCode' aura la même valeur que la colonne 'code'
                    //    //['name' => SameColumnValueFilter::class, 'params' => ['column' => 'nomUsuel', 'source_column' => 'nomPatronymique']],
                    //    //['name' => ConcatColumnValueFilter::class, 'params' => ['column' => 'libelleLong', 'columns' => ['code','libelleLong']]],
                    //    //['name' => ConcatColumnValueFilter::class, 'params' => ['column' => 'libelleLong', 'columns' => ['code',': ','libelleLong'], 'separator' => '']],
                    //],

                    // Filtres à appliquer pour transformer des valeurs de colonnes/attributs issues de la source
                    // en nouvelles valeurs de colonnes destination.
                    // Tableau ordonné de services ou de classes implémentant obligatoirement l'interface
                    // {@see \UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface}.
                    'column_value_filter' => [
                        // ['name' => ToLowercaseColumnValueFilter::class, 'params' => ['column' => 'code']],
                        // ['name' => SameColumnValueFilter::class, 'params' => ['column' => 'nomUsuel', 'source_column' => 'nomPatronymique']],
                    ],

                    // Spécification du filtre à utiliser pour transformer chaque nom de colonne/attribut source en
                    // le nom de la colonne dans la table destination. Valeurs possibles :
                    // - array : un filtre de type `\UnicaenDbImport\Filter\ColumnName\ArrayMapColumnNameFilter`
                    // sera instancié avec ce tableau de correspondance comme mapping ;
                    // - string : service ou classe de filtre à instancier,
                    // implémentant {@see \UnicaenDbImport\Filter\ColumnName\ColumnNameFilterInterface} ;
                    // NB : par défaut, `\UnicaenDbImport\Filter\ColumnName\DefaultColumnNameFilter::class`
                    // est utilisé.
                    'column_name_filter' => \UnicaenDbImport\Filter\ColumnName\DefaultColumnNameFilter::class,

                    // Nom de l'attribut ou colonne discriminant·e dans les données source, contenant l'identifiant unique.
                    // NB : en cas de transformation de nom de colonne/attributs (clé 'column_name_filter'), c'est le
                    // nom transformé qu'il faut utiliser ici.
                    'source_code_column' => 'code',
                ],

                // Configuration de la destination des données importées
                'destination' => [
                    // Nom unique de la destination
                    'name' => 'Table tmp_departement',

                    // Identifiant de la connexion à la bdd destination (cf. clé 'connections' plus haut)
                    'connection' => 'db_destination',

                    // Nom de la table destination vers laquelle les données sont importées
                    'table' => 'tmp_departement',

                    // Nom de la colonne dans la table destination contenant l'identifiant unique
                    'source_code_column' => 'code',

                    // Filtres de transformation à appliquer aux valeurs des colonnes destination.
                    // Tableau ordonné de services ou de classes implémentant obligatoirement l'interface
                    // {@see \UnicaenDbImport\Filter\ColumnValue\ColumnValueFilterInterface}.
                    'column_value_filter' => [],

                    // Stratégie à utiliser pour générer les valeurs dans la colonne ID (clé primaire).
                    // Si la stratégie est `'SEQUENCE'`, la séquence spécifiée par 'id_sequence' sera utilisée.
                    // Si la stratégie est `'IDENTITY'`, la valeur de l'ID des données sources sera utilisée.
                    // Si la stratégie est `null`, la colonne de la table destination devra avoir un type auto-incrémenté
                    // pour que l'insertion fonctionne.
                    'id_strategy' => null,

                    // Nom de la séquence permettant de générer les valeurs dans la colonne ID (clé primaire),
                    // dans le cas où la stratégie est 'SEQUENCE'.
                    // Si aucun nom n'est spécifié (`null`), c'est le nom de séquence par défaut qui sera généré et
                    // utilisé (exemple pour une table `departement` : 'departement_id_seq').
                    'id_sequence' => null,

                    // Forçage éventuel du nom de la table où seront inscrits les logs (créée automatiquement si nécessaire).
                    // En l'absence de ce forçage, le nom de la table sera 'import_log'.
                    'log_table' => 'import_log',
                ],
            ],
        ],
    ],
];
 No newline at end of file
+88 −0
Changes for config/exemples/import_autre_bdd.config.php: 88 added lines, 0 removed lines.
Original line number Diff line number Diff line
<?php

namespace Application;

use Doctrine\DBAL\Driver\PDO\PgSQL\Driver;
use UnicaenDbImport\Domain\Import;
use UnicaenDbImport\Entity\Db\Source;
use UnicaenDbImport\Filter\ColumnValue\ConcatColumnValueFilter;
use UnicaenDbImport\Filter\ColumnValue\SameColumnValueFilter;
use UnicaenDbImport\Privilege\ImportPrivilege;
use UnicaenDbImport\Privilege\LogPrivilege;
use UnicaenDbImport\Privilege\ObservationPrivilege;
use UnicaenDbImport\Privilege\SynchroPrivilege;

return [
    'import' => [
        'imports' => [
            [
                // Nom unique de l'import.
                'name' => "exemple_import_pays",

                // Nom de la classe de l'import, si besoin. Par défaut : \UnicaenDbImport\Domain\Import.
                //'class' => Import::class,

                // Eventuel nom de la config de base que cette config étend.
                //'extends' => 'default_config',

                // Configuration de la source de données à importer
                'source' => [
                    // Nom unique de la source
                    'name' => 'Table pays',

                    // Code unique de la source
                    'code' => 'db_source',

                    // Identifiant de la connexion à la bdd source (cf. clé 'connections' plus haut)
                    'connection' => 'db_source',

                    // Select SQL de mise en forme des données source à importer (NB: antinomique avec 'table')
                    'select' => "select /*code_iso,*/ code_iso_alpha3, /*code_iso_alpha2,*/ libelle, libelle_iso, libelle_nationalite from pays",

                    // Nom de la table source contenant les données à importer
                    //'table' => 'PAYS', // Équivalent de SELECT * FROM PAYS;

                    // Nom de l'attribut ou colonne discriminant·e dans les données source, contenant l'identifiant unique.
                    // NB : en cas de transformation de nom de colonne/attributs (clé 'column_name_filter'), c'est le
                    // nom transformé qu'il faut utiliser ici.
                    'source_code_column' => 'code_iso_alpha3',

                    // Filtre SQL éventuel à appliquer aux données sources.
                    //'where' => "libelle_nationalite is not null",
                ],

                // Configuration de la destination des données importées
                'destination' => [
                    // Nom unique de la destination
                    'name' => 'Table pays',

                    // Identifiant de la connexion à la bdd destination (cf. clé 'connections' plus haut)
                    'connection' => 'db_destination',

                    // Nom de la table destination vers laquelle les données sont importées
                    'table' => 'pays',

                    // Nom de la colonne dans la table destination contenant l'identifiant unique
                    'source_code_column' => 'code_iso_alpha3',

                    // Stratégie à utiliser pour générer les valeurs dans la colonne ID (clé primaire).
                    // Si la stratégie est `'SEQUENCE'`, la séquence spécifiée par 'id_sequence' sera utilisée.
                    // Si la stratégie est `'IDENTITY'`, la valeur de l'ID des données sources sera utilisée.
                    // Si la stratégie est `null`, la colonne de la table destination devra avoir un type auto-incrémenté
                    // pour que l'insertion fonctionne.
                    'id_strategy' => null,

                    // Nom de la séquence permettant de générer les valeurs dans la colonne ID (clé primaire),
                    // dans le cas où la stratégie est 'SEQUENCE'.
                    // Si aucun nom n'est spécifié (`null`), c'est le nom de séquence par défaut qui sera généré et
                    // utilisé (exemple pour une table `region` : 'region_id_seq').
                    'id_sequence' => null,

                    // Forçage éventuel du nom de la table où seront inscrits les logs (créée automatiquement si nécessaire).
                    // En l'absence de ce forçage, le nom de la table sera 'import_log'.
                    'log_table' => 'import_log',
                ],
            ],
        ],
    ],
];
 No newline at end of file
+138 −0

File added.

Preview size limit exceeded, changes collapsed.

+140 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading