diff --git a/server/AyaNova/Controllers/WidgetController.cs b/server/AyaNova/Controllers/WidgetController.cs index ec02d527..d3a66dcf 100644 --- a/server/AyaNova/Controllers/WidgetController.cs +++ b/server/AyaNova/Controllers/WidgetController.cs @@ -84,37 +84,36 @@ namespace AyaNova.Api.Controllers } -//COMMENTED OUT, FOR NOW UNTIL I GET THE FULLY WORKING TEST LIST BELOW THEN COME BACK AND LOOK AT THIS - // /// - // /// Get list for selection / viewing - // /// - // /// Required roles: Any (some roles might have restrictions on exact fields that are returned) - // /// - // /// - // /// Paging, filtering and sorting options - // /// Collection with paging data - // [HttpGet("List", Name = nameof(List))] - // public ActionResult List([FromQuery] ListOptions pagingOptions) - // { - // if (serverState.IsClosed) - // return StatusCode(503, new ApiErrorResponse(ApiErrorCode.API_CLOSED, null, serverState.Reason)); + //COMMENTED OUT, FOR NOW UNTIL I GET THE FULLY WORKING TEST LIST BELOW THEN COME BACK AND LOOK AT THIS + /// + /// Get list for selection / viewing + /// + /// Required roles: Any in-house staff (some roles might have restrictions on exact fields that are returned) + /// + /// + /// Paging, filtering and sorting options + /// Collection with paging data + [HttpGet("List", Name = nameof(List))] + public ActionResult List([FromQuery] ListOptions pagingOptions) + { + if (serverState.IsClosed) + return StatusCode(503, new ApiErrorResponse(ApiErrorCode.API_CLOSED, null, serverState.Reason)); - // if (!ModelState.IsValid) - // return BadRequest(new ApiErrorResponse(ModelState)); + if (!ModelState.IsValid) + return BadRequest(new ApiErrorResponse(ModelState)); - // //Instantiate the business object handler - // WidgetBiz biz = WidgetBiz.GetBiz(ct, HttpContext); + //Instantiate the business object handler + WidgetBiz biz = WidgetBiz.GetBiz(ct, HttpContext); - // ApiPagedResponse pr = biz.GetList(Url, nameof(List), pagingOptions).Result; - // return Ok(new ApiOkWithPagingResponse(pr)); - // // string ret= biz.GetList(Url, nameof(List), pagingOptions).Result; - // // return Ok(ret); - // } + ApiPagedResponse pr = biz.GetList(Url, nameof(List), pagingOptions).Result; + return Ok(new ApiOkWithPagingResponse(pr)); - /// + } + + /// /// TEST list with relationships /// - /// Required roles: Any (some roles might have restrictions on exact fields that are returned) + /// Required roles: Any in-house staff (some roles might have restrictions on exact fields that are returned) /// /// /// Paging, filtering and sorting options diff --git a/server/AyaNova/biz/WidgetBiz.cs b/server/AyaNova/biz/WidgetBiz.cs index a9b9a591..407e760e 100644 --- a/server/AyaNova/biz/WidgetBiz.cs +++ b/server/AyaNova/biz/WidgetBiz.cs @@ -277,127 +277,14 @@ namespace AyaNova.Biz 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""], + ""full"":[""widgetname"",""widgetserial"",""widgetdollaramount"",""widgetroles"",""widgetstartdate"",""active"",""username""], ""mini"":[""widgetname"",""widgetserial""] } "; - - //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); - - var qFrom = "FROM AWIDGET"; - - //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); - } - - //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}"; - - //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; - - //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); - } - } - - 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.... ]} - - - - - //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); - } - - //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) - - //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; + return await DataListFetcher.GetResponse(nameof(WidgetDataList), ct, Url, routeName, listOptions, MOCK_WIDGET_DISPLAY_TEMPLATE_JSON, UserId); } #endregion