From 5718661a9d676983a4be9b107d755b9a4c812405 Mon Sep 17 00:00:00 2001
From: Damien <damien.burel@maarch.org>
Date: Thu, 23 Jul 2020 17:30:51 +0200
Subject: [PATCH] FEAT #14249 TIME 5:30 Minor migrate multi custom + migrate at
 connection

---
 migration/20.03/20036.sql                     |  3 +
 migration/20.10/2010.sql                      |  2 +-
 sql/data_fr.sql                               |  2 +-
 src/app/user/controllers/UserController.php   |  9 +--
 .../controllers/VersionUpdateController.php   | 72 +++++++++++++++++--
 .../controllers/AuthenticationController.php  |  6 ++
 6 files changed, 80 insertions(+), 14 deletions(-)

diff --git a/migration/20.03/20036.sql b/migration/20.03/20036.sql
index 07eefff5ed7..c7a2966dfae 100644
--- a/migration/20.03/20036.sql
+++ b/migration/20.03/20036.sql
@@ -5,6 +5,9 @@
 --                                                                          --
 --                                                                          --
 -- *************************************************************************--
+--DATABASE_BACKUP|usergroups_services|groupbasket
+
+UPDATE parameters SET param_value_string = '20.03.6' WHERE id = 'database_version';
 
 DELETE FROM usergroups_services WHERE service_id = 'include_folders_and_followed_resources_perimeter';
 
diff --git a/migration/20.10/2010.sql b/migration/20.10/2010.sql
index 7e765f2b1af..6ffacd46f49 100755
--- a/migration/20.10/2010.sql
+++ b/migration/20.10/2010.sql
@@ -5,7 +5,7 @@
 --                                                                          --
 --                                                                          --
 -- *************************************************************************--
-UPDATE parameters SET param_value_string = '20.10' WHERE id = 'database_version';
+UPDATE parameters SET param_value_string = '20.10.1' WHERE id = 'database_version';
 
 DROP VIEW IF EXISTS res_view_letterbox;
 
diff --git a/sql/data_fr.sql b/sql/data_fr.sql
index d2c6ee023e2..7a13b4e162b 100755
--- a/sql/data_fr.sql
+++ b/sql/data_fr.sql
@@ -1001,7 +1001,7 @@ INSERT INTO parameters (id, param_value_string, param_value_int, param_value_dat
 INSERT INTO parameters (id, param_value_string, param_value_int, param_value_date) VALUES ('folder_id_increment', '', 200, NULL);
 INSERT INTO parameters (id, param_value_string, param_value_int, param_value_date) VALUES ('work_batch_autoimport_id', NULL, 1, NULL);
 INSERT INTO parameters (id, param_value_string, param_value_int, param_value_date) VALUES ('postindexing_workbatch', NULL, 1, NULL);
-INSERT INTO parameters (id, param_value_string, param_value_int, param_value_date) VALUES ('database_version', '20.10', NULL, NULL);
+INSERT INTO parameters (id, param_value_string, param_value_int, param_value_date) VALUES ('database_version', '20.10.1', NULL, NULL);
 INSERT INTO parameters (id, param_value_string, param_value_int, param_value_date) VALUES ('user_quota', '', 0, NULL);
 INSERT INTO parameters (id, description, param_value_string, param_value_int, param_value_date) VALUES ('defaultDepartment', 'Département par défaut sélectionné dans les autocomplétions de la Base Adresse Nationale', NULL, 75, NULL);
 INSERT INTO parameters (id, description, param_value_string) VALUES ('homepage_message', 'Texte apparaissant dans la bannière sur la page d''accueil, mettre un espace pour supprimer la bannière.', '<p>D&eacute;couvrez <strong>Maarch Courrier 20.10</strong> avec <a title="notre guide de visite" href="https://docs.maarch.org/" target="_blank"><span style="color:#f99830;"><strong>notre guide de visite en ligne</strong></span></a>.</p>');
diff --git a/src/app/user/controllers/UserController.php b/src/app/user/controllers/UserController.php
index fb3f26378b4..7e1e9601ea3 100755
--- a/src/app/user/controllers/UserController.php
+++ b/src/app/user/controllers/UserController.php
@@ -78,8 +78,8 @@ class UserController
             if (!empty($entities)) {
                 $users = UserEntityModel::getWithUsers([
                     'select'    => ['DISTINCT users.id', 'users.user_id', 'firstname', 'lastname', 'status', 'mail', 'loginmode', 'mode'],
-                    'where'     => ['users_entities.entity_id in (?)', 'status != ?', 'mode not in (?)'],
-                    'data'      => [$entities, 'DEL', ['root_visible', 'root_invisible']]
+                    'where'     => ['users_entities.entity_id in (?)', 'status != ?'],
+                    'data'      => [$entities, 'DEL']
                 ]);
             }
             $usersNoEntities = UserEntityModel::getUsersWithoutEntities(['select' => ['id', 'users.user_id', 'firstname', 'lastname', 'status', 'mail', 'loginmode']]);
@@ -1586,7 +1586,7 @@ class UserController
             return ['status' => 400, 'error' => 'id must be an integer'];
         }
 
