diff --git a/.vscode/launch.json b/.vscode/launch.json
index 0e2049e9..8fd97968 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -53,7 +53,7 @@
"AYANOVA_FOLDER_USER_FILES": "c:\\temp\\RavenTestData\\userfiles",
"AYANOVA_FOLDER_BACKUP_FILES": "c:\\temp\\RavenTestData\\backupfiles",
"AYANOVA_FOLDER_TEMPORARY_SERVER_FILES": "c:\\temp\\RavenTestData\\tempfiles",
- "AYANOVA_SERVER_TEST_MODE": "false",
+ "AYANOVA_SERVER_TEST_MODE": "true",
"AYANOVA_SERVER_TEST_MODE_SEEDLEVEL": "small",
"AYANOVA_SERVER_TEST_MODE_TZ_OFFSET": "-7",
"AYANOVA_BACKUP_PG_DUMP_PATH": "C:\\data\\code\\postgres_13\\bin\\"
diff --git a/server/AyaNova/ControllerHelpers/ApiServerState.cs b/server/AyaNova/ControllerHelpers/ApiServerState.cs
index c4a995ee..4a1fe087 100644
--- a/server/AyaNova/ControllerHelpers/ApiServerState.cs
+++ b/server/AyaNova/ControllerHelpers/ApiServerState.cs
@@ -123,7 +123,7 @@ namespace AyaNova.Api.ControllerHelpers
throw new System.NotSupportedException("ApiServerState:ApiErrorCode - No error code is associated with server state OPEN");
case ServerState.OpsOnly:
return ApiErrorCode.API_OPS_ONLY;
- case ServerState.MigrateMode:
+ case ServerState.MigrateMode:
return ApiErrorCode.API_MIGRATE_MODE;
case ServerState.Closed:
return ApiErrorCode.API_CLOSED;
@@ -173,6 +173,14 @@ namespace AyaNova.Api.ControllerHelpers
}
}
+ public bool IsMigrateMode
+ {
+ get
+ {
+ return _currentState == ServerState.MigrateMode && !SYSTEM_LOCK;
+ }
+ }
+
public bool IsOpen
{
get
@@ -190,13 +198,13 @@ namespace AyaNova.Api.ControllerHelpers
}
}
- public bool IsOpenOrOpsOnly
- {
- get
- {
- return (IsOpen || IsOpsOnly) && !SYSTEM_LOCK;
- }
- }
+ // public bool IsOpenOrOpsOnly
+ // {
+ // get
+ // {
+ // return (IsOpen || IsOpsOnly) && !SYSTEM_LOCK;
+ // }
+ // }
public bool IsSystemLocked
{
diff --git a/server/AyaNova/Controllers/AuthController.cs b/server/AyaNova/Controllers/AuthController.cs
index 8e4131dc..0ea82be5 100644
--- a/server/AyaNova/Controllers/AuthController.cs
+++ b/server/AyaNova/Controllers/AuthController.cs
@@ -168,10 +168,10 @@ namespace AyaNova.Api.Controllers
{
//Valid password, user is effectively authorized at this point
- //check if server closed
- //if it is it means we got here only because there is no license
- //and only *the* SuperUser account can login now
- if (serverState.IsClosed)
+ //check if server available to SuperUser account only (closed or migrate mode)
+ //if it is it means we got here either because there is no license
+ //and only *the* SuperUser account can login now or we're in migrate mode
+ if (serverState.IsClosed || serverState.IsMigrateMode)
{
//if not SuperUser account then boot closed
//SuperUser account is always ID 1
diff --git a/server/AyaNova/Controllers/ServerStateController.cs b/server/AyaNova/Controllers/ServerStateController.cs
index d3ee69d7..90459ff7 100644
--- a/server/AyaNova/Controllers/ServerStateController.cs
+++ b/server/AyaNova/Controllers/ServerStateController.cs
@@ -43,7 +43,7 @@ namespace AyaNova.Api.Controllers
///
/// Get server state
///
- /// Current server state (Closed, OpsOnly, Open)
+ /// Current server state (Closed, MigrateMode, OpsOnly, Open)
[HttpGet]
public ActionResult Get()
{
@@ -79,8 +79,29 @@ namespace AyaNova.Api.Controllers
if (desiredState == ApiServerState.ServerState.Closed)
return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_INVALID_VALUE, null, "Invalid state - must be one of \"OpsOnly\", \"MigrateMode\" or \"Open\""));
+ var TransId = UserTranslationIdFromContext.Id(HttpContext.Items);
+
log.LogInformation($"ServerState change request by user {UserNameFromContext.Name(HttpContext.Items)} from current state of \"{serverState.GetState().ToString()}\" to \"{desiredState.ToString()}-{state.Reason}\"");
+ //Add a message if user didn't enter one so other users know why they can't login
+ if (string.IsNullOrWhiteSpace(state.Reason))
+ {
+ switch (desiredState)
+ {
+ case ApiServerState.ServerState.Open:
+ break;
+ case ApiServerState.ServerState.MigrateMode:
+ state.Reason += await TranslationBiz.GetTranslationStaticAsync("ServerStateLoginRestricted", TransId, ct) + " " + await TranslationBiz.GetTranslationStaticAsync("ServerStateMigrateMode", TransId, ct);
+ break;
+ case ApiServerState.ServerState.OpsOnly:
+ state.Reason += await TranslationBiz.GetTranslationStaticAsync("ServerStateLoginRestricted", TransId, ct) + " " + await TranslationBiz.GetTranslationStaticAsync("ServerStateOps", TransId, ct);
+ break;
+ case ApiServerState.ServerState.Closed:
+ state.Reason += await TranslationBiz.GetTranslationStaticAsync("ServerStateLoginRestricted", TransId, ct) + " " + await TranslationBiz.GetTranslationStaticAsync("ErrorAPI2000", TransId, ct);
+ break;
+ }
+ }
+
serverState.SetState(desiredState, state.Reason);
//Log
diff --git a/server/AyaNova/resource/de.json b/server/AyaNova/resource/de.json
index 5f3150ee..9e5838d8 100644
--- a/server/AyaNova/resource/de.json
+++ b/server/AyaNova/resource/de.json
@@ -1781,6 +1781,7 @@
"ServerStateOps": "Nur Systembetrieb",
"ServerStateMigrateMode": "Server-Migrationsmodus",
"ServerStateReason": "Grund",
+ "ServerStateLoginRestricted": "Anmeldung aufgrund der Serverstatuseinstellung eingeschränkt",
"TooManyResults": "Zu viele Ergebnisse, um alle anzuzeigen",
"NoResults": "Keine Ergebnisse",
"EventTextra": "Anmerkungen",
diff --git a/server/AyaNova/resource/en.json b/server/AyaNova/resource/en.json
index 82e3e7f4..6a52c9ef 100644
--- a/server/AyaNova/resource/en.json
+++ b/server/AyaNova/resource/en.json
@@ -1781,6 +1781,7 @@
"ServerStateOps": "Server operations only",
"ServerStateMigrateMode": "Server migration mode",
"ServerStateReason": "Reason",
+ "ServerStateLoginRestricted": "Login restricted due to server state setting",
"TooManyResults": "Too many results to show all",
"NoResults": "No results",
"EventTextra": "Notes",
diff --git a/server/AyaNova/resource/es.json b/server/AyaNova/resource/es.json
index 9835cf74..042597ab 100644
--- a/server/AyaNova/resource/es.json
+++ b/server/AyaNova/resource/es.json
@@ -1781,6 +1781,7 @@
"ServerStateOps": "Solo operaciones del sistema",
"ServerStateMigrateMode": "Modo de migración del servidor",
"ServerStateReason": "Razón",
+ "ServerStateLoginRestricted": "Inicio de sesión restringido debido a la configuración del estado del servidor",
"TooManyResults": "Demasiados resultados para mostrar todos",
"NoResults": "No hay resultados",
"EventTextra": "Notas",
diff --git a/server/AyaNova/resource/fr.json b/server/AyaNova/resource/fr.json
index fdd891fd..42b1ced7 100644
--- a/server/AyaNova/resource/fr.json
+++ b/server/AyaNova/resource/fr.json
@@ -1781,6 +1781,7 @@
"ServerStateOps": "Opérations système uniquement",
"ServerStateMigrateMode": "Mode de migration du serveur",
"ServerStateReason": "Objectif",
+ "ServerStateLoginRestricted": "Connexion restreinte en raison du paramètre d'état du serveur",
"TooManyResults": "Trop de résultats pour tout montrer",
"NoResults": "Aucun résultat",
"EventTextra": "Remarques",
diff --git a/server/AyaNova/util/DbUtil.cs b/server/AyaNova/util/DbUtil.cs
index 907bfc1c..c85d382a 100644
--- a/server/AyaNova/util/DbUtil.cs
+++ b/server/AyaNova/util/DbUtil.cs
@@ -340,7 +340,7 @@ namespace AyaNova.Util
await EraseTableAsync("apmtemplateitem", conn);
await EraseTableAsync("apmtemplate", conn);
-
+
await EraseTableAsync("aquoteitem", conn);
await EraseTableAsync("aquote", conn);
await EraseTableAsync("aquotetemplateitem", conn);
@@ -400,12 +400,17 @@ namespace AyaNova.Util
cmd.CommandText = "ALTER SEQUENCE auser_id_seq RESTART WITH 2;";
await cmd.ExecuteNonQueryAsync();
+
cmd.CommandText = "delete from \"adashboardview\" where userid <> 1;";
+ await cmd.ExecuteNonQueryAsync();
+ cmd.CommandText = $"ALTER SEQUENCE adashboardview_id_seq RESTART WITH 2;";
await cmd.ExecuteNonQueryAsync();
cmd.CommandText = "delete from \"apartwarehouse\" where id <> 1;";
await cmd.ExecuteNonQueryAsync();
+ cmd.CommandText = $"ALTER SEQUENCE apartwarehouse_id_seq RESTART WITH 2;";
+ await cmd.ExecuteNonQueryAsync();
}
await conn.CloseAsync();