diff --git a/server/AyaNova/Controllers/WidgetController.cs b/server/AyaNova/Controllers/WidgetController.cs index fc9ffcb1..bfb75444 100644 --- a/server/AyaNova/Controllers/WidgetController.cs +++ b/server/AyaNova/Controllers/WidgetController.cs @@ -158,14 +158,14 @@ namespace AyaNova.Api.Controllers /// - /// Reset serial number + /// ReStart serial number /// /// /// Next starting value for auto generated serial numbers /// From route path /// Widget - [HttpPost("reset-serial/{newSerial}")] - public async Task ResetSerial([FromRoute] long newSerial, ApiVersion apiVersion) + [HttpPost("restart-serial/{newSerial}")] + public async Task ReStartSerial([FromRoute] long newSerial, ApiVersion apiVersion) { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); @@ -174,13 +174,14 @@ namespace AyaNova.Api.Controllers return StatusCode(403, new ApiNotAuthorizedResponse()); if (!ModelState.IsValid) return BadRequest(new ApiErrorResponse(ModelState)); - bool result=await biz.ResetSerial(newSerial); + bool result=await biz.RestartSerial(newSerial); if (!result) return BadRequest(new ApiErrorResponse(biz.Errors)); else return NoContent(); } + /////////////////////////////////////////////// //TEST ROUTES // diff --git a/server/AyaNova/Controllers/WorkOrderController.cs b/server/AyaNova/Controllers/WorkOrderController.cs index 4b3eb2f9..e0aeb233 100644 --- a/server/AyaNova/Controllers/WorkOrderController.cs +++ b/server/AyaNova/Controllers/WorkOrderController.cs @@ -166,6 +166,30 @@ namespace AyaNova.Api.Controllers return NoContent(); } + /// + /// ReStart serial number + /// + /// + /// Next starting value for auto generated serial numbers + /// From route path + /// Widget + [HttpPost("restart-serial/{newSerial}")] + public async Task ReStartSerial([FromRoute] long newSerial, ApiVersion apiVersion) + { + if (!serverState.IsOpen) + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); + WorkOrderBiz biz = WorkOrderBiz.GetBiz(ct, HttpContext); + if (!Authorized.HasCreateRole(HttpContext.Items, biz.BizType)) + return StatusCode(403, new ApiNotAuthorizedResponse()); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); + bool result=await biz.RestartSerial(newSerial); + if (!result) + return BadRequest(new ApiErrorResponse(biz.Errors)); + else + return NoContent(); + } + #endregion WorkOrderTopLevel routes diff --git a/server/AyaNova/Startup.cs b/server/AyaNova/Startup.cs index 91b43ade..896030fc 100644 --- a/server/AyaNova/Startup.cs +++ b/server/AyaNova/Startup.cs @@ -505,10 +505,6 @@ namespace AyaNova //TESTING - - //AUTOID VALUES INITIALIZATION - ServerBootConfig.SetMostRecentAutoIdValuesFromDatabase(dbContext); - //SPA FALLBACK ROUTE app.Use(async (context, next) => { diff --git a/server/AyaNova/biz/PMBiz.cs b/server/AyaNova/biz/PMBiz.cs index d176a9e6..ad60e151 100644 --- a/server/AyaNova/biz/PMBiz.cs +++ b/server/AyaNova/biz/PMBiz.cs @@ -81,7 +81,7 @@ namespace AyaNova.Biz // { //do stuff with PM PM o = new PM(); - o.Serial = serial ?? ServerBootConfig.PM_SERIAL.GetNext(); + // o.Serial = serial ?? ServerBootConfig.PM_SERIAL.GetNext(); //TODO: template //TODO: CUSTOMER ID diff --git a/server/AyaNova/biz/QuoteBiz.cs b/server/AyaNova/biz/QuoteBiz.cs index f8225b01..0fcfd436 100644 --- a/server/AyaNova/biz/QuoteBiz.cs +++ b/server/AyaNova/biz/QuoteBiz.cs @@ -81,8 +81,7 @@ namespace AyaNova.Biz // { //do stuff with Quote Quote o = new Quote(); - o.Serial = serial ?? ServerBootConfig.QUOTE_SERIAL.GetNext(); - + //TODO: template //TODO: CUSTOMER ID diff --git a/server/AyaNova/biz/WidgetBiz.cs b/server/AyaNova/biz/WidgetBiz.cs index 962c55ed..919b69d3 100644 --- a/server/AyaNova/biz/WidgetBiz.cs +++ b/server/AyaNova/biz/WidgetBiz.cs @@ -42,8 +42,7 @@ namespace AyaNova.Biz if (HasErrors) return null; else - { - // newObject.Serial = ServerBootConfig.WIDGET_SERIAL.GetNext(); + { newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.Widget.AddAsync(newObject); @@ -77,7 +76,6 @@ namespace AyaNova.Biz NotUnique = await ct.Widget.AnyAsync(m => m.Name == newUniqueName); } while (NotUnique); newObject.Name = newUniqueName; - //newObject.Serial = ServerBootConfig.WIDGET_SERIAL.GetNext(); newObject.Id = 0; newObject.Concurrency = 0; await ct.Widget.AddAsync(newObject); @@ -171,18 +169,11 @@ namespace AyaNova.Biz } - //////////////////////////////////////////////////////////////////////////////////////////////// - //RESET SERIAL + //RESTART SERIAL // - internal async Task ResetSerial(long newSerial) - { - /* - ALTER TABLE table_name -ALTER COLUMN column_name -{ SET GENERATED { ALWAYS| BY DEFAULT } | - SET sequence_option | RESTART [ [ WITH ] restart ] } - */ + internal async Task RestartSerial(long newSerial) + { using (var command = ct.Database.GetDbConnection().CreateCommand()) { command.CommandText = $"alter table awidget alter column serial restart with {newSerial}"; diff --git a/server/AyaNova/biz/WorkOrderBiz.cs b/server/AyaNova/biz/WorkOrderBiz.cs index 1ff365b9..ee782d5f 100644 --- a/server/AyaNova/biz/WorkOrderBiz.cs +++ b/server/AyaNova/biz/WorkOrderBiz.cs @@ -61,7 +61,6 @@ namespace AyaNova.Biz return null; else { - newObject.Serial = ServerBootConfig.WORKORDER_SERIAL.GetNext(); newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.WorkOrder.AddAsync(newObject); @@ -85,8 +84,7 @@ namespace AyaNova.Biz return null; } WorkOrder newObject = new WorkOrder(); - CopyObject.Copy(dbObject, newObject, "Wiki"); - newObject.Serial = ServerBootConfig.WORKORDER_SERIAL.GetNext(); + CopyObject.Copy(dbObject, newObject, "Wiki,Serial"); newObject.Id = 0; newObject.Concurrency = 0; await ct.WorkOrder.AddAsync(newObject); @@ -151,7 +149,7 @@ namespace AyaNova.Biz CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); //Replace the db object with the PUT object - CopyObject.Copy(dtPutObject, dbObject, "Id,Serial"); + CopyObject.Copy(dtPutObject, dbObject, "Id"); //if user has rights then change it, otherwise just ignore it and do the rest if (dtPutObject.Serial != 0 && SnapshotOfOriginalDBObj.Serial != dtPutObject.Serial && Authorized.HasAnyRole(CurrentUserRoles, RolesAllowedToChangeSerial)) @@ -235,6 +233,26 @@ namespace AyaNova.Biz } } + + //////////////////////////////////////////////////////////////////////////////////////////////// + //RESTART SERIAL + // + internal async Task RestartSerial(long newSerial) + { + + using (var command = ct.Database.GetDbConnection().CreateCommand()) + { + command.CommandText = $"alter table aworkorder alter column serial restart with {newSerial}"; + await ct.Database.OpenConnectionAsync(); + await command.ExecuteNonQueryAsync(); + await ct.Database.CloseConnectionAsync(); + } + await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, 0, BizType, AyaEvent.ResetSerial, newSerial.ToString()), ct); + return true; + } + + + private async Task WorkOrderSearchIndexAsync(WorkOrder obj, bool isNew) { //SEARCH INDEXING diff --git a/server/AyaNova/util/AutoId.cs b/server/AyaNova/util/AutoId.cs deleted file mode 100644 index 1fd06a2b..00000000 --- a/server/AyaNova/util/AutoId.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Threading.Tasks; -namespace AyaNova.Util -{ - public class AutoId - { - private readonly object valueLock = new object(); - private uint currentValue; //postgre bigint - - public AutoId(uint initialValue) - { - currentValue = initialValue; - } - - public uint GetNext() - { - lock (valueLock) - { - currentValue += 1; - if (currentValue == 0) - currentValue += 1; - return currentValue; - } - } - } -} \ No newline at end of file diff --git a/server/AyaNova/util/Seeder.cs b/server/AyaNova/util/Seeder.cs index a0bb92aa..b248ed02 100644 --- a/server/AyaNova/util/Seeder.cs +++ b/server/AyaNova/util/Seeder.cs @@ -60,10 +60,6 @@ namespace AyaNova.Util ApiServerState.ServerState wasServerState = apiServerState.GetState(); string wasReason = apiServerState.Reason; - //START SERIAL NUMBER GENERATORS - if (ServerBootConfig.WIDGET_SERIAL == null) - ServerBootConfig.WIDGET_SERIAL = new AutoId(0); - try { await LogStatusAsync(JobId, LogJob, log, $"SEEDER: Seeding data level is {slevel.ToString()}, time zone offset is {timeZoneOffset.ToString()}"); diff --git a/server/AyaNova/util/ServerBootConfig.cs b/server/AyaNova/util/ServerBootConfig.cs index 3e237a7c..c9db8353 100644 --- a/server/AyaNova/util/ServerBootConfig.cs +++ b/server/AyaNova/util/ServerBootConfig.cs @@ -1,8 +1,7 @@ using System.Collections.Generic; using System.IO; using Microsoft.Extensions.Configuration; -using Microsoft.EntityFrameworkCore; -using System.Linq; + namespace AyaNova.Util { @@ -13,14 +12,6 @@ namespace AyaNova.Util internal static class ServerBootConfig { - //AUTOID's - - //Get the most recent id number issued previously and start the auto-id at that level - internal static AutoId WIDGET_SERIAL { get; set; } - internal static AutoId WORKORDER_SERIAL { get; set; } - internal static AutoId QUOTE_SERIAL { get; set; } - internal static AutoId PM_SERIAL { get; set; } - //Diagnostic static values used during development, may not be related to config at all, this is just a convenient class to put them in #if (DEBUG) internal static List TranslationKeysRequested { get; set; } @@ -219,50 +210,6 @@ namespace AyaNova.Util } - //Get the auto-id most recent values at boot time - internal static void SetMostRecentAutoIdValuesFromDatabase(AyaNova.Models.AyContext ct) - { - //TODO: CHANGE TO A DEDICATED SPOT IN GLOBAL RATHER THAN INFERRING AS IT IS NOT RIGHT PRACTICALLY for reasons - //WIDGET SERIALS - if (WIDGET_SERIAL == null) - { - //query for most recently used serial number - //(note, can't query for highest serial as it can and likely will reset or be changed manually from time to time - // so the algorithm is to keep the most recent sequence going on startup of the server) - // var serializedObject = ct.Widget.AsNoTracking().OrderByDescending(x => x.Id).FirstOrDefault(); - // WIDGET_SERIAL = new AutoId(serializedObject == null ? 0 : serializedObject.Serial); - - // var MostRecentWidget = ct.Widget.AsNoTracking().OrderByDescending(x => x.Id).FirstOrDefault(); - // uint MaxWidgetId = 0; - // if (MostRecentWidget != null) - // MaxWidgetId = MostRecentWidget.Serial; - // WIDGET_SERIAL = new AutoId(MaxWidgetId); - - } - - //Workorder - if (WORKORDER_SERIAL == null) - { - var serializedObject = ct.WorkOrder.AsNoTracking().OrderByDescending(x => x.Id).FirstOrDefault(); - WORKORDER_SERIAL = new AutoId(serializedObject == null ? 0 : serializedObject.Serial); - } - - //quote - if (QUOTE_SERIAL == null) - { - var serializedObject = ct.Quote.AsNoTracking().OrderByDescending(x => x.Id).FirstOrDefault(); - QUOTE_SERIAL = new AutoId(serializedObject == null ? 0 : serializedObject.Serial); - } - - //PM - if (PM_SERIAL == null) - { - var serializedObject = ct.PM.AsNoTracking().OrderByDescending(x => x.Id).FirstOrDefault(); - PM_SERIAL = new AutoId(serializedObject == null ? 0 : serializedObject.Serial); - } - - //OTHER SERIALS HERE IN FUTURE... - }