Skip to content
Snippets Groups Projects
Verified Commit 335aa203 authored by Damien's avatar Damien
Browse files

FEAT #14249 TIME 4:15 Database dump for minor update

parent b19fdeed
No related branches found
No related tags found
No related merge requests found
......@@ -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"];
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment