public virtual async Task <IActionResult> GetByIdChildCollection(string id, string collection, WebApiSearchQueryParamsDto resourceParameters) { if (string.IsNullOrEmpty(resourceParameters.OrderBy)) { resourceParameters.OrderBy = "Id"; } //order by if (!UIHelper.ValidOrderByFor <TDto>(resourceParameters.OrderBy)) { return(BadRequest(Messages.OrderByInvalid)); } if (!RelationshipHelper.IsValidCollectionExpression(collection, typeof(TDto))) { return(BadRequest(Messages.CollectionInvalid)); } if (RelationshipHelper.IsCollectionExpressionCollectionItem(collection)) { return(await GetCollectionItem(id, collection, resourceParameters.Fields)); } var collectionItemType = RelationshipHelper.GetCollectionExpressionType(collection, typeof(TDto)); //fields if (!UIHelper.ValidFieldsFor(collectionItemType, resourceParameters.Fields)) { return(BadRequest(Messages.FieldsInvalid)); } //filter if (!UIHelper.ValidFilterFor(collectionItemType, HttpContext.Request.Query)) { return(BadRequest(Messages.FiltersInvalid)); } var filter = UIHelper.GetFilter(collectionItemType, HttpContext.Request.Query); var cts = TaskHelper.CreateChildCancellationTokenSource(ClientDisconnectedToken()); var result = await Service.GetByIdWithPagedCollectionPropertyAsync(cts.Token, id, collection, resourceParameters.Search, filter, resourceParameters.OrderBy, resourceParameters.Page, resourceParameters.PageSize); IEnumerable <Object> list = ((IEnumerable <Object>)RelationshipHelper.GetCollectionExpressionData(collection, typeof(TDto), result.Dto)); var paginationMetadata = new PagingInfoDto { Page = resourceParameters.Page, PageSize = resourceParameters.PageSize, Records = result.TotalCount, PreviousPageLink = null, NextPageLink = null }; if (paginationMetadata.HasPrevious) { paginationMetadata.PreviousPageLink = CreateCollectionPropertyResourceUri(collection, resourceParameters, ResourceUriType.PreviousPage); } if (paginationMetadata.HasNext) { paginationMetadata.NextPageLink = CreateCollectionPropertyResourceUri(collection, resourceParameters, ResourceUriType.NextPage); } Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(paginationMetadata).Replace(Environment.NewLine, "")); var links = CreateLinksForCollectionProperty(collection, resourceParameters, paginationMetadata.HasNext, paginationMetadata.HasPrevious); var shapedData = UIHelper.ShapeListData(list, collectionItemType, resourceParameters.Fields); var shapedDataWithLinks = shapedData.Select(collectionPropertyDtoItem => { var collectionPropertyDtoItemAsDictionary = collectionPropertyDtoItem as IDictionary <string, object>; var collectionPropertyDtoItemLinks = CreateLinksForCollectionItem(id, collection + "/" + collectionPropertyDtoItemAsDictionary["Id"].ToString(), resourceParameters.Fields); collectionPropertyDtoItemAsDictionary.Add("links", collectionPropertyDtoItem); return(collectionPropertyDtoItemAsDictionary); }).ToList(); var linkedCollectionResource = new WebApiListResponseDto <IDictionary <string, object> > { Value = shapedDataWithLinks , Links = links }; return(Ok(linkedCollectionResource)); }
public virtual async Task <IActionResult> GetByIdChildCollection(string id, string collection, WebApiPagedSearchOrderingRequestDto resourceParameters) { if (string.IsNullOrEmpty(resourceParameters.OrderBy)) { resourceParameters.OrderBy = "Id"; } if (!RelationshipHelper.IsValidCollectionExpression(collection, typeof(TDto))) { return(ApiErrorMessage(Messages.CollectionInvalid)); } if (RelationshipHelper.IsCollectionExpressionCollectionItem(collection)) { return(await GetCollectionItem(id, collection, resourceParameters.Fields)); } var collectionItemType = RelationshipHelper.GetCollectionExpressionType(collection, typeof(TDto)); if (!TypeHelperService.TypeHasProperties(collectionItemType, resourceParameters.Fields)) { return(ApiErrorMessage(Messages.FieldsInvalid)); } var cts = TaskHelper.CreateChildCancellationTokenSource(ClientDisconnectedToken()); var dataTask = Service.GetByIdWithPagedCollectionPropertyAsync(cts.Token, id, collection, resourceParameters.Search, resourceParameters.OrderBy, resourceParameters.OrderType == "asc" ? true : false, resourceParameters.Page.HasValue ? resourceParameters.Page - 1 : null, resourceParameters.PageSize); var totalTask = Service.GetByIdWithPagedCollectionPropertyCountAsync(cts.Token, id, collection, resourceParameters.Search); await TaskHelper.WhenAllOrException(cts, dataTask, totalTask); var result = dataTask.Result; var total = totalTask.Result; IEnumerable <Object> list = ((IEnumerable <Object>)RelationshipHelper.GetCollectionExpressionData(collection, typeof(TDto), result)); var paginationMetadata = new PagingInfoDto { Page = resourceParameters.Page.HasValue ? resourceParameters.Page.Value : 1, PageSize = resourceParameters.PageSize.HasValue ? resourceParameters.PageSize.Value : list.Count(), Records = total, PreviousPageLink = null, NextPageLink = null }; if (paginationMetadata.HasPrevious) { paginationMetadata.PreviousPageLink = CreateCollectionPropertyResourceUri(collection, resourceParameters, ResourceUriType.PreviousPage); } if (paginationMetadata.HasNext) { paginationMetadata.NextPageLink = CreateCollectionPropertyResourceUri(collection, resourceParameters, ResourceUriType.NextPage); } Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(paginationMetadata)); var links = CreateLinksForCollectionProperty(collection, resourceParameters, paginationMetadata.HasNext, paginationMetadata.HasPrevious); var shapedData = IEnumerableExtensions.ShapeData(list, collectionItemType, resourceParameters.Fields); var shapedDataWithLinks = shapedData.Select(collectionPropertyDtoItem => { var collectionPropertyDtoItemAsDictionary = collectionPropertyDtoItem as IDictionary <string, object>; var collectionPropertyDtoItemLinks = CreateLinksForCollectionItem(id, collection + "/" + collectionPropertyDtoItemAsDictionary["Id"].ToString(), resourceParameters.Fields); collectionPropertyDtoItemAsDictionary.Add("links", collectionPropertyDtoItem); return(collectionPropertyDtoItemAsDictionary); }); var linkedCollectionResource = new WebApiListResponseDto <IDictionary <string, object> > { Value = shapedDataWithLinks , Links = links }; return(Ok(linkedCollectionResource)); }