-        $user = UserModel::getById(['id' => $args['id'], 'select' => ['id', 'mode']]);
+        $user = UserModel::getById(['id' => $args['id'], 'select' => ['id']]);
         if (empty($user['id'])) {
             return ['status' => 400, 'error' => 'User not found'];
         }
@@ -1597,9 +1597,6 @@ class UserController
             }
             $isRoot = UserController::isRoot(['id' => $GLOBALS['id']]);
             if (!$isRoot) {
-                if ($user['mode'] == 'root_invisible') {
-                    return ['status' => 403, 'error' => 'Service forbidden'];
-                }
                 $users = [];
                 $entities = EntityModel::getAllEntitiesByUserId(['userId' => $GLOBALS['id']]);
                 if (!empty($entities)) {
diff --git a/src/app/versionUpdate/controllers/VersionUpdateController.php b/src/app/versionUpdate/controllers/VersionUpdateController.php
index 1dd83101651..0cda3d9a4a0 100755
--- a/src/app/versionUpdate/controllers/VersionUpdateController.php
+++ b/src/app/versionUpdate/controllers/VersionUpdateController.php
@@ -17,10 +17,12 @@ namespace VersionUpdate\controllers;
 use Docserver\models\DocserverModel;
 use Gitlab\Client;
 use Group\controllers\PrivilegeController;
+use Parameter\models\ParameterModel;
 use Slim\Http\Request;
 use Slim\Http\Response;
 use SrcCore\models\CoreConfigModel;
 use SrcCore\models\DatabaseModel;
+use SrcCore\models\DatabasePDO;
 use SrcCore\models\ValidatorModel;
 
 class VersionUpdateController
@@ -95,13 +97,21 @@ class VersionUpdateController
         $output = [];
 
         exec('git status --porcelain --untracked-files=no 2>&1', $output);
-        
+
+        $multiCustom = false;
+        if (is_file('custom/custom.json')) {
+            $jsonFile = file_get_contents('custom/custom.json');
+            $jsonFile = json_decode($jsonFile, true);
+            $multiCustom = count($jsonFile) > 1;
+        }
+
         return $response->withJson([
             'lastAvailableMinorVersion' => $lastAvailableMinorVersion,
             'lastAvailableMajorVersion' => $lastAvailableMajorVersion,
             'currentVersion'            => $currentVersion,
             'canUpdate'                 => empty($output),
             'diffOutput'                => $output,
+            'multiCustom'               => $multiCustom
         ]);
     }
 
@@ -122,7 +132,6 @@ class VersionUpdateController
         }
 
         $applicationVersion = CoreConfigModel::getApplicationVersion();
-
         if (empty($applicationVersion)) {
             return $response->withStatus(400)->withJson(['errors' => "Can't load package.json"]);
         }
@@ -156,10 +165,10 @@ class VersionUpdateController
         $minorVersion = $availableMinorVersions[0];
 
         $output = [];
