From 1b08d852478572d16bcc3ed9105f6a1e3c372cfe Mon Sep 17 00:00:00 2001
From: Bertrand Gauthier <bertrand.gauthier@unicaen.fr>
Date: Tue, 15 Oct 2019 17:19:01 +0200
Subject: [PATCH] =?UTF-8?q?V=C3=A9rification=20de=20la=20pr=C3=A9sence/val?=
 =?UTF-8?q?idit=C3=A9=20des=20colonnes=20source=5Fcode,=20source=5Fid=20+?=
 =?UTF-8?q?=20Correction=20de=20la=20validation=20des=20colonnes=20d'histo?=
 =?UTF-8?q?rique.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../CodeGenerator/CodeGenerator.php           | 21 ++++++++++++++
 .../CodeGenerator/CodeGeneratorInterface.php  | 15 ++++++++++
 .../Helper/TableValidationHelper.php          | 29 +++++++++++++++++++
 .../Helper/TableValidationHelper.php          | 23 +++++++++++----
 .../Service/DatabaseService.php               |  8 +++++
 5 files changed, 90 insertions(+), 6 deletions(-)

diff --git a/src/UnicaenDbImport/CodeGenerator/CodeGenerator.php b/src/UnicaenDbImport/CodeGenerator/CodeGenerator.php
index f04fe82..f57e189 100644
--- a/src/UnicaenDbImport/CodeGenerator/CodeGenerator.php
+++ b/src/UnicaenDbImport/CodeGenerator/CodeGenerator.php
@@ -123,6 +123,27 @@ abstract class CodeGenerator implements CodeGeneratorInterface
         return $this->tableValidationHelper->convertHistoColumnsValidationBadResultToException($tableName, $result);
     }
 
+    /**
+     * @param string $tableName
+     * @return string
+     * @codeCoverageIgnore Car simple délégation
+     */
+    public function generateSQLForSourceColumnsValidation($tableName)
+    {
+        return $this->tableValidationHelper->generateSQLForSourceColumnsValidation($tableName);
+    }
+
+    /**
+     * @param string $tableName
+     * @param array  $result
+     * @return null|RuntimeException
+     * @codeCoverageIgnore Car simple délégation
+     */
+    public function convertSourceColumnsValidationBadResultToException($tableName, array $result)
+    {
+        return $this->tableValidationHelper->convertSourceColumnsValidationBadResultToException($tableName, $result);
+    }
+
     /**
      * @param SourceInterface $source
      * @return string
diff --git a/src/UnicaenDbImport/CodeGenerator/CodeGeneratorInterface.php b/src/UnicaenDbImport/CodeGenerator/CodeGeneratorInterface.php
index f5a566b..c4320c5 100644
--- a/src/UnicaenDbImport/CodeGenerator/CodeGeneratorInterface.php
+++ b/src/UnicaenDbImport/CodeGenerator/CodeGeneratorInterface.php
@@ -55,6 +55,21 @@ interface CodeGeneratorInterface
      */
     public function convertHistoColumnsValidationBadResultToException($tableName, array $result);
 
+    /**
+     * @param string $tableName
+     * @return string
+     * @codeCoverageIgnore Car simple délégation
+     */
+    public function generateSQLForSourceColumnsValidation($tableName);
+
+    /**
+     * @param string $tableName
+     * @param array  $result
+     * @return null|RuntimeException
+     * @codeCoverageIgnore Car simple délégation
+     */
+    public function convertSourceColumnsValidationBadResultToException($tableName, array $result);
+
     /**
      * @param SourceInterface $source
      * @return string
diff --git a/src/UnicaenDbImport/CodeGenerator/Helper/TableValidationHelper.php b/src/UnicaenDbImport/CodeGenerator/Helper/TableValidationHelper.php
index 721d640..37fdfb6 100644
--- a/src/UnicaenDbImport/CodeGenerator/Helper/TableValidationHelper.php
+++ b/src/UnicaenDbImport/CodeGenerator/Helper/TableValidationHelper.php
@@ -60,6 +60,12 @@ abstract class TableValidationHelper extends Helper
      */
     abstract public function generateSQLForHistoColumnsValidation($tableName);
 
