From 49f98efa50f215825ad06eb8f8af37d1e113fe4c Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Fri, 14 Feb 2020 20:36:51 +0000 Subject: [PATCH] --- ...ontroller.cs => DataListViewController.cs} | 44 +++++++++---------- .../DataListSqlFilterCriteriaBuilder.cs | 10 +---- .../{UserDataList.cs => TestUserDataList.cs} | 4 +- server/AyaNova/biz/AyaType.cs | 2 +- .../AyaNova/biz/BizObjectExistsInDatabase.cs | 2 +- server/AyaNova/biz/BizObjectFactory.cs | 4 +- .../AyaNova/biz/BizObjectNameFetcherDirect.cs | 4 +- server/AyaNova/biz/BizRoles.cs | 2 +- ...istSortFilterBiz.cs => DataListViewBiz.cs} | 24 +++++----- server/AyaNova/models/AyContext.cs | 2 +- ...{DataListSortFilter.cs => DataListView.cs} | 6 +-- server/AyaNova/util/AySchema.cs | 8 ++-- server/AyaNova/util/DbUtil.cs | 2 +- 13 files changed, 53 insertions(+), 61 deletions(-) rename server/AyaNova/Controllers/{DataListSortFilterController.cs => DataListViewController.cs} (73%) rename server/AyaNova/DataList/{UserDataList.cs => TestUserDataList.cs} (96%) rename server/AyaNova/biz/{DataListSortFilterBiz.cs => DataListViewBiz.cs} (91%) rename server/AyaNova/models/{DataListSortFilter.cs => DataListView.cs} (70%) diff --git a/server/AyaNova/Controllers/DataListSortFilterController.cs b/server/AyaNova/Controllers/DataListViewController.cs similarity index 73% rename from server/AyaNova/Controllers/DataListSortFilterController.cs rename to server/AyaNova/Controllers/DataListViewController.cs index 038525eb..262fef44 100644 --- a/server/AyaNova/Controllers/DataListSortFilterController.cs +++ b/server/AyaNova/Controllers/DataListViewController.cs @@ -24,10 +24,10 @@ namespace AyaNova.Api.Controllers [Route("api/v{version:apiVersion}/[controller]")] [Produces("application/json")] [Authorize] - public class DataListSortFilterController : ControllerBase + public class DataListViewController : ControllerBase { private readonly AyContext ct; - private readonly ILogger log; + private readonly ILogger log; private readonly ApiServerState serverState; @@ -37,7 +37,7 @@ namespace AyaNova.Api.Controllers /// /// /// - public DataListSortFilterController(AyContext dbcontext, ILogger logger, ApiServerState apiServerState) + public DataListViewController(AyContext dbcontext, ILogger logger, ApiServerState apiServerState) { ct = dbcontext; log = logger; @@ -46,18 +46,18 @@ namespace AyaNova.Api.Controllers /// - /// Get full DataListSortFilter object + /// Get full DataListView object /// /// /// A single DataFilter [HttpGet("{id}")] - public async Task GetDataListSortFilter([FromRoute] long id) + public async Task GetDataListView([FromRoute] long id) { if (serverState.IsClosed) return StatusCode(503, new ApiErrorResponse(ApiErrorCode.API_CLOSED, null, serverState.Reason)); //Instantiate the business object handler - DataListSortFilterBiz biz = DataListSortFilterBiz.GetBiz(ct, HttpContext); + DataListViewBiz biz = DataListViewBiz.GetBiz(ct, HttpContext); if (!Authorized.HasReadFullRole(HttpContext.Items, biz.BizType)) return StatusCode(403, new ApiNotAuthorizedResponse()); @@ -75,11 +75,11 @@ namespace AyaNova.Api.Controllers /// - /// Get DataListSortFilter pick list + /// Get DataListView pick list /// - /// List of public or owned data filters for listKey provided - [HttpGet("PickList", Name = nameof(DataListSortFilterPickList))] - public async Task DataListSortFilterPickList([FromQuery] string ListKey) + /// List of public or owned data list views listKey provided + [HttpGet("PickList", Name = nameof(DataListViewPickList))] + public async Task DataListViewPickList([FromQuery] string ListKey) { if (serverState.IsClosed) return StatusCode(503, new ApiErrorResponse(ApiErrorCode.API_CLOSED, null, serverState.Reason)); @@ -88,7 +88,7 @@ namespace AyaNova.Api.Controllers return BadRequest(new ApiErrorResponse(ModelState)); //Instantiate the business object handler - DataListSortFilterBiz biz = DataListSortFilterBiz.GetBiz(ct, HttpContext); + DataListViewBiz biz = DataListViewBiz.GetBiz(ct, HttpContext); var l = await biz.GetPickListAsync(ListKey); return Ok(ApiOkResponse.Response(l, true)); @@ -97,13 +97,13 @@ namespace AyaNova.Api.Controllers /// - /// Put (update) DataListSortFilter + /// Put (update) DataListView /// /// /// /// [HttpPut("{id}")] - public async Task PutDataListSortFilter([FromRoute] long id, [FromBody] DataListSortFilter inObj) + public async Task PutDataListView([FromRoute] long id, [FromBody] DataListView inObj) { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(ApiErrorCode.API_CLOSED, null, serverState.Reason)); @@ -112,7 +112,7 @@ namespace AyaNova.Api.Controllers return BadRequest(new ApiErrorResponse(ModelState)); //Instantiate the business object handler - DataListSortFilterBiz biz = DataListSortFilterBiz.GetBiz(ct, HttpContext); + DataListViewBiz biz = DataListViewBiz.GetBiz(ct, HttpContext); var o = await biz.GetAsync(id, false); if (o == null) @@ -138,19 +138,19 @@ namespace AyaNova.Api.Controllers /// - /// Post DataListSortFilter + /// Post DataListView /// /// /// Automatically filled from route path, no need to specify in body /// [HttpPost] - public async Task PostDataListSortFilter([FromBody] DataListSortFilter inObj, ApiVersion apiVersion) + public async Task PostDataListView([FromBody] DataListView inObj, ApiVersion apiVersion) { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(ApiErrorCode.API_CLOSED, null, serverState.Reason)); //Instantiate the business object handler - DataListSortFilterBiz biz = DataListSortFilterBiz.GetBiz(ct, HttpContext); + DataListViewBiz biz = DataListViewBiz.GetBiz(ct, HttpContext); //check roles if (!Authorized.HasCreateRole(HttpContext.Items, biz.BizType)) @@ -160,23 +160,23 @@ namespace AyaNova.Api.Controllers return BadRequest(new ApiErrorResponse(ModelState)); //Create and validate - DataListSortFilter o = await biz.CreateAsync(inObj); + DataListView o = await biz.CreateAsync(inObj); if (o == null) return BadRequest(new ApiErrorResponse(biz.Errors)); else - return CreatedAtAction(nameof(DataListSortFilterController.GetDataListSortFilter), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); + return CreatedAtAction(nameof(DataListViewController.GetDataListView), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o)); } /// - /// Delete DataListSortFilter + /// Delete DataListView /// /// /// Ok [HttpDelete("{id}")] - public async Task DeleteDataListSortFilter([FromRoute] long id) + public async Task DeleteDataListView([FromRoute] long id) { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(ApiErrorCode.API_CLOSED, null, serverState.Reason)); @@ -185,7 +185,7 @@ namespace AyaNova.Api.Controllers return BadRequest(new ApiErrorResponse(ModelState)); //Instantiate the business object handler - DataListSortFilterBiz biz = DataListSortFilterBiz.GetBiz(ct, HttpContext); + DataListViewBiz biz = DataListViewBiz.GetBiz(ct, HttpContext); var o = await biz.GetAsync(id, false); if (o == null) diff --git a/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs b/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs index 6e196678..30ed81bd 100644 --- a/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs +++ b/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs @@ -22,12 +22,6 @@ namespace AyaNova.DataList //List to compile each columns where clause fragment for later assembly into sql query List ColumnWhereClauses = new List(); - //StringBuilder sb = new StringBuilder(); - - bool ThisIsTheFirstColumnWhereGroup = true; - - //iterate the list view fields and concatenate a sql query from it - //// [{key:"COLUMN UNIQUE KEY ID",sort:"-" or "+",filter:{any:true/false,items:[{FILTER OBJECT SEE BELOW}]} }, {key:"second column unique key"},{...etc...}] for (int i = 0; i < listViewArray.Count; i++) { StringBuilder sb = new StringBuilder(); @@ -126,9 +120,7 @@ namespace AyaNova.DataList ThisIsTheFirstFilterItemForThisColumn = false; } - //we've done at least one now - ThisIsTheFirstColumnWhereGroup = false; - + if (ThereAreMultipleFilterItems) { //The whole thing was in a group so close this group diff --git a/server/AyaNova/DataList/UserDataList.cs b/server/AyaNova/DataList/TestUserDataList.cs similarity index 96% rename from server/AyaNova/DataList/UserDataList.cs rename to server/AyaNova/DataList/TestUserDataList.cs index 11e6444b..0ffeca88 100644 --- a/server/AyaNova/DataList/UserDataList.cs +++ b/server/AyaNova/DataList/TestUserDataList.cs @@ -3,10 +3,10 @@ using Newtonsoft.Json.Linq; using AyaNova.Biz; namespace AyaNova.DataList { - internal class UserDataList : AyaDataList + internal class TestUserDataList : AyaDataList { - public UserDataList() + public TestUserDataList() { DefaultListObjectType = AyaType.User; diff --git a/server/AyaNova/biz/AyaType.cs b/server/AyaNova/biz/AyaType.cs index 81d22781..4b073b72 100644 --- a/server/AyaNova/biz/AyaType.cs +++ b/server/AyaNova/biz/AyaType.cs @@ -32,7 +32,7 @@ namespace AyaNova.Biz DEPRECATED_REUSELATER_15 = 15, DEPRECATED_REUSELATER_16 = 16, FileAttachment = 17, - DataListSortFilter = 18, + DataListView = 18, FormCustom = 19 diff --git a/server/AyaNova/biz/BizObjectExistsInDatabase.cs b/server/AyaNova/biz/BizObjectExistsInDatabase.cs index ea1d1c1c..d89efcbf 100644 --- a/server/AyaNova/biz/BizObjectExistsInDatabase.cs +++ b/server/AyaNova/biz/BizObjectExistsInDatabase.cs @@ -36,7 +36,7 @@ namespace AyaNova.Biz return await ct.Widget.AnyAsync(m => m.Id == id); case AyaType.FileAttachment: return await ct.FileAttachment.AnyAsync(m => m.Id == id); - case AyaType.DataListSortFilter: + case AyaType.DataListView: return await ct.DataListSortFilter.AnyAsync(m => m.Id == id); case AyaType.FormCustom: diff --git a/server/AyaNova/biz/BizObjectFactory.cs b/server/AyaNova/biz/BizObjectFactory.cs index cd44307e..fdfe3046 100644 --- a/server/AyaNova/biz/BizObjectFactory.cs +++ b/server/AyaNova/biz/BizObjectFactory.cs @@ -35,8 +35,8 @@ namespace AyaNova.Biz return new TrialBiz(dbcontext, userId, roles); case AyaType.Locale: return new LocaleBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_LANGUAGE_ID, roles); - case AyaType.DataListSortFilter: - return new DataListSortFilterBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_LANGUAGE_ID, roles); + case AyaType.DataListView: + return new DataListViewBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_LANGUAGE_ID, roles); case AyaType.FormCustom: return new FormCustomBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_LANGUAGE_ID, roles); diff --git a/server/AyaNova/biz/BizObjectNameFetcherDirect.cs b/server/AyaNova/biz/BizObjectNameFetcherDirect.cs index 7076c911..b0038ad9 100644 --- a/server/AyaNova/biz/BizObjectNameFetcherDirect.cs +++ b/server/AyaNova/biz/BizObjectNameFetcherDirect.cs @@ -30,8 +30,8 @@ namespace AyaNova.Biz TABLE = "afileattachment"; COLUMN = "displayfilename"; break; - case AyaType.DataListSortFilter: - TABLE = "adatalistsortfilter"; + case AyaType.DataListView: + TABLE = "adatalistview"; break; case AyaType.FormCustom: TABLE = "aformcustom"; diff --git a/server/AyaNova/biz/BizRoles.cs b/server/AyaNova/biz/BizRoles.cs index eab823a0..9198053c 100644 --- a/server/AyaNova/biz/BizRoles.cs +++ b/server/AyaNova/biz/BizRoles.cs @@ -133,7 +133,7 @@ namespace AyaNova.Biz //////////////////////////////////////////////////////////// //DATALISTFILTER // - roles.Add(AyaType.DataListSortFilter, new BizRoleSet() + roles.Add(AyaType.DataListView, new BizRoleSet() { Change = AuthorizationRoles.BizAdminFull, ReadFullRecord = AuthorizationRoles.All diff --git a/server/AyaNova/biz/DataListSortFilterBiz.cs b/server/AyaNova/biz/DataListViewBiz.cs similarity index 91% rename from server/AyaNova/biz/DataListSortFilterBiz.cs rename to server/AyaNova/biz/DataListViewBiz.cs index 5d9fc657..8460eb8f 100644 --- a/server/AyaNova/biz/DataListSortFilterBiz.cs +++ b/server/AyaNova/biz/DataListViewBiz.cs @@ -13,21 +13,21 @@ namespace AyaNova.Biz { - internal class DataListSortFilterBiz : BizObject + internal class DataListViewBiz : BizObject { - internal DataListSortFilterBiz(AyContext dbcontext, long currentUserId, long userLocaleId, AuthorizationRoles UserRoles) + internal DataListViewBiz(AyContext dbcontext, long currentUserId, long userLocaleId, AuthorizationRoles UserRoles) { ct = dbcontext; UserId = currentUserId; UserLocaleId = userLocaleId; CurrentUserRoles = UserRoles; - BizType = AyaType.DataListSortFilter; + BizType = AyaType.DataListView; } - internal static DataListSortFilterBiz GetBiz(AyContext ct, Microsoft.AspNetCore.Http.HttpContext httpContext) + internal static DataListViewBiz GetBiz(AyContext ct, Microsoft.AspNetCore.Http.HttpContext httpContext) { - return new DataListSortFilterBiz(ct, UserIdFromContext.Id(httpContext.Items), UserLocaleIdFromContext.Id(httpContext.Items), UserRolesFromContext.Roles(httpContext.Items)); + return new DataListViewBiz(ct, UserIdFromContext.Id(httpContext.Items), UserLocaleIdFromContext.Id(httpContext.Items), UserRolesFromContext.Roles(httpContext.Items)); } // //Version for internal use @@ -47,7 +47,7 @@ namespace AyaNova.Biz //////////////////////////////////////////////////////////////////////////////////////////////// //CREATE - internal async Task CreateAsync(DataListSortFilter inObj) + internal async Task CreateAsync(DataListView inObj) { await ValidateAsync(inObj, true); if (HasErrors) @@ -55,7 +55,7 @@ namespace AyaNova.Biz else { //do stuff with datafilter - DataListSortFilter outObj = inObj; + DataListView outObj = inObj; outObj.UserId = UserId; @@ -81,7 +81,7 @@ namespace AyaNova.Biz /// GET //Get one - internal async Task GetAsync(long fetchId, bool logTheGetEvent = true) + internal async Task GetAsync(long fetchId, bool logTheGetEvent = true) { //This is simple so nothing more here, but often will be copying to a different output object or some other ops var ret = await ct.DataListSortFilter.SingleOrDefaultAsync(m => m.Id == fetchId && (m.Public == true || m.UserId == UserId)); @@ -124,7 +124,7 @@ namespace AyaNova.Biz // //put - internal async Task PutAsync(DataListSortFilter dbObj, DataListSortFilter inObj) + internal async Task PutAsync(DataListView dbObj, DataListView inObj) { //preserve the owner ID if none was specified if (inObj.UserId == 0) @@ -154,7 +154,7 @@ namespace AyaNova.Biz //////////////////////////////////////////////////////////////////////////////////////////////// //DELETE // - internal async Task DeleteAsync(DataListSortFilter dbObj) + internal async Task DeleteAsync(DataListView dbObj) { //Determine if the object can be deleted, do the deletion tentatively //Probably also in here deal with tags and associated search text etc @@ -185,7 +185,7 @@ namespace AyaNova.Biz // //Can save or update? - private async Task ValidateAsync(DataListSortFilter inObj, bool isNew) + private async Task ValidateAsync(DataListView inObj, bool isNew) { //UserId required @@ -232,7 +232,7 @@ namespace AyaNova.Biz AddError(ApiErrorCode.VALIDATION_LENGTH_EXCEEDED, "ListKey", "255 max"); //Filter json must parse - if (!string.IsNullOrWhiteSpace(inObj.Filter)) + if (!string.IsNullOrWhiteSpace(inObj.ListView)) { try { diff --git a/server/AyaNova/models/AyContext.cs b/server/AyaNova/models/AyContext.cs index 96f08def..93989453 100644 --- a/server/AyaNova/models/AyContext.cs +++ b/server/AyaNova/models/AyContext.cs @@ -17,7 +17,7 @@ namespace AyaNova.Models public virtual DbSet OpsJobLog { get; set; } public virtual DbSet Locale { get; set; } public virtual DbSet LocaleItem { get; set; } - public virtual DbSet DataListSortFilter { get; set; } + public virtual DbSet DataListSortFilter { get; set; } public virtual DbSet Tag { get; set; } public virtual DbSet FormCustom { get; set; } diff --git a/server/AyaNova/models/DataListSortFilter.cs b/server/AyaNova/models/DataListView.cs similarity index 70% rename from server/AyaNova/models/DataListSortFilter.cs rename to server/AyaNova/models/DataListView.cs index 6bcf464b..e5c5638d 100644 --- a/server/AyaNova/models/DataListSortFilter.cs +++ b/server/AyaNova/models/DataListView.cs @@ -4,7 +4,7 @@ using System.ComponentModel.DataAnnotations; namespace AyaNova.Models { - public partial class DataListSortFilter + public partial class DataListView { public long Id { get; set; } public uint ConcurrencyToken { get; set; } @@ -17,8 +17,8 @@ namespace AyaNova.Models public bool Public { get; set; } [Required, MaxLength(255)] public string ListKey { get; set; }//max 255 characters ascii set - public string Filter { get; set; }//JSON fragment filter collection - public string Sort { get; set; }//JSON fragment sort collection + public string ListView { get; set; }//JSON ListView object + } } diff --git a/server/AyaNova/util/AySchema.cs b/server/AyaNova/util/AySchema.cs index a02eb805..48c377c2 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::EmptyBizDataFromDatabaseForSeedingOrImporting WHEN NEW TABLES ADDED!!!! private const int DESIRED_SCHEMA_LEVEL = 9; - internal const long EXPECTED_COLUMN_COUNT = 99; + internal const long EXPECTED_COLUMN_COUNT = 98; internal const long EXPECTED_INDEX_COUNT = 24; //!!!!WARNING: BE SURE TO UPDATE THE DbUtil::EmptyBizDataFromDatabaseForSeedingOrImporting WHEN NEW TABLES ADDED!!!! @@ -266,9 +266,9 @@ namespace AyaNova.Util { LogUpdateMessage(log); - await ExecQueryAsync("CREATE TABLE adatalistsortfilter (id BIGSERIAL PRIMARY KEY, userId bigint not null, name varchar(255) not null, public bool not null," + - "listkey varchar(255) not null, filter text, sort text, UNIQUE(name))"); - + await ExecQueryAsync("CREATE TABLE adatalistview (id BIGSERIAL PRIMARY KEY, userId bigint not null, name varchar(255) not null, public bool not null," + + "listkey varchar(255) not null, listview text, UNIQUE(name))"); + await SetSchemaLevelAsync(++currentSchema); } diff --git a/server/AyaNova/util/DbUtil.cs b/server/AyaNova/util/DbUtil.cs index 90f60446..a108bde4 100644 --- a/server/AyaNova/util/DbUtil.cs +++ b/server/AyaNova/util/DbUtil.cs @@ -288,7 +288,7 @@ namespace AyaNova.Util await EraseTableAsync("afileattachment", conn); await EraseTableAsync("awidget", conn); await EraseTableAsync("aevent", conn); - await EraseTableAsync("adatalistsortfilter", conn); + await EraseTableAsync("adatalistview", conn); // await EraseTableAsync("adatalisttemplate", conn); await EraseTableAsync("aformcustom", conn); await EraseTableAsync("asearchkey", conn);