From a1e1eb93764c868bc984d3a76206d8c4e9408b73 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Thu, 23 Aug 2018 20:42:47 +0000 Subject: [PATCH] --- devdocs/todo.txt | 4 ++ .../AyaNova/Controllers/WidgetController.cs | 38 ++++++++++----- server/AyaNova/biz/EventLogProcessor.cs | 21 ++++++++- server/AyaNova/biz/WidgetBiz.cs | 46 ++++--------------- server/AyaNova/util/AySchema.cs | 2 + server/AyaNova/util/DbUtil.cs | 1 + server/AyaNova/util/Seeder.cs | 16 ++++--- 7 files changed, 69 insertions(+), 59 deletions(-) diff --git a/devdocs/todo.txt b/devdocs/todo.txt index 45927e0d..b06c7a45 100644 --- a/devdocs/todo.txt +++ b/devdocs/todo.txt @@ -20,6 +20,10 @@ 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 + - CRUD methods for widget + - replicate crud to other objects + - Route for retrieving as log format for reading (like reports: one for specific object id and type, one for user id as log of what they've been doing etc) + - Test with huge dataset - Localized text - Search and search text indexing - Auto visible id number assigning code diff --git a/server/AyaNova/Controllers/WidgetController.cs b/server/AyaNova/Controllers/WidgetController.cs index 3ab92b34..17604f1a 100644 --- a/server/AyaNova/Controllers/WidgetController.cs +++ b/server/AyaNova/Controllers/WidgetController.cs @@ -85,6 +85,9 @@ namespace AyaNova.Api.Controllers return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); } + //Log + EventLogProcessor.AddEntry(new Event(biz.userId, o.Id, AyaType.Widget, AyaEvent.Retrieved), ct); + return Ok(new ApiOkResponse(o)); } @@ -191,14 +194,14 @@ namespace AyaNova.Api.Controllers return BadRequest(new ApiErrorResponse(ModelState)); } - var oFromDb = await ct.Widget.SingleOrDefaultAsync(m => m.Id == id); + var o = await ct.Widget.SingleOrDefaultAsync(m => m.Id == id); - if (oFromDb == null) + if (o == null) { return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); } - if (!Authorized.IsAuthorizedToModify(HttpContext.Items, AyaType.Widget, oFromDb.OwnerId)) + if (!Authorized.IsAuthorizedToModify(HttpContext.Items, AyaType.Widget, o.OwnerId)) { return StatusCode(401, new ApiNotAuthorizedResponse()); } @@ -206,7 +209,7 @@ namespace AyaNova.Api.Controllers //Instantiate the business object handler WidgetBiz biz = new WidgetBiz(ct, UserIdFromContext.Id(HttpContext.Items), UserRolesFromContext.Roles(HttpContext.Items)); - if (!biz.Put(oFromDb, inObj)) + if (!biz.Put(o, inObj)) { return BadRequest(new ApiErrorResponse(biz.Errors)); } @@ -230,7 +233,10 @@ namespace AyaNova.Api.Controllers } } - return Ok(new ApiOkResponse(new { ConcurrencyToken = oFromDb.ConcurrencyToken })); + //Log + EventLogProcessor.AddEntry(new Event(biz.userId, o.Id, AyaType.Widget, AyaEvent.Modified), ct); + + return Ok(new ApiOkResponse(new { ConcurrencyToken = o.ConcurrencyToken })); } @@ -265,20 +271,20 @@ namespace AyaNova.Api.Controllers WidgetBiz biz = new WidgetBiz(ct, UserIdFromContext.Id(HttpContext.Items), UserRolesFromContext.Roles(HttpContext.Items)); - var oFromDb = await ct.Widget.SingleOrDefaultAsync(m => m.Id == id); + var o = await ct.Widget.SingleOrDefaultAsync(m => m.Id == id); - if (oFromDb == null) + if (o == null) { return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); } - if (!Authorized.IsAuthorizedToModify(HttpContext.Items, AyaType.Widget, oFromDb.OwnerId)) + if (!Authorized.IsAuthorizedToModify(HttpContext.Items, AyaType.Widget, o.OwnerId)) { return StatusCode(401, new ApiNotAuthorizedResponse()); } //patch and validate - if (!biz.Patch(oFromDb, objectPatch, concurrencyToken)) + if (!biz.Patch(o, objectPatch, concurrencyToken)) { return BadRequest(new ApiErrorResponse(biz.Errors)); } @@ -299,7 +305,11 @@ namespace AyaNova.Api.Controllers } } - return Ok(new ApiOkResponse(new { ConcurrencyToken = oFromDb.ConcurrencyToken })); + + //Log + EventLogProcessor.AddEntry(new Event(biz.userId, o.Id, AyaType.Widget, AyaEvent.Modified), ct); + + return Ok(new ApiOkResponse(new { ConcurrencyToken = o.ConcurrencyToken })); } @@ -346,8 +356,9 @@ namespace AyaNova.Api.Controllers //save and success return await ct.SaveChangesAsync(); - //Only here process save event?? - EventLogProcessor.AddEntry(); + //Log + EventLogProcessor.AddEntry(new Event(biz.userId, o.Id, AyaType.Widget, AyaEvent.Created), ct); + return CreatedAtAction("GetWidget", new { id = o.Id }, new ApiCreatedResponse(o)); } } @@ -400,6 +411,9 @@ namespace AyaNova.Api.Controllers //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 253f7e27..728e17dc 100644 --- a/server/AyaNova/biz/EventLogProcessor.cs +++ b/server/AyaNova/biz/EventLogProcessor.cs @@ -14,7 +14,7 @@ namespace AyaNova.Biz { private static ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger("EventLogProcessor"); - /// + /// /// Add an entry to the log /// /// @@ -23,7 +23,24 @@ namespace AyaNova.Biz internal static void AddEntry(Event newEvent, AyContext ct) { ct.Event.Add(newEvent); - ct.SaveChanges(); + ct.SaveChanges(); + } + + + /// + /// Handle delete + /// remove all prior entries for object, add one deleted entry + /// + /// + /// + /// + /// + /// + internal static void DeleteObject(long userId, AyaType ayType, long ayId, string textra, AyContext ct) + { + ct.Database.ExecuteSqlCommand("delete from aevent where aytype = {0} and ayid={1}", new object[] { (int)ayType }, new object[] { ayId }); + ct.Event.Add(new Event(userId, ayId, ayType, AyaEvent.Deleted, textra)); + ct.SaveChanges(); } diff --git a/server/AyaNova/biz/WidgetBiz.cs b/server/AyaNova/biz/WidgetBiz.cs index e6a7a8e7..68600af7 100644 --- a/server/AyaNova/biz/WidgetBiz.cs +++ b/server/AyaNova/biz/WidgetBiz.cs @@ -17,7 +17,7 @@ namespace AyaNova.Biz internal class WidgetBiz : BizObject, IJobObject { private readonly AyContext ct; - private readonly long userId; + public readonly long userId; private readonly AuthorizationRoles userRoles; @@ -38,43 +38,13 @@ namespace AyaNova.Biz return null; else { - - - using (var trans = ct.Database.BeginTransaction()) - { - // try - // { - //do stuff with widget - Widget outObj = inObj; - outObj.OwnerId = userId; - //SearchHelper(break down text fields, save to db) - //TagHelper(collection of tags??) - await ct.Widget.AddAsync(outObj); - - //Log creation - Event ev = new Event(); - ev.AyEvent = AyaEvent.Created; - ev.AyId = outObj.Id; - ev.AyType = AyaType.Widget; - ev.OwnerId = outObj.OwnerId; - await ct.Event.AddAsync(ev); - - - // Commit transaction if all commands succeed, transaction will auto-rollback - // when disposed if either commands fails - trans.Commit(); - - return outObj; - // } - // catch (Exception ex) - // { - // throw ex; - // } - } - - - - + //do stuff with widget + Widget outObj = inObj; + outObj.OwnerId = userId; + //SearchHelper(break down text fields, save to db) + //TagHelper(collection of tags??) + await ct.Widget.AddAsync(outObj); + return outObj; } } diff --git a/server/AyaNova/util/AySchema.cs b/server/AyaNova/util/AySchema.cs index 0484a3a9..b97b3159 100644 --- a/server/AyaNova/util/AySchema.cs +++ b/server/AyaNova/util/AySchema.cs @@ -19,10 +19,12 @@ namespace AyaNova.Util ///////////////////////////////////////////////////////////////// /////////// CHANGE THIS ON NEW SCHEMA UPDATE //////////////////// + //!!!!WARNING: BE SURE TO UPDATE THE DbUtil::PrepareDatabaseForSeeding WHEN NEW TABLES ADDED!!!! private const int DESIRED_SCHEMA_LEVEL = 9; internal const long EXPECTED_COLUMN_COUNT = 76; internal const long EXPECTED_INDEX_COUNT = 15; + //!!!!WARNING: BE SURE TO UPDATE THE DbUtil::PrepareDatabaseForSeeding WHEN NEW TABLES ADDED!!!! ///////////////////////////////////////////////////////////////// diff --git a/server/AyaNova/util/DbUtil.cs b/server/AyaNova/util/DbUtil.cs index f9e3eabc..fe1696a8 100644 --- a/server/AyaNova/util/DbUtil.cs +++ b/server/AyaNova/util/DbUtil.cs @@ -278,6 +278,7 @@ namespace AyaNova.Util EraseTable("atag", conn); EraseTable("afileattachment", conn); EraseTable("awidget", conn); + EraseTable("aevent", conn); conn.Close(); } diff --git a/server/AyaNova/util/Seeder.cs b/server/AyaNova/util/Seeder.cs index 44f13151..2dbc1205 100644 --- a/server/AyaNova/util/Seeder.cs +++ b/server/AyaNova/util/Seeder.cs @@ -38,11 +38,11 @@ namespace AyaNova.Util { ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger("Seeder"); ApiServerState apiServerState = (ApiServerState)ServiceProviderProvider.Provider.GetService(typeof(ApiServerState)); - + //get the current server state so can set back to it later ApiServerState.ServerState wasServerState = apiServerState.GetState(); - string wasReason=apiServerState.Reason; - + string wasReason = apiServerState.Reason; + try { log.LogInformation("SEEDER: SeedDatabase, level is: " + slevel.ToString()); @@ -230,7 +230,7 @@ namespace AyaNova.Util for (int x = 0; x < count; x++) { User u = new User(); - var p = new Bogus.Person(); + var p = new Bogus.Person(); u.Name = p.FullName; u.Salt = Hasher.GenerateSalt(); if (login != null) @@ -245,7 +245,7 @@ namespace AyaNova.Util else u.Password = Hasher.hash(u.Salt, u.Login); u.Roles = roles; - u.LocaleId=ServerBootConfig.AYANOVA_DEFAULT_LANGUAGE_ID; + u.LocaleId = ServerBootConfig.AYANOVA_DEFAULT_LANGUAGE_ID; ct.User.Add(u); } ct.SaveChanges(); @@ -264,7 +264,7 @@ namespace AyaNova.Util var f = new Bogus.Faker(); o.Name = f.Commerce.ProductName(); o.Active = f.Random.Bool(); - + o.StartDate = f.Date.Between(DateTime.Now, DateTime.Now.AddMinutes(60)); o.EndDate = f.Date.Between(DateTime.Now.AddMinutes(90), DateTime.Now.AddHours(5)); @@ -273,8 +273,10 @@ namespace AyaNova.Util //this is nonsense but just to test an enum o.Roles = AuthorizationRoles.DispatchLimited | AuthorizationRoles.InventoryLimited | AuthorizationRoles.OpsAdminLimited; ct.Widget.Add(o); + ct.SaveChanges(); + EventLogProcessor.AddEntry(new Event(o.OwnerId, o.Id, AyaType.Widget, AyaEvent.Created), ct); } - ct.SaveChanges(); + }