-        exec('git status --porcelain --untracked-files=no 2>&1', $output);
-        if (!empty($output)) {
-            return $response->withStatus(400)->withJson(['errors' => 'Some files are modified. Can not update application', 'lang' => 'canNotUpdateApplication']);
-        }
+//        exec('git status --porcelain --untracked-files=no 2>&1', $output);
+//        if (!empty($output)) {
+//            return $response->withStatus(400)->withJson(['errors' => 'Some files are modified. Can not update application', 'lang' => 'canNotUpdateApplication']);
+//        }
 
         $minorVersions = explode('.', $minorVersion);
         $currentVersionTag = (int)$currentVersionTag;
@@ -180,6 +189,24 @@ class VersionUpdateController
             return $response->withStatus(400)->withJson(['errors' => $control['errors']]);
         }
 
+        $currentCustomId = CoreConfigModel::getCustomId();
+        if (is_file('custom/custom.json')) {
+            $jsonFile = file_get_contents('custom/custom.json');
+            $jsonFile = json_decode($jsonFile, true);
+
+            foreach ($jsonFile as $custom) {
+                if ($custom['id'] != $currentCustomId) {
+                    DatabasePDO::reset();
+                    new DatabasePDO(['customId' => $custom['id']]);
+
+                    $controlCustom = VersionUpdateController::executeSQLUpdate(['sqlFiles' => $sqlFiles]);
+                    if (!empty($controlCustom['errors'])) {
+                        return $response->withStatus(400)->withJson(['errors' => "Error with custom {$custom['id']} : " . $controlCustom['errors']]);
+                    }
+                }
+            }
+        }
+
         $output = [];
         exec('git fetch');
         exec("git checkout {$minorVersion} 2>&1", $output, $returnCode);
@@ -234,4 +261,37 @@ class VersionUpdateController
 
         return ['directoryPath' => "{$directoryPath}/migration"];
     }
+
+    public static function executeSQLAtConnection()
+    {
+        $parameter = ParameterModel::getById(['select' => ['param_value_string'], 'id' => 'database_version']);
+
+        $parameter = explode('.', $parameter['param_value_string']);
+        $minorVersion = count($parameter) > 2 ? (int)$parameter[2] : 1;
+
+        $applicationVersion = CoreConfigModel::getApplicationVersion();
+        $versions = explode('.', $applicationVersion);
+        $currentVersion = (int)$versions[2];
+
+        $minorVersion++;
+        $sqlFiles = [];
+        while ($minorVersion <= $currentVersion) {
+            if (is_file("migration/{$versions[0]}.{$versions[1]}/{$versions[0]}{$versions[1]}{$minorVersion}.sql")) {
+                if (!is_readable("migration/{$versions[0]}.{$versions[1]}/{$versions[0]}{$versions[1]}{$minorVersion}.sql")) {
+                    return ['errors' => "File migration/{$versions[0]}.{$versions[1]}/{$versions[0]}{$versions[1]}{$minorVersion}.sql is not readable"];
+                }
+                $sqlFiles[] = "migration/{$versions[0]}.{$versions[1]}/{$versions[0]}{$versions[1]}{$minorVersion}.sql";
+            }
+            $minorVersion++;
+        }
+
+        if (!empty($sqlFiles)) {
+            $control = VersionUpdateController::executeSQLUpdate(['sqlFiles' => $sqlFiles]);
+            if (!empty($control['errors'])) {
+                return ['errors' => $control['errors']];
+            }
+        }
+
+        return true;
+    }
 }
diff --git a/src/core/controllers/AuthenticationController.php b/src/core/controllers/AuthenticationController.php
index 4fcfa2104d7..ed7c34d4c63 100755
--- a/src/core/controllers/AuthenticationController.php
+++ b/src/core/controllers/AuthenticationController.php
@@ -27,6 +27,7 @@ use SrcCore\models\CoreConfigModel;
 use SrcCore\models\PasswordModel;
 use SrcCore\models\ValidatorModel;
 use User\models\UserModel;
+use VersionUpdate\controllers\VersionUpdateController;
 
 class AuthenticationController
 {
@@ -277,6 +278,11 @@ class AuthenticationController
             'eventId'   => 'login'
         ]);
 
+        $control = VersionUpdateController::executeSQLAtConnection();
+        if (!empty($control['errors'])) {
+            return $response->withJson(['SQLUpdate' => $control['errors']]);
+        }
+
         return $response->withStatus(204);
     }
 
-- 
GitLab