From 5e336762f6d553f9efd2bd6e8dfbe31c3126bf64 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Fri, 7 Sep 2018 16:34:05 +0000 Subject: [PATCH] --- devdocs/todo.txt | 7 +- server/AyaNova/Controllers/TagController.cs | 9 +- .../AyaNova/Controllers/TagGroupController.cs | 6 +- server/AyaNova/biz/TagGroupMapBiz.cs | 2 +- server/AyaNova/util/AySchema.cs | 4 +- test/raven-integration/Tags/TagMapOps.cs | 105 ++++++++++++++++++ 6 files changed, 118 insertions(+), 15 deletions(-) diff --git a/devdocs/todo.txt b/devdocs/todo.txt index 87f19f96..b94c267b 100644 --- a/devdocs/todo.txt +++ b/devdocs/todo.txt @@ -30,14 +30,13 @@ IMMEDIATE ITEMS: - Tag groups (modify tags already coded) - - X Modify tag to bring combined list of groups with tag picklist (NOPE, let the UI query both separately and integrate them at the UI level) - - Modify tag to remove itself from tagroupmap if deleted + - Tag: add test for untag everything - TAG: add test that can't delete if it's in a taggroup mapping - TAGGrOUP: add tests for all crud ops - TESTS: Make a test for each type of group operation from biz point of view - - TAGMAP: code to tag an item should take into account if it's already tagged and not make a new record, just return existing - - TAGGROUPMAP: add tagGROUPMAP should take into account if already added + - TAGMAP: CREATEASYNC code to tag an item should take into account if it's already tagged and not make a new record, just return existing + - TAGGROUPMAP: add tagGROUPMAP CREATEASYNC should take into account if already added //TODO: see if already present and just return inObj if so - Localized text - ** DEVISE a system to ensure no unused keys are brought forward to raven diff --git a/server/AyaNova/Controllers/TagController.cs b/server/AyaNova/Controllers/TagController.cs index 90a3e165..09471903 100644 --- a/server/AyaNova/Controllers/TagController.cs +++ b/server/AyaNova/Controllers/TagController.cs @@ -320,9 +320,9 @@ namespace AyaNova.Api.Controllers /// Untag all objects with this tag /// Required roles: BizAdminFull, DispatchFull, InventoryFull, TechFull, AccountingFull /// - /// + /// TagId /// Ok - [HttpDelete("{id}")] + [HttpPost("UntagAll/{id}")] public async Task UnTagEverything([FromRoute] long id) { @@ -352,9 +352,8 @@ namespace AyaNova.Api.Controllers //Instantiate the business object handler TagBiz biz = new TagBiz(ct, UserId, UserRolesFromContext.Roles(HttpContext.Items)); - //NOTE: ct.SaveChanges not required after this call - //Delete will look after it as it also needs to delete related records manully that are not mapped in EF Core - if (!biz.Delete(dbObj)) + //Untag from all places + if (!biz.Untag(dbObj)) { return BadRequest(new ApiErrorResponse(biz.Errors)); } diff --git a/server/AyaNova/Controllers/TagGroupController.cs b/server/AyaNova/Controllers/TagGroupController.cs index 4b3ea5ed..aaf35211 100644 --- a/server/AyaNova/Controllers/TagGroupController.cs +++ b/server/AyaNova/Controllers/TagGroupController.cs @@ -99,8 +99,8 @@ namespace AyaNova.Api.Controllers /// /// /// Paged id/name collection of TagGroups with paging data - [HttpGet("PickList", Name = nameof(PickList))] - public async Task PickList([FromQuery] string q, [FromQuery] PagingOptions pagingOptions) + [HttpGet("TagGroupPickList", Name = nameof(TagGroupPickList))] + public async Task TagGroupPickList([FromQuery] string q, [FromQuery] PagingOptions pagingOptions) { if (!serverState.IsOpen) { @@ -120,7 +120,7 @@ namespace AyaNova.Api.Controllers //Instantiate the business object handler TagGroupBiz biz = new TagGroupBiz(ct, UserIdFromContext.Id(HttpContext.Items), UserRolesFromContext.Roles(HttpContext.Items)); - ApiPagedResponse pr = await biz.GetPickListAsync(Url, nameof(PickList), pagingOptions, q); + ApiPagedResponse pr = await biz.GetPickListAsync(Url, nameof(TagGroupPickList), pagingOptions, q); return Ok(new ApiOkWithPagingResponse(pr)); } diff --git a/server/AyaNova/biz/TagGroupMapBiz.cs b/server/AyaNova/biz/TagGroupMapBiz.cs index b0251d25..d532cc52 100644 --- a/server/AyaNova/biz/TagGroupMapBiz.cs +++ b/server/AyaNova/biz/TagGroupMapBiz.cs @@ -36,7 +36,7 @@ namespace AyaNova.Biz internal async Task CreateAsync(TagGroupMapInfo inObj) { //TODO: see if already present and just return inObj if so - if(ct.TagGroupMap.Any().where) + // if(ct.TagGroupMap.Any().where) Validate(inObj, true); diff --git a/server/AyaNova/util/AySchema.cs b/server/AyaNova/util/AySchema.cs index e1588b8b..cefc1594 100644 --- a/server/AyaNova/util/AySchema.cs +++ b/server/AyaNova/util/AySchema.cs @@ -22,8 +22,8 @@ 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 = 83; - internal const long EXPECTED_INDEX_COUNT = 16; + internal const long EXPECTED_COLUMN_COUNT = 90; + internal const long EXPECTED_INDEX_COUNT = 18; //!!!!WARNING: BE SURE TO UPDATE THE DbUtil::PrepareDatabaseForSeeding WHEN NEW TABLES ADDED!!!! ///////////////////////////////////////////////////////////////// diff --git a/test/raven-integration/Tags/TagMapOps.cs b/test/raven-integration/Tags/TagMapOps.cs index db3e5826..afa191ee 100644 --- a/test/raven-integration/Tags/TagMapOps.cs +++ b/test/raven-integration/Tags/TagMapOps.cs @@ -257,6 +257,111 @@ namespace raven_integration + /// + /// Test tagging a bunch of items then mass untag + /// + [Fact] + public async void UnTagEverythingWorks() + { + /* + { + "name": "TestTag" + } + */ + + //CREATE TAG + dynamic D = new JObject(); + D.name = Util.Uniquify("test-tag-4-untag"); + + + ApiResponse R = await Util.PostAsync("Tag", await Util.GetTokenAsync("BizAdminFull"), D.ToString()); + Util.ValidateDataReturnResponseOk(R); + long TestTagId = R.ObjectResponse["result"]["id"].Value(); + + + //CREATE WIDGET 1 + dynamic D2 = new JObject(); + D2.name = Util.Uniquify("WIDGET_UNTAG_TEST1"); + D2.created = DateTime.Now.ToString(); + D2.dollarAmount = 1.11m; + D2.active = true; + D2.roles = 0; + + R = await Util.PostAsync("Widget", await Util.GetTokenAsync("BizAdminFull"), D2.ToString()); + Util.ValidateDataReturnResponseOk(R); + long Widget1Id = R.ObjectResponse["result"]["id"].Value(); + + //CREATE WIDGET 2 + //D2 = new JObject(); + D2.name = Util.Uniquify("WIDGET_UNTAG_TEST2"); + D2.created = DateTime.Now.ToString(); + D2.dollarAmount = 1.11m; + D2.active = true; + D2.roles = 0; + + R = await Util.PostAsync("Widget", await Util.GetTokenAsync("BizAdminFull"), D2.ToString()); + Util.ValidateDataReturnResponseOk(R); + long Widget2Id = R.ObjectResponse["result"]["id"].Value(); + + //TAGMAP to Widget 1 + /* + { + "tagId": 0, + "tagToObjectId": 0, + "tagToObjectType": 0 + } + */ + dynamic D3 = new JObject(); + D3.tagId = TestTagId; + D3.tagToObjectId = Widget1Id; + D3.tagToObjectType = 2;//widget + + + R = await Util.PostAsync("TagMap", await Util.GetTokenAsync("BizAdminFull"), D3.ToString()); + Util.ValidateDataReturnResponseOk(R); + long TagMap1Id = R.ObjectResponse["result"]["id"].Value(); + + //VERIFY TAGMAP + R = await Util.GetAsync("TagMap/" + TagMap1Id.ToString(), await Util.GetTokenAsync("BizAdminFull")); + Util.ValidateDataReturnResponseOk(R); + R.ObjectResponse["result"]["id"].Value().Should().Be(TagMap1Id); + R.ObjectResponse["result"]["tagToObjectId"].Value().Should().Be(Widget1Id); + + + //TAGMAP to Widget 2 + D3.tagId = TestTagId; + D3.tagToObjectId = Widget2Id; + D3.tagToObjectType = 2;//widget + + + R = await Util.PostAsync("TagMap", await Util.GetTokenAsync("BizAdminFull"), D3.ToString()); + Util.ValidateDataReturnResponseOk(R); + long TagMap2Id = R.ObjectResponse["result"]["id"].Value(); + + //VERIFY TAGMAP + R = await Util.GetAsync("TagMap/" + TagMap2Id.ToString(), await Util.GetTokenAsync("BizAdminFull")); + Util.ValidateDataReturnResponseOk(R); + R.ObjectResponse["result"]["id"].Value().Should().Be(TagMap2Id); + R.ObjectResponse["result"]["tagToObjectId"].Value().Should().Be(Widget2Id); + + //UNTAG-ALL + R = await Util.PostAsync("Tag/UntagAll/" + TestTagId.ToString(), await Util.GetTokenAsync("BizAdminFull")); + Util.ValidateHTTPStatusCode(R, 204); + + + //DELETE TAG + //This should now work because untag all freed it up + R = await Util.DeleteAsync("Tag/" + TestTagId.ToString(), await Util.GetTokenAsync("BizAdminFull")); + Util.ValidateHTTPStatusCode(R, 204); + + //DELETE WIDGETS + R = await Util.DeleteAsync("Widget/" + Widget1Id.ToString(), await Util.GetTokenAsync("BizAdminFull")); + Util.ValidateHTTPStatusCode(R, 204); + + R = await Util.DeleteAsync("Widget/" + Widget2Id.ToString(), await Util.GetTokenAsync("BizAdminFull")); + Util.ValidateHTTPStatusCode(R, 204); + } +