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));
            }
        }
Esempio n. 3
0
        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());
            }
        }
Esempio n. 4
0
        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);
        }
Esempio n. 7
0
        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));
        }