diff --git a/devdocs/todo.txt b/devdocs/todo.txt index 94c3df88..f1060918 100644 --- a/devdocs/todo.txt +++ b/devdocs/todo.txt @@ -19,7 +19,8 @@ CODING WORK +++++++++++ Overall plan for now: anything standing in the way of making the initial client shell UI needs to be done first, everything else can wait - - Audit log + - Audit log + - Add back to objects that it was commented out on with selective save or no save - Make sure trial generated data generates log events so that we can properly test with huge dataset - Test with huge dataset - Remove CREATED from all objects now that event log tracks it diff --git a/server/AyaNova/Controllers/AttachmentController.cs b/server/AyaNova/Controllers/AttachmentController.cs index 43193b8d..9e75d54d 100644 --- a/server/AyaNova/Controllers/AttachmentController.cs +++ b/server/AyaNova/Controllers/AttachmentController.cs @@ -239,8 +239,8 @@ namespace AyaNova.Api.Controllers }); //Log - //EventLogProcessor.AddEntry(new Event(UserId, attachToObject.ObjectId, attachToObject.ObjectType, AyaEvent.AttachmentCreate, v.DisplayFileName), ct); - + EventLogProcessor.AddEntry(new Event(UserId, attachToObject.ObjectId, attachToObject.ObjectType, AyaEvent.AttachmentCreate, v.DisplayFileName), ct); + ct.SaveChanges(); } } } @@ -306,8 +306,8 @@ namespace AyaNova.Api.Controllers FileUtil.deleteFileAttachment(dbObj, ct); //Log - //EventLogProcessor.AddEntry(new Event(UserId, dbObj.AttachToObjectId, dbObj.AttachToObjectType, AyaEvent.AttachmentDelete, dbObj.DisplayFileName), ct); - + EventLogProcessor.AddEntry(new Event(UserId, dbObj.AttachToObjectId, dbObj.AttachToObjectType, AyaEvent.AttachmentDelete, dbObj.DisplayFileName), ct); + ct.SaveChanges(); return NoContent(); } @@ -385,8 +385,8 @@ namespace AyaNova.Api.Controllers } //Log - //EventLogProcessor.AddEntry(new Event(UserId, dbObj.AttachToObjectId, dbObj.AttachToObjectType, AyaEvent.AttachmentDownload, dbObj.DisplayFileName), ct); - + EventLogProcessor.AddEntry(new Event(UserId, dbObj.AttachToObjectId, dbObj.AttachToObjectType, AyaEvent.AttachmentDownload, dbObj.DisplayFileName), ct); + ct.SaveChanges(); return PhysicalFile(filePath, mimetype, dbObj.DisplayFileName); } diff --git a/server/AyaNova/Controllers/LicenseController.cs b/server/AyaNova/Controllers/LicenseController.cs index dc67d7d9..6d05e206 100644 --- a/server/AyaNova/Controllers/LicenseController.cs +++ b/server/AyaNova/Controllers/LicenseController.cs @@ -127,7 +127,8 @@ namespace AyaNova.Api.Controllers } var ret = AyaNova.Core.License.LicenseInfoAsJson; //Log - //EventLogProcessor.AddEntry(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.License, AyaEvent.LicenseFetch), ct); + EventLogProcessor.AddEntry(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.License, AyaEvent.LicenseFetch), ct); + ct.SaveChanges(); return Ok(new ApiOkResponse(ret)); } @@ -179,7 +180,8 @@ namespace AyaNova.Api.Controllers var ret = Core.License.RequestTrial(requestData.EmailAddress, requestData.RegisteredTo, log); //Log - //EventLogProcessor.AddEntry(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.License, AyaEvent.LicenseTrialRequest), ct); + EventLogProcessor.AddEntry(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.License, AyaEvent.LicenseTrialRequest), ct); + ct.SaveChanges(); return Ok(new ApiOkResponse(ret)); } diff --git a/server/AyaNova/Controllers/LocaleController.cs b/server/AyaNova/Controllers/LocaleController.cs index 2e9a6175..e9983dbb 100644 --- a/server/AyaNova/Controllers/LocaleController.cs +++ b/server/AyaNova/Controllers/LocaleController.cs @@ -159,11 +159,12 @@ namespace AyaNova.Api.Controllers } else { - //save and success return + //save to get Id await ct.SaveChangesAsync(); //Log - //EventLogProcessor.AddEntry(new Event(biz.userId, o.Id, AyaType.Locale, AyaEvent.Created), ct); + EventLogProcessor.AddEntry(new Event(biz.userId, o.Id, AyaType.Locale, AyaEvent.Created), ct); + await ct.SaveChangesAsync(); return CreatedAtAction("GetLocale", new { id = o.Id }, new ApiCreatedResponse(o)); } @@ -221,6 +222,9 @@ namespace AyaNova.Api.Controllers return BadRequest(new ApiErrorResponse(biz.Errors)); } + //Log + EventLogProcessor.AddEntry(new Event(biz.userId, oDbParent.Id, AyaType.Locale, AyaEvent.Modified), ct); + try { await ct.SaveChangesAsync(); @@ -240,8 +244,6 @@ namespace AyaNova.Api.Controllers } } - //Log - //EventLogProcessor.AddEntry(new Event(biz.userId, oDbParent.Id, AyaType.Locale, AyaEvent.Modified), ct); return Ok(new ApiOkResponse(new { ConcurrencyToken = oFromDb.ConcurrencyToken })); } @@ -290,6 +292,9 @@ namespace AyaNova.Api.Controllers return BadRequest(new ApiErrorResponse(biz.Errors)); } + //Log + EventLogProcessor.AddEntry(new Event(biz.userId, oFromDb.Id, AyaType.Locale, AyaEvent.Modified), ct); + try { await ct.SaveChangesAsync(); @@ -309,9 +314,6 @@ namespace AyaNova.Api.Controllers } } - //Log - //EventLogProcessor.AddEntry(new Event(biz.userId, oFromDb.Id, AyaType.Locale, AyaEvent.Modified), ct); - return Ok(new ApiOkResponse(new { ConcurrencyToken = oFromDb.ConcurrencyToken })); } @@ -360,13 +362,14 @@ namespace AyaNova.Api.Controllers { return BadRequest(new ApiErrorResponse(biz.Errors)); } + //Log + EventLogProcessor.DeleteObject(biz.userId, AyaType.Locale, dbObj.Id, dbObj.Name, ct); await ct.SaveChangesAsync(); //Delete children / attached objects // biz.DeleteChildren(dbObj); - //Log - EventLogProcessor.DeleteObject(biz.userId, AyaType.Locale, dbObj.Id, dbObj.Name, ct); + return NoContent(); } diff --git a/server/AyaNova/Controllers/MetricsController.cs b/server/AyaNova/Controllers/MetricsController.cs index 49cf898a..12045c76 100644 --- a/server/AyaNova/Controllers/MetricsController.cs +++ b/server/AyaNova/Controllers/MetricsController.cs @@ -68,7 +68,8 @@ namespace AyaNova.Api.Controllers string sResult = await GetTheMetrics("plain"); //Log - //EventLogProcessor.AddEntry(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.Metrics, AyaEvent.Retrieved), ct); + EventLogProcessor.AddEntry(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.Metrics, AyaEvent.Retrieved), ct); + await ct.SaveChangesAsync(); return Content(sResult); } @@ -95,12 +96,13 @@ namespace AyaNova.Api.Controllers return StatusCode(401, new ApiNotAuthorizedResponse()); } - string sResult = await GetTheMetrics("json"); + string sResult = await GetTheMetrics("json"); JObject json = JObject.Parse(sResult); - //Log - //EventLogProcessor.AddEntry(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.Metrics, AyaEvent.Retrieved), ct); - + //Log + EventLogProcessor.AddEntry(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.Metrics, AyaEvent.Retrieved), ct); + await ct.SaveChangesAsync(); + return Ok(new ApiOkResponse(json)); } diff --git a/server/AyaNova/Controllers/ServerStateController.cs b/server/AyaNova/Controllers/ServerStateController.cs index f08bfd84..3cd7fee8 100644 --- a/server/AyaNova/Controllers/ServerStateController.cs +++ b/server/AyaNova/Controllers/ServerStateController.cs @@ -95,8 +95,9 @@ namespace AyaNova.Api.Controllers serverState.SetState(desiredState, state.Reason); //Log - //EventLogProcessor.AddEntry(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.ServerState, AyaEvent.ServerStateChange, $"{state.ServerState}-{state.Reason}"), ct); - + EventLogProcessor.AddEntry(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.ServerState, AyaEvent.ServerStateChange, $"{state.ServerState}-{state.Reason}"), ct); + ct.SaveChanges(); + return NoContent(); } diff --git a/server/AyaNova/Controllers/TagController.cs b/server/AyaNova/Controllers/TagController.cs index 77caddea..804f5799 100644 --- a/server/AyaNova/Controllers/TagController.cs +++ b/server/AyaNova/Controllers/TagController.cs @@ -166,11 +166,12 @@ namespace AyaNova.Api.Controllers } else { - //save and success return + //save and get ID for log then success return await ct.SaveChangesAsync(); //Log - //EventLogProcessor.AddEntry(new Event(biz.userId, o.Id, AyaType.Tag, AyaEvent.Created), ct); + EventLogProcessor.AddEntry(new Event(biz.userId, o.Id, AyaType.Tag, AyaEvent.Created), ct); + await ct.SaveChangesAsync(); return CreatedAtAction("GetTag", new { id = o.Id }, new ApiCreatedResponse(o)); } @@ -221,6 +222,9 @@ namespace AyaNova.Api.Controllers return BadRequest(new ApiErrorResponse(biz.Errors)); } + //Log + EventLogProcessor.AddEntry(new Event(biz.userId, oFromDb.Id, AyaType.Tag, AyaEvent.Modified), ct); + try { await ct.SaveChangesAsync(); @@ -240,8 +244,6 @@ namespace AyaNova.Api.Controllers } } - //Log - //EventLogProcessor.AddEntry(new Event(biz.userId, oFromDb.Id, AyaType.Tag, AyaEvent.Modified), ct); return Ok(new ApiOkResponse(new { ConcurrencyToken = oFromDb.ConcurrencyToken })); } @@ -292,6 +294,9 @@ namespace AyaNova.Api.Controllers return BadRequest(new ApiErrorResponse(biz.Errors)); } + //Log + EventLogProcessor.AddEntry(new Event(biz.userId, oFromDb.Id, AyaType.Tag, AyaEvent.Modified), ct); + try { await ct.SaveChangesAsync(); @@ -308,9 +313,6 @@ namespace AyaNova.Api.Controllers } } - //Log - //EventLogProcessor.AddEntry(new Event(biz.userId, oFromDb.Id, AyaType.Tag, AyaEvent.Modified), ct); - return Ok(new ApiOkResponse(new { ConcurrencyToken = oFromDb.ConcurrencyToken })); } @@ -354,11 +356,11 @@ namespace AyaNova.Api.Controllers { return BadRequest(new ApiErrorResponse(biz.Errors)); } - - await ct.SaveChangesAsync(); - //Log EventLogProcessor.DeleteObject(biz.userId, AyaType.Tag, dbObj.Id, dbObj.Name, ct); + await ct.SaveChangesAsync(); + + return NoContent(); } diff --git a/server/AyaNova/Controllers/TrialController.cs b/server/AyaNova/Controllers/TrialController.cs index 8260650a..a8737860 100644 --- a/server/AyaNova/Controllers/TrialController.cs +++ b/server/AyaNova/Controllers/TrialController.cs @@ -86,18 +86,20 @@ namespace AyaNova.Api.Controllers JObject o = JObject.FromObject(new { - seedLevel = seedLevel + seedLevel = seedLevel }); OpsJob j = new OpsJob(); j.Name = $"Seed test data (size={size})"; j.JobType = JobType.SeedTestData; - j.Exclusive=true;//don't run other jobs, this will erase the db + j.Exclusive = true;//don't run other jobs, this will erase the db j.JobInfo = o.ToString(); JobsBiz.AddJob(j, ct); - //Log - //EventLogProcessor.AddEntry(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.TrialSeeder, AyaEvent.Created,size), ct); + //Log + EventLogProcessor.AddEntry(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.TrialSeeder, AyaEvent.Created, size), ct); + ct.SaveChanges(); + return Accepted(new { JobId = j.GId });//202 accepted diff --git a/server/AyaNova/Controllers/WidgetController.cs b/server/AyaNova/Controllers/WidgetController.cs index 235732e1..690d358a 100644 --- a/server/AyaNova/Controllers/WidgetController.cs +++ b/server/AyaNova/Controllers/WidgetController.cs @@ -86,8 +86,8 @@ namespace AyaNova.Api.Controllers } //Log - EventLogProcessor.AddEntryAndSave(new Event(biz.userId, o.Id, AyaType.Widget, AyaEvent.Retrieved), ct); - + EventLogProcessor.AddEntry(new Event(biz.userId, o.Id, AyaType.Widget, AyaEvent.Retrieved), ct); + ct.SaveChanges(); return Ok(new ApiOkResponse(o)); } @@ -217,7 +217,7 @@ namespace AyaNova.Api.Controllers try { //Log - EventLogProcessor.AddEntryNoSave(new Event(biz.userId, o.Id, AyaType.Widget, AyaEvent.Modified), ct); + EventLogProcessor.AddEntry(new Event(biz.userId, o.Id, AyaType.Widget, AyaEvent.Modified), ct); await ct.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) @@ -293,7 +293,7 @@ namespace AyaNova.Api.Controllers try { //Log - EventLogProcessor.AddEntryNoSave(new Event(biz.userId, o.Id, AyaType.Widget, AyaEvent.Modified), ct); + EventLogProcessor.AddEntry(new Event(biz.userId, o.Id, AyaType.Widget, AyaEvent.Modified), ct); await ct.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) @@ -355,13 +355,15 @@ namespace AyaNova.Api.Controllers } else { - //Log - EventLogProcessor.AddEntryNoSave(new Event(biz.userId, o.Id, AyaType.Widget, AyaEvent.Created), ct); - //save and success return + + //save to get Id await ct.SaveChangesAsync(); - + //Log now that we have the Id + EventLogProcessor.AddEntry(new Event(biz.userId, o.Id, AyaType.Widget, AyaEvent.Created), ct); + await ct.SaveChangesAsync(); + //return success and link return CreatedAtAction("GetWidget", new { id = o.Id }, new ApiCreatedResponse(o)); } } @@ -409,13 +411,15 @@ namespace AyaNova.Api.Controllers { return BadRequest(new ApiErrorResponse(biz.Errors)); } + + //Log + EventLogProcessor.DeleteObject(biz.userId, AyaType.Widget, dbObj.Id, dbObj.Name, ct); + await ct.SaveChangesAsync(); //Delete children / attached objects biz.DeleteChildren(dbObj); - //Log - EventLogProcessor.DeleteObject(biz.userId, AyaType.Widget, dbObj.Id, dbObj.Name, ct); return NoContent(); } diff --git a/server/AyaNova/biz/EventLogProcessor.cs b/server/AyaNova/biz/EventLogProcessor.cs index 23ee8f7c..7ade3dcb 100644 --- a/server/AyaNova/biz/EventLogProcessor.cs +++ b/server/AyaNova/biz/EventLogProcessor.cs @@ -22,23 +22,12 @@ namespace AyaNova.Biz /// /// /// - internal static void AddEntryNoSave(Event newEvent, AyContext ct) + internal static void AddEntry(Event newEvent, AyContext ct) { ct.Event.Add(newEvent); } - /// - /// Add and SAVE entry to the log - /// - /// - /// - /// - internal static void AddEntryAndSave(Event newEvent, AyContext ct) - { - ct.Event.Add(newEvent); - ct.SaveChanges(); - } - + /// /// Handle delete @@ -52,8 +41,7 @@ namespace AyaNova.Biz internal static void DeleteObject(long userId, AyaType ayType, long ayId, string textra, AyContext ct) { ct.Database.ExecuteSqlCommand($"delete from aevent where aytype = {ayType} and ayid={ayId}"); - ct.Event.Add(new Event(userId, ayId, ayType, AyaEvent.Deleted, textra)); - ct.SaveChanges(); + ct.Event.Add(new Event(userId, ayId, ayType, AyaEvent.Deleted, textra)); } /// diff --git a/server/AyaNova/util/Seeder.cs b/server/AyaNova/util/Seeder.cs index 4433bde4..c3b8d57b 100644 --- a/server/AyaNova/util/Seeder.cs +++ b/server/AyaNova/util/Seeder.cs @@ -291,7 +291,7 @@ namespace AyaNova.Util //Now we have all the id's can actually add them to the context foreach (long l in WidgetsAdded) { - EventLogProcessor.AddEntryNoSave(new Event(1, l, AyaType.Widget, AyaEvent.Created), ct); + EventLogProcessor.AddEntry(new Event(1, l, AyaType.Widget, AyaEvent.Created), ct); } //Now save the Event Log entries