diff --git a/server/AyaNova/biz/FilterOptionsFromListKey.cs b/server/AyaNova/biz/FilterOptionsFromListKey.cs index 58e3e26a..e6e04308 100644 --- a/server/AyaNova/biz/FilterOptionsFromListKey.cs +++ b/server/AyaNova/biz/FilterOptionsFromListKey.cs @@ -6,13 +6,16 @@ namespace AyaNova.Biz { if (string.IsNullOrWhiteSpace(listKey)) return null; - + switch (listKey) { //All listkeys are always lower case - + case "widget": return WidgetBiz.FilterOptions(); + case "user": + return UserBiz.FilterOptions(); + default: return null;//not found diff --git a/server/AyaNova/biz/UserBiz.cs b/server/AyaNova/biz/UserBiz.cs index 746bdf90..a0a65896 100644 --- a/server/AyaNova/biz/UserBiz.cs +++ b/server/AyaNova/biz/UserBiz.cs @@ -151,6 +151,7 @@ namespace AyaNova.Biz //Also all list keys are lower case for consistency FilterOptions f = new FilterOptions("user"); f. + AddField("id", "ID", AyDataType.Integer). AddField("name", "CommonName", AyDataType.Text). AddField("active", "CommonActive", AyDataType.Bool). AddField("tags", "Tags", AyDataType.Tags). @@ -219,11 +220,11 @@ namespace AyaNova.Biz .CountAsync(); #pragma warning restore EF1000 - - var cleanedItems = new System.Object[] { }; - foreach (User item in items) + int itemCount = items.Count();//totalRecordCount doesn't skip and take so not usable here + var cleanedItems = new System.Object[itemCount]; + for (int i = 0; i < itemCount; i++) { - cleanedItems.Append(CleanUserForReturn(item)); + cleanedItems[i] = CleanUserForReturn(items[i]); } var pageLinks = new PaginationLinkBuilder(Url, routeName, null, pagingOptions, totalRecordCount).PagingLinksObject(); @@ -421,12 +422,7 @@ namespace AyaNova.Biz if (isNew) //Yes, no currentObj { - //Not sure why we would care about this particular rule or why I added it? Maybe it's from widget? - // //NEW Users must be active - // if (((bool)proposedObj.Active) == false) - // { - // AddError(ValidationErrorType.InvalidValue, "Active", "New User must be active"); - // } + } //OwnerId required diff --git a/server/AyaNova/biz/WidgetBiz.cs b/server/AyaNova/biz/WidgetBiz.cs index 43040e1e..58e36820 100644 --- a/server/AyaNova/biz/WidgetBiz.cs +++ b/server/AyaNova/biz/WidgetBiz.cs @@ -17,27 +17,6 @@ namespace AyaNova.Biz internal class WidgetBiz : BizObject, IJobObject { - public static FilterOptions FilterOptions(long localizeToLocaleId = 0) - { - //NOTE: All column names are lowercase to conform with Postgres AyaNova DB which uses lowercase for all identifiers - //Also all list keys are lower case for consistency - FilterOptions f = new FilterOptions("widget"); - f. - AddField("name", "WidgetName", AyDataType.Text). - AddField("serial", "WidgetSerial", AyDataType.Integer). - AddField("notes", "WidgetNotes", AyDataType.Text). - AddField("dollaramount", "WidgetDollarAmount", AyDataType.Decimal). - AddField("active", "CommonActive", AyDataType.Bool). - AddField("startdate", "WidgetStartDate", AyDataType.Date). - AddField("count", "WidgetCount", AyDataType.Integer). - AddField("tags", "Tags", AyDataType.Tags). - AddField("enddate", "WidgetEndDate", AyDataType.Date); - - if (localizeToLocaleId != 0) - f.Localize(localizeToLocaleId); - return f; - } - internal WidgetBiz(AyContext dbcontext, long currentUserId, long userLocaleId, AuthorizationRoles UserRoles) { @@ -162,13 +141,34 @@ namespace AyaNova.Biz + public static FilterOptions FilterOptions(long localizeToLocaleId = 0) + { + //NOTE: All column names are lowercase to conform with Postgres AyaNova DB which uses lowercase for all identifiers + //Also all list keys are lower case for consistency + FilterOptions f = new FilterOptions("widget"); + f. + AddField("id", "ID", AyDataType.Integer). + AddField("name", "WidgetName", AyDataType.Text). + AddField("serial", "WidgetSerial", AyDataType.Integer). + AddField("notes", "WidgetNotes", AyDataType.Text). + AddField("dollaramount", "WidgetDollarAmount", AyDataType.Decimal). + AddField("active", "CommonActive", AyDataType.Bool). + AddField("startdate", "WidgetStartDate", AyDataType.Date). + AddField("count", "WidgetCount", AyDataType.Integer). + AddField("tags", "Tags", AyDataType.Tags). + AddField("enddate", "WidgetEndDate", AyDataType.Date); + + if (localizeToLocaleId != 0) + f.Localize(localizeToLocaleId); + return f; + } //get many (paged) internal async Task> GetManyAsync(IUrlHelper Url, string routeName, PagingOptions pagingOptions) { pagingOptions.Offset = pagingOptions.Offset ?? PagingOptions.DefaultOffset; pagingOptions.Limit = pagingOptions.Limit ?? PagingOptions.DefaultLimit; - + //BUILD THE QUERY //base query var q = "SELECT *, xmin FROM AWIDGET "; @@ -182,7 +182,7 @@ namespace AyaNova.Biz q = q + FilterSqlCriteriaBuilder.DataFilterToSQLCriteria(TheFilter, WidgetBiz.FilterOptions(), UserId); //BUILD ORDER BY AND APPEND IT - q = q + FilterSqlOrderByBuilder.DataFilterToSQLOrderBy(TheFilter); + q = q + FilterSqlOrderByBuilder.DataFilterToSQLOrderBy(TheFilter); } else { diff --git a/server/AyaNova/resource/de.json b/server/AyaNova/resource/de.json index 54bae3cf..931c2430 100644 --- a/server/AyaNova/resource/de.json +++ b/server/AyaNova/resource/de.json @@ -1441,5 +1441,6 @@ "WidgetEndDate":"Enddatum", "WidgetNotes":"Notizen", "RowsPerPage":"Zeilen pro Seite", - "Tags":"Kategorien" + "Tags":"Kategorien", + "ID":"ID" } diff --git a/server/AyaNova/resource/en.json b/server/AyaNova/resource/en.json index b24845f8..6b9bf687 100644 --- a/server/AyaNova/resource/en.json +++ b/server/AyaNova/resource/en.json @@ -1440,7 +1440,8 @@ "WidgetEndDate":"End", "WidgetNotes":"Notes", "RowsPerPage":"Rows per page", - "Tags":"Tags" + "Tags":"Tags", + "ID":"ID" } \ No newline at end of file diff --git a/server/AyaNova/resource/es.json b/server/AyaNova/resource/es.json index 256934c7..ac01719d 100644 --- a/server/AyaNova/resource/es.json +++ b/server/AyaNova/resource/es.json @@ -1441,5 +1441,6 @@ "WidgetEndDate":"Fecha de fin", "WidgetNotes":"Notas", "RowsPerPage":"Filas por página", - "Tags":"Etiquetas" + "Tags":"Etiquetas", + "ID":"ID" } \ No newline at end of file diff --git a/server/AyaNova/resource/fr.json b/server/AyaNova/resource/fr.json index efe0593b..be1a4e1a 100644 --- a/server/AyaNova/resource/fr.json +++ b/server/AyaNova/resource/fr.json @@ -1440,5 +1440,6 @@ "WidgetEndDate":"Date de fin", "WidgetNotes":"Notes", "RowsPerPage":"Lignes par page", - "Tags":"Balises" + "Tags":"Balises", + "ID":"ID" } diff --git a/test/raven-integration/User/UserCrud.cs b/test/raven-integration/User/UserCrud.cs index a4c60457..637c2353 100644 --- a/test/raven-integration/User/UserCrud.cs +++ b/test/raven-integration/User/UserCrud.cs @@ -315,7 +315,7 @@ namespace raven_integration - /// + /// /// /// [Fact] @@ -331,35 +331,48 @@ namespace raven_integration dynamic d = new JObject(); d.name = Util.Uniquify(ObjectNameStart); - d.startDate = DateTime.Now; - d.endDate = DateTime.Now.AddHours(1); + d.active = false; + d.login = Util.Uniquify("LOGIN"); + d.password = Util.Uniquify("PASSWORD"); + d.roles = 0;//norole + d.localeId = 1;//random locale + d.userType = 3;//non scheduleable - ApiResponse a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), d.ToString()); + ApiResponse a = await Util.PostAsync("User", await Util.GetTokenAsync("manager", "l3tm3in"), d.ToString()); Util.ValidateDataReturnResponseOk(a); FirstInOrdertId = a.ObjectResponse["data"]["id"].Value(); d = new JObject(); d.name = Util.Uniquify(ObjectNameStart); - d.startDate = DateTime.Now.AddHours(1); - d.endDate = DateTime.Now.AddHours(2); - a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), d.ToString()); + d.login = Util.Uniquify("LOGIN"); + d.password = Util.Uniquify("PASSWORD"); + d.roles = 0;//norole + d.localeId = 1;//random locale + d.userType = 3;//non scheduleable + d.active = true; + + a = await Util.PostAsync("User", await Util.GetTokenAsync("manager", "l3tm3in"), d.ToString()); Util.ValidateDataReturnResponseOk(a); - SecondInOrderId = a.ObjectResponse["data"]["id"].Value(); + ThirdInOrderId = a.ObjectResponse["data"]["id"].Value(); d = new JObject(); d.name = Util.Uniquify(ObjectNameStart); - d.startDate = DateTime.Now.AddHours(2); - d.endDate = DateTime.Now.AddHours(3); - a = await Util.PostAsync("Widget", await Util.GetTokenAsync("manager", "l3tm3in"), d.ToString()); + d.login = Util.Uniquify("LOGIN"); + d.password = Util.Uniquify("PASSWORD"); + d.roles = 0;//norole + d.localeId = 1;//random locale + d.userType = 3;//non scheduleable + d.active = false; + a = await Util.PostAsync("User", await Util.GetTokenAsync("manager", "l3tm3in"), d.ToString()); Util.ValidateDataReturnResponseOk(a); - ThirdInOrderId = a.ObjectResponse["data"]["id"].Value(); + SecondInOrderId = a.ObjectResponse["data"]["id"].Value(); //CREATE FILTER d = new JObject(); d.name = Util.Uniquify(ObjectNameStart); d["public"] = true; - d.listKey = "widget"; + d.listKey = "user"; //FILTER IN BY NAME FOR TESTING THIS RUN ONLY dynamic dfilter = new JArray(); @@ -371,12 +384,21 @@ namespace raven_integration dfilter.Add(DataFilterNameStart); d.filter = dfilter.ToString(); - //SORT ORDER ################### dynamic dsortarray = new JArray(); + + //SORT ORDER ################### + //sort by active then by ID + dynamic dsort = new JObject(); - dsort.fld = "startdate"; + dsort.fld = "active"; dsort.dir = "+"; dsortarray.Add(dsort); + + dsort = new JObject(); + dsort.fld = "id"; + dsort.dir = "+"; + dsortarray.Add(dsort); + d.sort = dsortarray.ToString(); a = await Util.PostAsync("DataFilter", await Util.GetTokenAsync("manager", "l3tm3in"), d.ToString()); @@ -385,7 +407,7 @@ namespace raven_integration long DataFilterId = a.ObjectResponse["data"]["id"].Value(); //NOW FETCH WIDGET LIST WITH FILTER - a = await Util.GetAsync($"Widget/listwidgets?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in")); + a = await Util.GetAsync($"User/listusers?Offset=0&Limit=999&DataFilterId={DataFilterId.ToString()}", await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateDataReturnResponseOk(a); Util.ValidateHTTPStatusCode(a, 200); @@ -398,13 +420,13 @@ namespace raven_integration a.ObjectResponse["data"][2]["id"].Value().Should().Be(ThirdInOrderId); - a = await Util.DeleteAsync("Widget/" + FirstInOrdertId.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); + a = await Util.DeleteAsync("User/" + FirstInOrdertId.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateHTTPStatusCode(a, 204); - a = await Util.DeleteAsync("Widget/" + SecondInOrderId.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); + a = await Util.DeleteAsync("User/" + SecondInOrderId.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateHTTPStatusCode(a, 204); - a = await Util.DeleteAsync("Widget/" + ThirdInOrderId.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); + a = await Util.DeleteAsync("User/" + ThirdInOrderId.ToString(), await Util.GetTokenAsync("manager", "l3tm3in")); Util.ValidateHTTPStatusCode(a, 204); //DELETE DATAFILTER