+    /**
+     * @param string $tableName
+     * @return string
+     */
+    abstract public function generateSQLForSourceColumnsValidation($tableName);
+
     /**
      * @param string $tableName
      * @param array $result
@@ -79,6 +85,29 @@ abstract class TableValidationHelper extends Helper
 ALTER TABLE $tableName ADD created_on $timestamp DEFAULT $now NOT NULL ;
 ALTER TABLE $tableName ADD updated_on $timestamp ;
 ALTER TABLE $tableName ADD deleted_on $timestamp ;
+EOT;
+
+        return new RuntimeException($message);
+    }
+
+    /**
+     * @param string $tableName
+     * @param array $result
+     * @return null|RuntimeException
+     */
+    public function convertSourceColumnsValidationBadResultToException($tableName, array $result)
+    {
+        if (count($result) === 2) {
+            return null;
+        }
+
+        $integer = $this->platform->getIntegerTypeDeclarationSQL([]);
+        $varchar = $this->platform->getVarcharTypeDeclarationSQL([]);
+
+        $message = "Assurez-vous que les colonnes suivantes sont présentes dans la table '$tableName' : " . PHP_EOL;
+        $message .= <<<EOT
+ALTER TABLE $tableName ADD source_id $integer NOT NULL ;
+ALTER TABLE $tableName ADD source_code $varchar(100) ;
 EOT;
 
         return new RuntimeException($message);
diff --git a/src/UnicaenDbImport/CodeGenerator/PostgreSQL/Helper/TableValidationHelper.php b/src/UnicaenDbImport/CodeGenerator/PostgreSQL/Helper/TableValidationHelper.php
index 3e73608..368e23a 100644
--- a/src/UnicaenDbImport/CodeGenerator/PostgreSQL/Helper/TableValidationHelper.php
+++ b/src/UnicaenDbImport/CodeGenerator/PostgreSQL/Helper/TableValidationHelper.php
@@ -55,10 +55,10 @@ EOT;
 WITH required_cols(column_name, column_type) AS (
 $selects
 )
-SELECT rc.column_name, c.udt_name
+SELECT rc.column_name, c.data_type
 FROM required_cols rc
 JOIN information_schema.columns c ON upper(c.column_name) = upper(rc.column_name)
-WHERE upper(c.table_name) = upper('$tableName') AND (rc.column_type  IS NULL OR rc.column_type = c.udt_name)
+WHERE upper(c.table_name) = upper('$tableName') AND (rc.column_type  IS NULL OR rc.column_type = c.data_type)
 ;
 EOT;
         return $sql;
@@ -69,12 +69,23 @@ EOT;
      */
     public function generateSQLForHistoColumnsValidation($tableName)
     {
-        $udtName = 'timestamp';
+        $columnsAndTypes = [
+            'created_on' => 'timestamp without time zone',
+            'updated_on' => 'timestamp without time zone',
+            'deleted_on' => 'timestamp without time zone',
+        ];
+
+        return $this->generateSQLForColumnsValidation($tableName, $columnsAndTypes);
+    }
 
+    /**
+     * {@inheritDoc}
+     */
+    public function generateSQLForSourceColumnsValidation($tableName)
+    {
         $columnsAndTypes = [
-            'created_on' => $udtName,
-            'updated_on' => $udtName,
-            'deleted_on' => $udtName,
+            'source_code' => 'character varying',
+            'source_id' => 'integer',
         ];
 
         return $this->generateSQLForColumnsValidation($tableName, $columnsAndTypes);
diff --git a/src/UnicaenDbImport/Service/DatabaseService.php b/src/UnicaenDbImport/Service/DatabaseService.php
index 9a742b7..e8499f0 100644
--- a/src/UnicaenDbImport/Service/DatabaseService.php
+++ b/src/UnicaenDbImport/Service/DatabaseService.php
@@ -160,6 +160,14 @@ class DatabaseService
         if ($exception !== null) {
             throw new RuntimeException("La table '$table' n'est pas une table de destination valide. ", 0, $exception);
         }
+
+        // source columns validation
+        $sql = $this->codeGenerator->generateSQLForSourceColumnsValidation($table);
+        $result = $this->queryExecutor->fetchAll($sql, $connection);
+        $exception = $this->codeGenerator->convertSourceColumnsValidationBadResultToException($table, $result);
+        if ($exception !== null) {
+            throw new RuntimeException("La table '$table' n'est pas une table de destination valide. ", 0, $exception);
+        }
     }
 
     /**
-- 
GitLab