private IEnumerable<LinkDto> CreateLinksForCollections(WebApiPagedSearchOrderingRequestDto resourceParameters, bool hasNext, bool hasPrevious) { var links = new List<LinkDto>(); // self links.Add( new LinkDto(CreateResourceUri(resourceParameters, ResourceUriType.Current) , "self", HttpMethod.Get.Method)); links.Add( new LinkDto(UrlHelper.Action("Create", UrlHelper.ActionContext.RouteData.Values["controller"].ToString(), null, UrlHelper.ActionContext.HttpContext.Request.Scheme), "add", HttpMethod.Post.Method)); if (hasNext) { links.Add( new LinkDto(CreateResourceUri(resourceParameters, ResourceUriType.NextPage), "nextPage", HttpMethod.Get.Method)); } if (hasPrevious) { links.Add( new LinkDto(CreateResourceUri(resourceParameters, ResourceUriType.PreviousPage), "previousPage", HttpMethod.Get.Method)); } return links; }
private string CreateResourceUri( WebApiPagedSearchOrderingRequestDto resourceParameters, ResourceUriType type) { switch (type) { case ResourceUriType.PreviousPage: return(Url.Action(nameof(Search), Url.ActionContext.RouteData.Values["controller"].ToString(), new { fields = resourceParameters.Fields, userId = resourceParameters.UserId, orderBy = resourceParameters.OrderBy, search = resourceParameters.Search, page = resourceParameters.Page - 1, pageSize = resourceParameters.PageSize }, Url.ActionContext.HttpContext.Request.Scheme)); case ResourceUriType.NextPage: return(Url.Action(nameof(Search), Url.ActionContext.RouteData.Values["controller"].ToString(), new { fields = resourceParameters.Fields, userId = resourceParameters.UserId, orderBy = resourceParameters.OrderBy, search = resourceParameters.Search, page = resourceParameters.Page + 1, pageSize = resourceParameters.PageSize }, Url.ActionContext.HttpContext.Request.Scheme)); default: return(Url.Action(nameof(Search), Url.ActionContext.RouteData.Values["controller"].ToString(), new { fields = resourceParameters.Fields, userId = resourceParameters.UserId, orderBy = resourceParameters.OrderBy, search = resourceParameters.Search, page = resourceParameters.Page, pageSize = resourceParameters.PageSize }, Url.ActionContext.HttpContext.Request.Scheme)); } }
public virtual async Task <ActionResult> Index(int page = 1, int pageSize = 10, string orderColumn = "Id", string orderType = "desc", string search = "") { var cts = TaskHelper.CreateChildCancellationTokenSource(ClientDisconnectedToken()); try { var searchDto = new WebApiPagedSearchOrderingRequestDto() { Page = page, PageSize = pageSize, Search = search, OrderBy = orderColumn, OrderType = orderType }; var resp = await Service.SearchAsync(searchDto, cts.Token); var response = new WebApiPagedResponseDto <TDto> { Page = page, PageSize = pageSize, Records = resp.pagingInfo.Records, Rows = resp.data.Value.ToList(), OrderColumn = orderColumn, OrderType = orderType, Search = search }; ViewBag.Search = search; ViewBag.Page = page; ViewBag.PageSize = pageSize; ViewBag.OrderColumn = orderColumn; ViewBag.OrderType = orderType; ViewBag.PageTitle = Title; ViewBag.Admin = Admin; return(View("List", response)); } catch { return(HandleReadException()); } }
public async Task <(WebApiListResponseDto <TReadDto> data, PagingInfoDto pagingInfo)> SearchAsync(WebApiPagedSearchOrderingRequestDto resourceParameters = null, CancellationToken cancellationToken = default) { var response = await client.GetWithQueryString($"{ResourceCollection}", resourceParameters); await response.EnsureSuccessStatusCodeAsync(); return(await response.ContentAsTypeAsync <WebApiListResponseDto <TReadDto> >(), response.Headers.FindAndParsePagingInfo()); }
public virtual async Task<IActionResult> GetPaged(WebApiPagedSearchOrderingRequestDto resourceParameters) { if (string.IsNullOrEmpty(resourceParameters.OrderBy)) resourceParameters.OrderBy = "Id"; if (!TypeHelperService.TypeHasProperties<TDto>(resourceParameters.Fields)) { return ApiErrorMessage(Messages.FieldsInvalid); } var cts = TaskHelper.CreateChildCancellationTokenSource(ClientDisconnectedToken()); var dataTask = Service.SearchAsync(cts.Token, resourceParameters.Search, null, AutoMapperHelper.GetOrderBy<TDto>(resourceParameters.OrderBy, resourceParameters.OrderType), resourceParameters.Page.HasValue ? resourceParameters.Page - 1 : null, resourceParameters.PageSize, true); var totalTask = Service.GetSearchCountAsync(cts.Token, resourceParameters.Search, null); await TaskHelper.WhenAllOrException(cts, dataTask, totalTask); var data = dataTask.Result; var total = totalTask.Result; var paginationMetadata = new WebApiPagedResponseDto<TDto> { Page = resourceParameters.Page.HasValue ? resourceParameters.Page.Value : 1, PageSize = resourceParameters.PageSize.HasValue ? resourceParameters.PageSize.Value : data.Count(), Records = total, PreviousPageLink = null, NextPageLink = null }; if (paginationMetadata.HasPrevious) { paginationMetadata.PreviousPageLink = CreateResourceUri(resourceParameters, ResourceUriType.PreviousPage); } if (paginationMetadata.HasNext) { paginationMetadata.NextPageLink = CreateResourceUri(resourceParameters, ResourceUriType.NextPage); } Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(paginationMetadata)); var links = CreateLinksForCollections(resourceParameters, paginationMetadata.HasNext, paginationMetadata.HasPrevious); var shapedData = IEnumerableExtensions.ShapeData(data.ToList(), resourceParameters.Fields); var shapedDataWithLinks = shapedData.Select(dto => { var dtoAsDictionary = dto as IDictionary<string, object>; var dtoLinks = CreateLinks( dtoAsDictionary["Id"].ToString(), resourceParameters.Fields); dtoAsDictionary.Add("links", dtoLinks); return dtoAsDictionary; }); var linkedCollectionResource = new { value = shapedDataWithLinks, links = links }; return Ok(linkedCollectionResource); }
public virtual async Task<IActionResult> GetCollectionProperty(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 WebApiPagedResponseDto<TDto> { 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 { value = shapedDataWithLinks , links = links }; return Ok(linkedCollectionResource); }
public virtual async Task <ActionResult> Collection(string id, string collection, int page = 1, int pageSize = 10, string orderColumn = "Id", string orderType = "desc", string search = "") { if (!RelationshipHelper.IsValidCollectionExpression(collection, typeof(TDto))) { return(HandleReadException()); } if (RelationshipHelper.IsCollectionExpressionCollectionItem(collection)) { return(await CollectionItemDetails(id, collection)); } var cts = TaskHelper.CreateChildCancellationTokenSource(ClientDisconnectedToken()); try { var searchDto = new WebApiPagedSearchOrderingRequestDto() { Page = page, PageSize = pageSize, Search = search, OrderBy = orderColumn, OrderType = orderType }; var resp = await Service.GetByIdChildCollectionAsync <JObject>(id, collection, searchDto, cts.Token); var response = new WebApiPagedResponseDto <JObject> { Page = page, PageSize = pageSize, Records = resp.pagingInfo.Records, Rows = resp.data.Value.ToList(), OrderColumn = orderColumn, OrderType = orderType, Search = search }; ViewBag.Search = search; ViewBag.Page = page; ViewBag.PageSize = pageSize; ViewBag.OrderColumn = orderColumn; ViewBag.OrderType = orderType; ViewBag.Collection = collection; ViewBag.Id = id; //For the time being collection properties are read only. DDD states that only the Aggregate Root should get updated. ViewBag.DisableCreate = true; ViewBag.DisableEdit = true; ViewBag.DisableDelete = true; ViewBag.DisableSorting = false; ViewBag.DisableEntityEvents = true; ViewBag.DisableSearch = false; ViewBag.PageTitle = Title; ViewBag.Admin = Admin; return(View("List", response)); } catch { return(HandleReadException()); } }
public virtual async Task <ActionResult <WebApiListResponseDto <TDto> > > Search([FromQuery] WebApiPagedSearchOrderingRequestDto resourceParameters) { if (User.Claims.Where(c => c.Type == JwtClaimTypes.Scope && c.Value.EndsWith(ResourceCollectionsCore.CRUD.Operations.Read)).Count() == 0) { resourceParameters.UserId = UserId; } return(await List(resourceParameters)); }