From a9f60453c6ad55826eeaaaeb8469a71fe03a5f04 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Wed, 19 Sep 2018 00:00:30 +0000 Subject: [PATCH] --- .../ControllerHelpers/LocaleIdFromContext.cs | 15 ++++++++ .../ControllerHelpers/UserIdFromContext.cs | 5 --- .../AyaNova/Controllers/WidgetController.cs | 8 ++-- server/AyaNova/biz/Search.cs | 20 +++++++++- server/AyaNova/biz/WidgetBiz.cs | 2 +- server/AyaNova/models/Widget.cs | 2 +- server/AyaNova/util/AySchema.cs | 6 +-- test/raven-integration/Widget/WidgetCrud.cs | 38 ++++++++++--------- 8 files changed, 64 insertions(+), 32 deletions(-) create mode 100644 server/AyaNova/ControllerHelpers/LocaleIdFromContext.cs diff --git a/server/AyaNova/ControllerHelpers/LocaleIdFromContext.cs b/server/AyaNova/ControllerHelpers/LocaleIdFromContext.cs new file mode 100644 index 00000000..c2bfe86c --- /dev/null +++ b/server/AyaNova/ControllerHelpers/LocaleIdFromContext.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; + +namespace AyaNova.Api.ControllerHelpers +{ + internal static class LocaleIdFromContext + { + internal static long Id(IDictionary HttpContextItems) + { + long? l = (long?)HttpContextItems["AY_LOCALE_ID"]; + if (l == null) + return AyaNova.Util.ServerBootConfig.AYANOVA_DEFAULT_LANGUAGE_ID; + return (long)l; + } + } +}//eons \ No newline at end of file diff --git a/server/AyaNova/ControllerHelpers/UserIdFromContext.cs b/server/AyaNova/ControllerHelpers/UserIdFromContext.cs index 5563c309..85177d5b 100644 --- a/server/AyaNova/ControllerHelpers/UserIdFromContext.cs +++ b/server/AyaNova/ControllerHelpers/UserIdFromContext.cs @@ -1,10 +1,7 @@ -using EnumsNET; using System.Collections.Generic; namespace AyaNova.Api.ControllerHelpers { - - internal static class UserIdFromContext { internal static long Id(IDictionary HttpContextItems) @@ -16,6 +13,4 @@ namespace AyaNova.Api.ControllerHelpers return (long)l; } } - - }//eons \ No newline at end of file diff --git a/server/AyaNova/Controllers/WidgetController.cs b/server/AyaNova/Controllers/WidgetController.cs index afe19226..5dbb6670 100644 --- a/server/AyaNova/Controllers/WidgetController.cs +++ b/server/AyaNova/Controllers/WidgetController.cs @@ -210,6 +210,7 @@ namespace AyaNova.Api.Controllers { //Log EventLogProcessor.AddEntry(new Event(biz.userId, o.Id, AyaType.Widget, AyaEvent.Modified), ct); + Search.ProcessUpdatedObjectKeywords(ct, LocaleIdFromContext.Id(HttpContext.Items), o.Id, AyaType.Widget, o.Name, o.Notes); await ct.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) @@ -286,6 +287,7 @@ namespace AyaNova.Api.Controllers { //Log EventLogProcessor.AddEntry(new Event(biz.userId, o.Id, AyaType.Widget, AyaEvent.Modified), ct); + Search.ProcessUpdatedObjectKeywords(ct, LocaleIdFromContext.Id(HttpContext.Items), o.Id, AyaType.Widget, o.Name, o.Notes); await ct.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) @@ -300,9 +302,6 @@ namespace AyaNova.Api.Controllers } } - - - return Ok(new ApiOkResponse(new { ConcurrencyToken = o.ConcurrencyToken })); } @@ -353,6 +352,7 @@ namespace AyaNova.Api.Controllers //Log now that we have the Id EventLogProcessor.AddEntry(new Event(biz.userId, o.Id, AyaType.Widget, AyaEvent.Created), ct); + Search.ProcessNewObjectKeywords(ct, LocaleIdFromContext.Id(HttpContext.Items), o.Id, AyaType.Widget, o.Name, o.Notes); await ct.SaveChangesAsync(); //return success and link @@ -406,7 +406,7 @@ namespace AyaNova.Api.Controllers //Log EventLogProcessor.DeleteObject(biz.userId, AyaType.Widget, dbObj.Id, dbObj.Name, ct); - + Search.ProcessDeletedObjectKeywords(ct, dbObj.Id, AyaType.Widget); await ct.SaveChangesAsync(); //Delete children / attached objects diff --git a/server/AyaNova/biz/Search.cs b/server/AyaNova/biz/Search.cs index ad4e3fee..9e1945b6 100644 --- a/server/AyaNova/biz/Search.cs +++ b/server/AyaNova/biz/Search.cs @@ -21,10 +21,28 @@ namespace AyaNova.Biz //ProcessKeywords into database #region ProcessKeywords into Database + + public static void ProcessNewObjectKeywords(AyContext ct, long localeId, long objectID, AyaType objectType, string name, params string[] text) + { + ProcessKeywords(ct, localeId, objectID, objectType, true, name, text); + } + + public static void ProcessUpdatedObjectKeywords(AyContext ct, long localeId, long objectID, AyaType objectType, string name, params string[] text) + { + ProcessKeywords(ct, localeId, objectID, objectType, false, name, text); + } + + public static void ProcessDeletedObjectKeywords(AyContext ct, long objectID, AyaType objectType) + { + throw new System.NotImplementedException("Search::ProcessDeletedObjectKeywords NOT CODED YET"); + //ProcessKeywords(ct, localeId, objectID, objectType, false, name, text); + } + + /// /// Process the keywords into the dictionary /// - public static void ProcessKeywords(AyContext ct, long localeId, long objectID, AyaType objectType, bool newRecord, string keyWords, string name) + private static void ProcessKeywords(AyContext ct, long localeId, long objectID, AyaType objectType, bool newRecord, string name, params string[] text) { diff --git a/server/AyaNova/biz/WidgetBiz.cs b/server/AyaNova/biz/WidgetBiz.cs index 2d4176b9..7b1428bc 100644 --- a/server/AyaNova/biz/WidgetBiz.cs +++ b/server/AyaNova/biz/WidgetBiz.cs @@ -41,7 +41,7 @@ namespace AyaNova.Biz //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/models/Widget.cs b/server/AyaNova/models/Widget.cs index 0eed2ac6..43136b93 100644 --- a/server/AyaNova/models/Widget.cs +++ b/server/AyaNova/models/Widget.cs @@ -21,7 +21,7 @@ namespace AyaNova.Models public AuthorizationRoles Roles { get; set; } public DateTime? StartDate { get; set; } public DateTime? EndDate { get; set; } - + public string Notes { get; set; } } diff --git a/server/AyaNova/util/AySchema.cs b/server/AyaNova/util/AySchema.cs index daa8c5a1..8c1687a8 100644 --- a/server/AyaNova/util/AySchema.cs +++ b/server/AyaNova/util/AySchema.cs @@ -22,7 +22,7 @@ namespace AyaNova.Util //!!!!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 = 98; + internal const long EXPECTED_COLUMN_COUNT = 99; internal const long EXPECTED_INDEX_COUNT = 20; //!!!!WARNING: BE SURE TO UPDATE THE DbUtil::PrepareDatabaseForSeeding WHEN NEW TABLES ADDED!!!! @@ -136,7 +136,7 @@ namespace AyaNova.Util //too little is bad if search takes a dogs age to find anything exec("CREATE TABLE asearchdictionary (id BIGSERIAL PRIMARY KEY, word varchar(255) not null)"); - // exec("CREATE UNIQUE INDEX tagname_idx ON atag (name);"); + // exec("CREATE UNIQUE INDEX tagname_idx ON atag (name);"); exec("CREATE TABLE asearchkey (id BIGSERIAL PRIMARY KEY, wordid bigint not null REFERENCES asearchdictionary (id), objectid bigint not null, objecttype integer not null, inname bool not null)"); //create locale text tables @@ -190,7 +190,7 @@ namespace AyaNova.Util //Add widget table //id, text, longtext, boolean, currency, exec("CREATE TABLE awidget (id BIGSERIAL PRIMARY KEY, ownerid bigint not null, name varchar(255) not null, " + - "startdate timestamp, enddate timestamp, dollaramount decimal(19,5), active bool, roles int4)"); + "startdate timestamp, enddate timestamp, dollaramount decimal(19,5), active bool, roles int4, notes text)"); setSchemaLevel(++currentSchema); } diff --git a/test/raven-integration/Widget/WidgetCrud.cs b/test/raven-integration/Widget/WidgetCrud.cs index 51515dc6..3f3ecc70 100644 --- a/test/raven-integration/Widget/WidgetCrud.cs +++ b/test/raven-integration/Widget/WidgetCrud.cs @@ -8,7 +8,7 @@ namespace raven_integration public class WidgetCrud { - + /// /// Test all CRUD routes for a widget /// @@ -30,6 +30,7 @@ namespace raven_integration w1.dollarAmount = 1.11m; w1.active = true; w1.roles = 0; + w1.notes = "The quick brown fox jumped over the six lazy dogs!"; ApiResponse r1 = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w1.ToString()); Util.ValidateDataReturnResponseOk(r1); @@ -41,8 +42,9 @@ namespace raven_integration w2.dollarAmount = 2.22m; w2.active = true; w2.roles = 0; + w2.notes = "What is the frequency Kenneth?"; - ApiResponse r2 = await Util.PostAsync("Widget", await Util.GetTokenAsync( "manager", "l3tm3in"), w2.ToString()); + ApiResponse r2 = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w2.ToString()); Util.ValidateDataReturnResponseOk(r2); long w2Id = r2.ObjectResponse["result"]["id"].Value(); @@ -50,9 +52,11 @@ namespace raven_integration //RETRIEVE //Get one - ApiResponse r3 = await Util.GetAsync("Widget/" + w2Id.ToString(), await Util.GetTokenAsync( "manager", "l3tm3in")); + ApiResponse r3 = await Util.GetAsync("Widget/" + w2Id.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateDataReturnResponseOk(r3); r3.ObjectResponse["result"]["name"].Value().Should().Be(w2.name.ToString()); + r3.ObjectResponse["result"]["notes"].Value().Should().Be(w2.notes.ToString()); + @@ -63,11 +67,11 @@ namespace raven_integration w2.name = Util.Uniquify("UPDATED VIA PUT SECOND TEST WIDGET"); w2.OwnerId = 1; w2.concurrencyToken = r2.ObjectResponse["result"]["concurrencyToken"].Value(); - ApiResponse PUTTestResponse = await Util.PutAsync("Widget/" + w2Id.ToString(), await Util.GetTokenAsync( "manager", "l3tm3in"), w2.ToString()); + ApiResponse PUTTestResponse = await Util.PutAsync("Widget/" + w2Id.ToString(), await Util.GetTokenAsync("manager", "l3tm3in"), w2.ToString()); Util.ValidateHTTPStatusCode(PUTTestResponse, 200); //check PUT worked - ApiResponse checkPUTWorked = await Util.GetAsync("Widget/" + w2Id.ToString(), await Util.GetTokenAsync( "manager", "l3tm3in")); + ApiResponse checkPUTWorked = await Util.GetAsync("Widget/" + w2Id.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateNoErrorInResponse(checkPUTWorked); checkPUTWorked.ObjectResponse["result"]["name"].Value().Should().Be(w2.name.ToString()); uint concurrencyToken = PUTTestResponse.ObjectResponse["result"]["concurrencyToken"].Value(); @@ -75,21 +79,21 @@ namespace raven_integration //PATCH var newName = Util.Uniquify("UPDATED VIA PATCH SECOND TEST WIDGET"); string patchJson = "[{\"value\": \"" + newName + "\",\"path\": \"/name\",\"op\": \"replace\"}]"; - ApiResponse PATCHTestResponse = await Util.PatchAsync("Widget/" + w2Id.ToString() + "/" + concurrencyToken.ToString(), await Util.GetTokenAsync( "manager", "l3tm3in"), patchJson); + ApiResponse PATCHTestResponse = await Util.PatchAsync("Widget/" + w2Id.ToString() + "/" + concurrencyToken.ToString(), await Util.GetTokenAsync("manager", "l3tm3in"), patchJson); Util.ValidateHTTPStatusCode(PATCHTestResponse, 200); //check PATCH worked - ApiResponse checkPATCHWorked = await Util.GetAsync("Widget/" + w2Id.ToString(), await Util.GetTokenAsync( "manager", "l3tm3in")); + ApiResponse checkPATCHWorked = await Util.GetAsync("Widget/" + w2Id.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateNoErrorInResponse(checkPATCHWorked); checkPATCHWorked.ObjectResponse["result"]["name"].Value().Should().Be(newName); //DELETE - ApiResponse DELETETestResponse = await Util.DeleteAsync("Widget/" + w2Id.ToString(), await Util.GetTokenAsync( "manager", "l3tm3in")); + ApiResponse DELETETestResponse = await Util.DeleteAsync("Widget/" + w2Id.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateHTTPStatusCode(DELETETestResponse, 204); } - + @@ -101,7 +105,7 @@ namespace raven_integration { //Get non existant //Should return status code 404, api error code 2010 - ApiResponse a = await Util.GetAsync("Widget/999999", await Util.GetTokenAsync( "manager", "l3tm3in")); + ApiResponse a = await Util.GetAsync("Widget/999999", await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateResponseNotFound(a); } @@ -113,7 +117,7 @@ namespace raven_integration { //Get non existant //Should return status code 400, api error code 2200 and a first target in details of "id" - ApiResponse a = await Util.GetAsync("Widget/2q2", await Util.GetTokenAsync( "manager", "l3tm3in")); + ApiResponse a = await Util.GetAsync("Widget/2q2", await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateBadModelStateResponse(a, "id"); } @@ -126,7 +130,7 @@ namespace raven_integration { //Get non existant //Should return status code 400, api error code 2200 and a first target in details of "id" - ApiResponse a = await Util.GetAsync("Widget/exception", await Util.GetTokenAsync( "manager", "l3tm3in")); + ApiResponse a = await Util.GetAsync("Widget/exception", await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateServerExceptionResponse(a); } @@ -140,7 +144,7 @@ namespace raven_integration { //Get non existant //Should return status code 400, api error code 2200 and a first target in details of "id" - ApiResponse a = await Util.GetAsync("Widget/altexception", await Util.GetTokenAsync( "manager", "l3tm3in")); + ApiResponse a = await Util.GetAsync("Widget/altexception", await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateServerExceptionResponse(a); } @@ -162,7 +166,7 @@ namespace raven_integration w2.active = true; w2.roles = 0; - ApiResponse r2 = await Util.PostAsync("Widget", await Util.GetTokenAsync( "manager", "l3tm3in"), w2.ToString()); + ApiResponse r2 = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w2.ToString()); Util.ValidateDataReturnResponseOk(r2); long w2Id = r2.ObjectResponse["result"]["id"].Value(); uint OriginalConcurrencyToken = r2.ObjectResponse["result"]["concurrencyToken"].Value(); @@ -175,7 +179,7 @@ namespace raven_integration w2.name = Util.Uniquify("PutConcurrencyViolationShouldFail UPDATE VIA PUT "); w2.OwnerId = 1; w2.concurrencyToken = OriginalConcurrencyToken - 1;//bad token - ApiResponse PUTTestResponse = await Util.PutAsync("Widget/" + w2Id.ToString(), await Util.GetTokenAsync( "manager", "l3tm3in"), w2.ToString()); + ApiResponse PUTTestResponse = await Util.PutAsync("Widget/" + w2Id.ToString(), await Util.GetTokenAsync("manager", "l3tm3in"), w2.ToString()); Util.ValidateConcurrencyError(PUTTestResponse); @@ -199,7 +203,7 @@ namespace raven_integration w2.active = true; w2.roles = 0; - ApiResponse r2 = await Util.PostAsync("Widget", await Util.GetTokenAsync( "manager", "l3tm3in"), w2.ToString()); + ApiResponse r2 = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), w2.ToString()); Util.ValidateDataReturnResponseOk(r2); long w2Id = r2.ObjectResponse["result"]["id"].Value(); uint OriginalConcurrencyToken = r2.ObjectResponse["result"]["concurrencyToken"].Value(); @@ -208,7 +212,7 @@ namespace raven_integration //PATCH var newName = Util.Uniquify("PutConcurrencyViolationShouldFail UPDATED VIA PATCH"); string patchJson = "[{\"value\": \"" + newName + "\",\"path\": \"/name\",\"op\": \"replace\"}]"; - ApiResponse PATCHTestResponse = await Util.PatchAsync("Widget/" + w2Id.ToString() + "/" + (OriginalConcurrencyToken - 1).ToString(), await Util.GetTokenAsync( "manager", "l3tm3in"), patchJson); + ApiResponse PATCHTestResponse = await Util.PatchAsync("Widget/" + w2Id.ToString() + "/" + (OriginalConcurrencyToken - 1).ToString(), await Util.GetTokenAsync("manager", "l3tm3in"), patchJson); Util.ValidateConcurrencyError(PATCHTestResponse); }