diff --git a/server/AyaNova/DataList/WidgetDataList.cs b/server/AyaNova/DataList/WidgetDataList.cs new file mode 100644 index 00000000..6ca6800d --- /dev/null +++ b/server/AyaNova/DataList/WidgetDataList.cs @@ -0,0 +1,49 @@ +using System.Collections.Generic; +using AyaNova.Biz; +namespace AyaNova.DataList +{ + internal class WidgetDataList : AyaDataList + { + //No JOINS just straight up widgets + public WidgetDataList() + { + ListKey = nameof(WidgetDataList); + SQLFrom = "from awidget"; + AllowedRoles = AuthorizationRoles.AllInternalStaff;//anyone but clients and subcontractors (just for test) + DefaultListObjectType = AyaType.Widget; + + FieldDefinitions = new List(); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "df", AyaObjectType = (int)AyaType.Widget }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetName", FieldKey = "Name", UiFieldDataType = (int)AyaUiFieldDataType.Text }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetSerial", FieldKey = "Serial", UiFieldDataType = (int)AyaUiFieldDataType.Integer }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetDollarAmount", FieldKey = "DollarAmount", UiFieldDataType = (int)AyaUiFieldDataType.Currency }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetCount", FieldKey = "Count", UiFieldDataType = (int)AyaUiFieldDataType.Integer }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetRoles", FieldKey = "Roles", UiFieldDataType = (int)AyaUiFieldDataType.Enum, EnumType = typeof(AuthorizationRoles).ToString() }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetStartDate", FieldKey = "StartDate", UiFieldDataType = (int)AyaUiFieldDataType.DateTime }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetEndDate", FieldKey = "EndDate", UiFieldDataType = (int)AyaUiFieldDataType.DateTime }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetNotes", FieldKey = "Notes", UiFieldDataType = (int)AyaUiFieldDataType.Text }); + //More to do on this, maybe the datatype should be a LINK or something for UI purposes + //circle back on this when there is enough infrastructure to test + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "User", FieldKey = "userid", UiFieldDataType = (int)AyaUiFieldDataType.Text, AyaObjectType = (int)AyaType.User }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "Active", FieldKey = "Active", UiFieldDataType = (int)AyaUiFieldDataType.Bool }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "Tags", FieldKey = "Tags", UiFieldDataType = (int)AyaUiFieldDataType.Tags }); + + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetCustom1", FieldKey = "WidgetCustom1", IsCustomField = true }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetCustom2", FieldKey = "WidgetCustom2", IsCustomField = true }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetCustom3", FieldKey = "WidgetCustom3", IsCustomField = true }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetCustom4", FieldKey = "WidgetCustom4", IsCustomField = true }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetCustom5", FieldKey = "WidgetCustom5", IsCustomField = true }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetCustom6", FieldKey = "WidgetCustom6", IsCustomField = true }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetCustom7", FieldKey = "WidgetCustom7", IsCustomField = true }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetCustom8", FieldKey = "WidgetCustom8", IsCustomField = true }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetCustom9", FieldKey = "WidgetCustom9", IsCustomField = true }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetCustom10", FieldKey = "WidgetCustom10", IsCustomField = true }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetCustom11", FieldKey = "WidgetCustom11", IsCustomField = true }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetCustom12", FieldKey = "WidgetCustom12", IsCustomField = true }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetCustom13", FieldKey = "WidgetCustom13", IsCustomField = true }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetCustom14", FieldKey = "WidgetCustom14", IsCustomField = true }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetCustom15", FieldKey = "WidgetCustom15", IsCustomField = true }); + FieldDefinitions.Add(new AyaDataListFieldDefinition { LtKey = "WidgetCustom16", FieldKey = "WidgetCustom16", IsCustomField = true }); + } + }//eoc +}//eons \ No newline at end of file diff --git a/server/AyaNova/biz/WidgetBiz.cs b/server/AyaNova/biz/WidgetBiz.cs index 3498660a..a9b9a591 100644 --- a/server/AyaNova/biz/WidgetBiz.cs +++ b/server/AyaNova/biz/WidgetBiz.cs @@ -274,131 +274,131 @@ namespace AyaNova.Biz //Generic list of widgets #region GetList //COMMENTED OUT, FOR NOW UNTIL I GET THE FULLY WORKING TEST LIST BELOW THEN COME BACK AND LOOK AT THIS - // internal async Task GetList(IUrlHelper Url, string routeName, ListOptions listOptions) - // { + internal async Task GetList(IUrlHelper Url, string routeName, ListOptions listOptions) + { - // //TODO: Get template (MOCKED FOR NOW UNTIL PROOF OF CONCEPT) - // var MOCK_WIDGET_DISPLAY_TEMPLATE_JSON = @" - // { - // ""full"":[""widgetname"",""widgetserial"",""widgetdollaramount"",""widgetroles"",""widgetstartdate"",""active""], - // ""mini"":[""widgetname"",""widgetserial""] - // } - // "; + //TODO: Get template (MOCKED FOR NOW UNTIL PROOF OF CONCEPT) + var MOCK_WIDGET_DISPLAY_TEMPLATE_JSON = @" + { + ""full"":[""widgetname"",""widgetserial"",""widgetdollaramount"",""widgetroles"",""widgetstartdate"",""active""], + ""mini"":[""widgetname"",""widgetserial""] + } + "; - // //BUILD THE QUERY + //BUILD THE QUERY - // //SELECT FRAGMENT COLUMNS FROM TEMPLATE - // //"select clm,clm,clm" - // var qSelectColumns = SqlSelectBuilder.Build(AyaObjectFields.WIDGET_KEY, MOCK_WIDGET_DISPLAY_TEMPLATE_JSON, listOptions.Mini); + //SELECT FRAGMENT COLUMNS FROM TEMPLATE + //"select clm,clm,clm" + var qSelectColumns = SqlSelectBuilder.Build(AyaObjectFields.WIDGET_KEY, MOCK_WIDGET_DISPLAY_TEMPLATE_JSON, listOptions.Mini); - // var qFrom = "FROM AWIDGET"; + var qFrom = "FROM AWIDGET"; - // //FILTERED? - // DataFilter TheFilter = null; - // if (listOptions.DataFilterId > 0) - // { - // TheFilter = await ct.DataFilter.FirstOrDefaultAsync(x => x.Id == listOptions.DataFilterId); - // } + //FILTERED? + DataFilter TheFilter = null; + if (listOptions.DataFilterId > 0) + { + TheFilter = await ct.DataFilter.FirstOrDefaultAsync(x => x.Id == listOptions.DataFilterId); + } - // //WHERE CLAUSE - FILTER - // var qWhere = string.Empty; - // if (listOptions.DataFilterId > 0) - // { - // qWhere = SqlFilterCriteriaBuilder.DataFilterToSQLCriteria(TheFilter, AyaObjectFields.ObjectFieldsList(AyaObjectFields.WIDGET_KEY), UserId); - // } + //WHERE CLAUSE - FILTER + var qWhere = string.Empty; + if (listOptions.DataFilterId > 0) + { + qWhere = SqlFilterCriteriaBuilder.DataFilterToSQLCriteria(TheFilter, AyaObjectFields.ObjectFieldsList(AyaObjectFields.WIDGET_KEY), UserId); + } - // //ORDER BY CLAUSE - SORT - // var qOrderBy = string.Empty; - // if (listOptions.DataFilterId > 0) - // { - // //BUILD ORDER BY AND APPEND IT - // qOrderBy = SqlFilterOrderByBuilder.DataFilterToSQLOrderBy(TheFilter); - // } + //ORDER BY CLAUSE - SORT + var qOrderBy = string.Empty; + if (listOptions.DataFilterId > 0) + { + //BUILD ORDER BY AND APPEND IT + qOrderBy = SqlFilterOrderByBuilder.DataFilterToSQLOrderBy(TheFilter); + } - // //LIMIT AND OFFSET CLAUSE - PAGING - // listOptions.Offset = listOptions.Offset ?? ListOptions.DefaultOffset; - // listOptions.Limit = listOptions.Limit ?? ListOptions.DefaultLimit; - // var qLimitOffset = $"LIMIT {listOptions.Limit} OFFSET {listOptions.Offset}"; + //LIMIT AND OFFSET CLAUSE - PAGING + listOptions.Offset = listOptions.Offset ?? ListOptions.DefaultOffset; + listOptions.Limit = listOptions.Limit ?? ListOptions.DefaultLimit; + var qLimitOffset = $"LIMIT {listOptions.Limit} OFFSET {listOptions.Offset}"; - // //PUT IT ALL TOGETHER - // string qDataQuery = string.Empty; - // string qTotalRecordsQuery = string.Empty; - // if (TheFilter != null) - // { - // qDataQuery = $"{qSelectColumns} {qFrom} {qWhere} {qOrderBy} {qLimitOffset}"; - // qTotalRecordsQuery = $"SELECT COUNT(*) {qFrom} {qWhere}"; - // } - // else - // { - // qDataQuery = $"{qSelectColumns} {qFrom} {qLimitOffset}"; - // qTotalRecordsQuery = $"SELECT COUNT(*) {qFrom}"; - // } + //PUT IT ALL TOGETHER + string qDataQuery = string.Empty; + string qTotalRecordsQuery = string.Empty; + if (TheFilter != null) + { + qDataQuery = $"{qSelectColumns} {qFrom} {qWhere} {qOrderBy} {qLimitOffset}"; + qTotalRecordsQuery = $"SELECT COUNT(*) {qFrom} {qWhere}"; + } + else + { + qDataQuery = $"{qSelectColumns} {qFrom} {qLimitOffset}"; + qTotalRecordsQuery = $"SELECT COUNT(*) {qFrom}"; + } - // //RETURN OBJECTS - // List items = new List(); - // long totalRecordCount = 0; + //RETURN OBJECTS + List items = new List(); + long totalRecordCount = 0; - // //RUN THE QUERY - // using (var command = ct.Database.GetDbConnection().CreateCommand()) - // { + //RUN THE QUERY + using (var command = ct.Database.GetDbConnection().CreateCommand()) + { - // ct.Database.OpenConnection(); - // command.CommandText = qDataQuery; - // using (var dr = command.ExecuteReader()) - // { - // while (dr.Read()) - // { - // object[] row = new object[dr.FieldCount]; - // dr.GetValues(row); - // items.Add(row); - // } - // } + ct.Database.OpenConnection(); + command.CommandText = qDataQuery; + using (var dr = command.ExecuteReader()) + { + while (dr.Read()) + { + object[] row = new object[dr.FieldCount]; + dr.GetValues(row); + items.Add(row); + } + } - // command.CommandText = qTotalRecordsQuery; - // using (var dr = command.ExecuteReader()) - // { - // if (dr.Read()) - // { - // totalRecordCount = dr.GetInt64(0); - // } - // } - // } + command.CommandText = qTotalRecordsQuery; + using (var dr = command.ExecuteReader()) + { + if (dr.Read()) + { + totalRecordCount = dr.GetInt64(0); + } + } + } - // //TODO: Build the return object in a clean format - // //rows:{[ {},{v:"Green mechanics",id:32},{v:"...notes..."},{v:"42",id:42}, ...thousands more etc.... ]} + //TODO: Build the return object in a clean format + //rows:{[ {},{v:"Green mechanics",id:32},{v:"...notes..."},{v:"42",id:42}, ...thousands more etc.... ]} - // //BUILD THE PAGING LINKS PORTION - // var pageLinks = new PaginationLinkBuilder(Url, routeName, null, listOptions, totalRecordCount).PagingLinksObject(); + //BUILD THE PAGING LINKS PORTION + var pageLinks = new PaginationLinkBuilder(Url, routeName, null, listOptions, totalRecordCount).PagingLinksObject(); - // //BUILD THE COLUMNS RETURN PROPERTY JSON FRAGMENT - // string ColumnsJSON = string.Empty; - // if (listOptions.Mini) - // { - // ColumnsJSON = AyaObjectFields.GenerateMINIListColumnsJSON(AyaType.Widget); - // } - // else - // { - // ColumnsJSON = AyaObjectFields.GenerateListColumnsJSONFromTemplate(AyaType.Widget, AyaObjectFields.WIDGET_KEY, MOCK_WIDGET_DISPLAY_TEMPLATE_JSON); - // } + //BUILD THE COLUMNS RETURN PROPERTY JSON FRAGMENT + string ColumnsJSON = string.Empty; + if (listOptions.Mini) + { + ColumnsJSON = AyaObjectFields.GenerateMINIListColumnsJSON(AyaType.Widget); + } + else + { + ColumnsJSON = AyaObjectFields.GenerateListColumnsJSONFromTemplate(AyaType.Widget, AyaObjectFields.WIDGET_KEY, MOCK_WIDGET_DISPLAY_TEMPLATE_JSON); + } - // //TODO: BUILD THE RETURN LIST OF DATA ITEMS - // //If mini format all desired columns in order into the single mini return display (and set the only other return field which is ID) + //TODO: BUILD THE RETURN LIST OF DATA ITEMS + //If mini format all desired columns in order into the single mini return display (and set the only other return field which is ID) - // //If wide then format the fields in oder chosen (grid sort and filter template has already done that part above) + //If wide then format the fields in oder chosen (grid sort and filter template has already done that part above) - // //TODO: Genericize the above block of building return when it's working as this code needs to be central and optimized as much as possible + //TODO: Genericize the above block of building return when it's working as this code needs to be central and optimized as much as possible - // ApiPagedResponse pr = new ApiPagedResponse(items, pageLinks, ColumnsJSON); - // return pr; - // } + ApiPagedResponse pr = new ApiPagedResponse(items, pageLinks, ColumnsJSON); + return pr; + } #endregion @@ -421,163 +421,6 @@ namespace AyaNova.Biz return await DataListFetcher.GetResponse(nameof(TestWidgetUserEmailDataList), ct, Url, routeName, listOptions, MOCK_WIDGET_USER_EMAIL_DISPLAY_TEMPLATE_JSON, UserId); } - - //WORKING ORIGINAL BEFORE MOVE OUT OF HERE - // internal async Task TestGetWidgetUserEmailList(IUrlHelper Url, string routeName, ListOptions listOptions) - // { - // //var dlist=AyaNova.DataList.DataListFactory.GetListOfAllDataListKeyNames(); - - // //TODO: Get template (MOCKED FOR NOW UNTIL PROOF OF CONCEPT) - // var MOCK_WIDGET_USER_EMAIL_DISPLAY_TEMPLATE_JSON = @" - // { - // ""full"":[""widgetname"",""username"",""emailaddress"",""widgetactive""], - // ""mini"":[""widgetname"",""username"",""emailaddress""] - // } - // "; - - // // var AyaObjectFields = AyaObjectFieldDefinitions.AyaObjectFields(AyaObjectFieldDefinitions.TEST_WIDGET_USER_EMAIL_ADDRESS_LIST_KEY); - // var DataList=DataListFactory.GetAyaDataList(nameof(TestWidgetUserEmailDataList)); - - - // //TODO: PUt this in the template biz class ultimately and modify sqlselectbuilder to use it - - // //PARSE THE TEMPLATE INTO A STRING ARRAY - // //SO WE KNOW WHICH FIELDS TO RETURN FROM QUERY - // var jtemplate = JObject.Parse(MOCK_WIDGET_USER_EMAIL_DISPLAY_TEMPLATE_JSON); - - // //convert to strings array (https://stackoverflow.com/a/33836599/8939) - // string[] templateFieldList; - // if (listOptions.Mini) - // { - // templateFieldList = ((JArray)jtemplate["mini"]).ToObject(); - // } - // else - // { - // templateFieldList = ((JArray)jtemplate["full"]).ToObject(); - // } - - - // //BUILD THE QUERY - // //SELECT FRAGMENT COLUMNS FROM TEMPLATE - // //TODO: Make this a function called from DataList - // var qSelectColumns = DataListSqlSelectBuilder.Build(DataList.FieldDefinitions, MOCK_WIDGET_USER_EMAIL_DISPLAY_TEMPLATE_JSON, listOptions.Mini); - - // //FROM CLAUSE - // //this is where the full SQL statement needs to be made with JOINS etc - // //TODO: Can this be moved away into the objectfields or new object - // //var qFrom = "from awidget left outer join auser on (awidget.userid=auser.id) left outer join auseroptions on (auser.id=auseroptions.userid)"; - // var qFrom=DataList.SQLFrom; - - // //FILTERED? - // DataFilter TheFilter = null; - // var qWhere = string.Empty; - // var qOrderBy = string.Empty; - // if (listOptions.DataFilterId > 0) - // { - // TheFilter = await ct.DataFilter.FirstOrDefaultAsync(x => x.Id == listOptions.DataFilterId); - // //WHERE CLAUSE - FILTER - // qWhere = DataListSqlFilterCriteriaBuilder.DataFilterToSQLCriteria(TheFilter, DataList.FieldDefinitions, UserId); - // //ORDER BY CLAUSE - SORT - // //BUILD ORDER BY AND APPEND IT - // qOrderBy = DataListSqlFilterOrderByBuilder.DataFilterToSQLOrderBy(TheFilter); - // } - - // //LIMIT AND OFFSET CLAUSE - PAGING - // listOptions.Offset = listOptions.Offset ?? ListOptions.DefaultOffset; - // listOptions.Limit = listOptions.Limit ?? ListOptions.DefaultLimit; - // var qLimitOffset = $"LIMIT {listOptions.Limit} OFFSET {listOptions.Offset}"; - - // //PUT IT ALL TOGETHER - // string qDataQuery = string.Empty; - // string qTotalRecordsQuery = string.Empty; - // if (TheFilter != null) - // { - // qDataQuery = $"{qSelectColumns} {qFrom} {qWhere} {qOrderBy} {qLimitOffset}"; - // qTotalRecordsQuery = $"SELECT COUNT(*) {qFrom} {qWhere}"; - // } - // else - // { - // qDataQuery = $"{qSelectColumns} {qFrom} {qLimitOffset}"; - // qTotalRecordsQuery = $"SELECT COUNT(*) {qFrom}"; - // } - - - - // //RETURN OBJECTS - // int returnRowColumnCount = templateFieldList.Count() + 1;//Templates don't have the DF column in them but we need it and it's in the query so plus one - // List> rows = new List>(); - // long totalRecordCount = 0; - - // //QUERY THE DB - // using (var command = ct.Database.GetDbConnection().CreateCommand()) - // { - // ct.Database.OpenConnection(); - - // //GET DATA RETURN ROWS - // command.CommandText = qDataQuery; - // using (var dr = command.ExecuteReader()) - // { - // while (dr.Read()) - // { - // List row = new List(returnRowColumnCount); - - // //PROCESS THE DF DEFAULT FIRST COLUMN - // //first column is always the underlying id value of the default record to open for this row in the client ui - // row.Add(new AyaFieldData() { v = dr.GetInt64(0) }); - - // //GetOrdinal by name is flakey in npgsql so just going by field definition and ordinal numerically - // int nCurrentColumnPointer = 1;//start at 1 - - // //INSERT REMAINING FIELDS FROM TEMPLATE INTO THE RETURN ROWS LIST - // foreach (string TemplateField in templateFieldList) - // { - // //get the AyaObjectFieldDefinition - // AyaDataListFieldDefinition f = DataList.FieldDefinitions.FirstOrDefault(x => x.FieldKey == TemplateField); - - // AyaFieldData AyaField = new AyaFieldData(); - // AyaField.v = dr.GetValue(nCurrentColumnPointer); - // nCurrentColumnPointer++; - - // if (f.SqlIdColumnName != null)//skip over df column id, it's not there - // { - // AyaField.i = dr.GetInt64(nCurrentColumnPointer); - // nCurrentColumnPointer++; - // } - // row.Add(AyaField); - // } - // rows.Add(row); - // } - // } - - // //GET TOTAL RECORD COUNT - // command.CommandText = qTotalRecordsQuery; - // using (var dr = command.ExecuteReader()) - // { - // if (dr.Read()) - // { - // totalRecordCount = dr.GetInt64(0); - // } - // } - // } - - // //BUILD THE PAGING LINKS PORTION - // var pageLinks = new PaginationLinkBuilder(Url, routeName, null, listOptions, totalRecordCount).PagingLinksObject(); - - // //BUILD THE COLUMNS RETURN PROPERTY JSON FRAGMENT - // string ColumnsJSON = string.Empty; - // if (listOptions.Mini) - // { - // ColumnsJSON = DataList.GenerateMINIListColumnsJSON(); - // } - // else - // { - // ColumnsJSON = DataList.GenerateListColumnsJSONFromTemplate(MOCK_WIDGET_USER_EMAIL_DISPLAY_TEMPLATE_JSON); - // } - - - // ApiPagedResponse pr = new ApiPagedResponse(rows, pageLinks, ColumnsJSON); - // return pr; - // } #endregion ////////////////////////////////////////////////////////////////////////////////////////////////