From 85ddf8bd7b56ffe80050f45029afaa1885eb5979 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Mon, 16 Mar 2020 20:01:36 +0000 Subject: [PATCH] --- .../AyaNova/Controllers/PickListController.cs | 44 ++++++++++++++++++- server/AyaNova/PickList/PickListSqlBuilder.cs | 5 ++- 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/server/AyaNova/Controllers/PickListController.cs b/server/AyaNova/Controllers/PickListController.cs index 4bd3822c..8e2ac8d8 100644 --- a/server/AyaNova/Controllers/PickListController.cs +++ b/server/AyaNova/Controllers/PickListController.cs @@ -44,10 +44,18 @@ namespace AyaNova.Api.Controllers /// /// Get picklist of all Active objects of type specified and filtered by query specified + /// NOTE: Query is valid only if: + /// it is an empty string indicating not filtered just selected + /// if not an empty string, it has at most two space separated strings and one of them is a special TAG specific query that starts with two consecutive periods + /// i.e. "some" is valid (single query on all templated fields) + /// "..zon some" is valid (all tags like zon and all template fields like some) + /// "zon some" is NOT valid (missing TAGS indicator), "..zone some re" is NOT valid (too many strings) /// Note that this list is capped automatically to return no more than 100 results /// /// The AyaType object type to select from - /// The query to filter the returned list by + /// The query to filter the returned list by. Query text as provided will be case sensitively matched to all templated fields. + /// Independantely of this, if an addition space separated string that begins with two consecutive periods is encountered that will be considered a separate match to the TAGS collection of each object + /// So a tag query might be entered as "..zon some" which would match all tags LIKE 'zon' and template fields LIKE 'some' /// Include inactive objects in the returned list /// Filtered list [HttpGet("List")] @@ -68,9 +76,43 @@ namespace AyaNova.Api.Controllers if (!ModelState.IsValid) return BadRequest(new ApiErrorResponse(ModelState)); + //Here need to handle scenario of badly formed query so user knows they did it wrong and doesn't just assume it's not there + /* + string TagSpecificQuery=string.Empty; + + //determine if this is a tag query + if(HasAutoCompleteQuery){ + if(autoCompleteQuery.Contains(" ")){ + //split the query on space + var querySegments=autoCompleteQuery.Split(' '); + //users may type several spaces in a regular query, so ignore that and only use the first two segments + if(querySegments[0].Contains("..")){ + TagSpecificQuery=querySegments[0].Replace("..",""); + //the second string is considered the + autoCompleteQuery=querySegments[1]; + }else{ + + } + + } + } + */ + var UserRoles = UserRolesFromContext.Roles(HttpContext.Items); var o = await biz.GetPickListAsync(ayaType, query, inactive, UserRoles); + +/* this is how a bad validation is handled in a widget post +//we need to validate the query and return an explanation if it's bad so user doesn't get confused and think theya re doing the right thing but not getting results anyway + //Create and validate + Widget o = await biz.CreateAsync(inObj); + if (o == null) + return BadRequest(new ApiErrorResponse(biz.Errors)); + else + return CreatedAtAction(nameof(WidgetController.GetWidget), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + +*/ + if (o == null) return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); diff --git a/server/AyaNova/PickList/PickListSqlBuilder.cs b/server/AyaNova/PickList/PickListSqlBuilder.cs index 23e3eb19..f5dfa16a 100644 --- a/server/AyaNova/PickList/PickListSqlBuilder.cs +++ b/server/AyaNova/PickList/PickListSqlBuilder.cs @@ -15,12 +15,13 @@ namespace AyaNova.PickList const int MAXIMUM_RESULT_COUNT = 100; //Build the query for a picklist request - internal static string Build(IAyaPickList pickList, List templateColumnNames, string autoCompleteQuery, bool IncludeInactive) + internal static string Build(IAyaPickList pickList, List templateColumnNames, string autoCompleteQuery, string tagSpecificQuery, bool IncludeInactive) { - + //determine this in advance as it will be used in a loop later bool HasAutoCompleteQuery = !string.IsNullOrWhiteSpace(autoCompleteQuery); + //lists to collect the clauses so to avoid comma fuckery List lSelect = new List();