diff --git a/src/app/versionUpdate/controllers/VersionUpdateController.php b/src/app/versionUpdate/controllers/VersionUpdateController.php index 167979391214a523b61da6ba5cc5f50e033e247b..1dd8310165140f347575910622de949e44f50fc6 100755 --- a/src/app/versionUpdate/controllers/VersionUpdateController.php +++ b/src/app/versionUpdate/controllers/VersionUpdateController.php @@ -14,15 +14,19 @@ namespace VersionUpdate\controllers; +use Docserver\models\DocserverModel; use Gitlab\Client; use Group\controllers\PrivilegeController; use Slim\Http\Request; use Slim\Http\Response; use SrcCore\models\CoreConfigModel; use SrcCore\models\DatabaseModel; +use SrcCore\models\ValidatorModel; class VersionUpdateController { + const BACKUP_TABLES = ['usergroups_services', 'groupbasket']; + public function get(Request $request, Response $response) { if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_update_control', 'userId' => $GLOBALS['id']])) { @@ -153,7 +157,6 @@ class VersionUpdateController $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']); } @@ -164,16 +167,17 @@ class VersionUpdateController $sqlFiles = []; while ($currentVersionTag <= (int)$minorVersions[2]) { if (is_file("migration/{$versions[0]}.{$versions[1]}/{$versions[0]}{$versions[1]}{$currentVersionTag}.sql")) { + if (!is_readable("migration/{$versions[0]}.{$versions[1]}/{$versions[0]}{$versions[1]}{$currentVersionTag}.sql")) { + return $response->withStatus(400)->withJson(['errors' => "File migration/{$versions[0]}.{$versions[1]}/{$versions[0]}{$versions[1]}{$currentVersionTag}.sql is not readable"]); + } $sqlFiles[] = "migration/{$versions[0]}.{$versions[1]}/{$versions[0]}{$versions[1]}{$currentVersionTag}.sql"; } $currentVersionTag++; } - if (!empty($sqlFiles)) { - foreach ($sqlFiles as $sqlFile) { - $fileContent = file_get_contents($sqlFile); - DatabaseModel::exec($fileContent); - } + $control = VersionUpdateController::executeSQLUpdate(['sqlFiles' => $sqlFiles]); + if (!empty($control['errors'])) { + return $response->withStatus(400)->withJson(['errors' => $control['errors']]); } $output = []; @@ -181,12 +185,53 @@ class VersionUpdateController exec("git checkout {$minorVersion} 2>&1", $output, $returnCode); $log = "Application update from {$currentVersion} to {$minorVersion}\nCheckout response {$returnCode} => " . implode(' ', $output) . "\n"; - file_put_contents('updateVersion.log', $log, FILE_APPEND); + file_put_contents("{$control['directoryPath']}/updateVersion.log", $log, FILE_APPEND); if ($returnCode != 0) { - return $response->withStatus(400)->withJson(['errors' => 'Application update failed. Please check updateVersion.log at root application']); + return $response->withStatus(400)->withJson(['errors' => "Application update failed. Please check updateVersion.log at {$control['directoryPath']}"]); } return $response->withStatus(204); } + + private static function executeSQLUpdate(array $args) + { + ValidatorModel::arrayType($args, ['sqlFiles']); + + $docserver = DocserverModel::getCurrentDocserver(['typeId' => 'DOC', 'collId' => 'letterbox_coll', 'select' => ['path_template']]); + $directoryPath = explode('/', rtrim($docserver['path_template'], '/')); + array_pop($directoryPath); + $directoryPath = implode('/', $directoryPath); + + if (!is_dir($directoryPath . '/migration')) { + if (!is_writable($directoryPath)) { + return ['errors' => 'Directory path is not writable : ' . $directoryPath]; + } + mkdir($directoryPath . '/migration', 0755, true); + } elseif (!is_writable($directoryPath . '/migration')) { + return ['errors' => 'Directory path is not writable : ' . $directoryPath . '/migration']; + } + + if (!empty($args['sqlFiles'])) { + $config = CoreConfigModel::getJsonLoaded(['path' => 'apps/maarch_entreprise/xml/config.json']); + + $actualTime = date("dmY-His"); + $tablesToSave = ''; + foreach (self::BACKUP_TABLES as $table) { + $tablesToSave .= ' -t ' . $table; + } + + $execReturn = exec("pg_dump -d \"{$config['database'][0]['name']}\" {$tablesToSave} -a > \"{$directoryPath}/migration/backupDB_maarchcourrier_{$actualTime}.sql\"", $output, $intReturn); + if (!empty($execReturn)) { + return ['errors' => 'Pg dump failed : ' . $execReturn]; + } + + foreach ($args['sqlFiles'] as $sqlFile) { + $fileContent = file_get_contents($sqlFile); + DatabaseModel::exec($fileContent); + } + } + + return ['directoryPath' => "{$directoryPath}/migration"]; + } }