Exemplo n.º 1
0
        private IEnumerable <LinkDto> CreateLinksForCategories(
            CategoriesResourceParameters categoriesResourceParameters,
            bool hasNext, bool hasPrevious)
        {
            var links = new List <LinkDto>
            {
                new LinkDto(CreateCategoriesResourceUri(categoriesResourceParameters,
                                                        ResourceUriType.Current)
                            , "self", "GET")
            };

            if (hasNext)
            {
                links.Add(
                    new LinkDto(CreateCategoriesResourceUri(categoriesResourceParameters,
                                                            ResourceUriType.NextPage),
                                "nextPage", "GET"));
            }

            if (hasPrevious)
            {
                links.Add(
                    new LinkDto(CreateCategoriesResourceUri(categoriesResourceParameters,
                                                            ResourceUriType.PreviousPage),
                                "previousPage", "GET"));
            }

            return(links);
        }
Exemplo n.º 2
0
        private string CreateCategoriesResourceUri(CategoriesResourceParameters categoriesResourceParameters,
                                                   ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(_urlHelper.Link("GetCategories",
                                       new
                {
                    fields = categoriesResourceParameters.Fields,
                    orderBy = categoriesResourceParameters.OrderBy,
                    searchQuery = categoriesResourceParameters.SearchQuery,
                    pageNumber = categoriesResourceParameters.PageIndex - 1,
                    pageSize = categoriesResourceParameters.PageSize
                }));

            case ResourceUriType.NextPage:
                return(_urlHelper.Link("GetCategories",
                                       new
                {
                    fields = categoriesResourceParameters.Fields,
                    orderBy = categoriesResourceParameters.OrderBy,
                    searchQuery = categoriesResourceParameters.SearchQuery,
                    pageNumber = categoriesResourceParameters.PageIndex + 1,
                    pageSize = categoriesResourceParameters.PageSize
                }));

            case ResourceUriType.Current:
            default:
                return(_urlHelper.Link("GetCategories",
                                       new
                {
                    fields = categoriesResourceParameters.Fields,
                    orderBy = categoriesResourceParameters.OrderBy,
                    searchQuery = categoriesResourceParameters.SearchQuery,
                    pageNumber = categoriesResourceParameters.PageIndex,
                    pageSize = categoriesResourceParameters.PageSize
                }));
            }
        }
Exemplo n.º 3
0
        public Task <PagedList <Category> > GetCategoriesAsync(CategoriesResourceParameters categoriesResourceParameters)
        {
            var collectionBeforePaging =
                QueryableExtensions.ApplySort(_categoryRepository
                                              .FindAllCategoriesPagedOf(categoriesResourceParameters.PageIndex,
                                                                        categoriesResourceParameters.PageSize),
                                              categoriesResourceParameters.OrderBy,
                                              _propertyMappingService.GetPropertyMapping <CategoryUiModel, Category>());


            if (!string.IsNullOrEmpty(categoriesResourceParameters.SearchQuery))
            {
                // trim & ignore casing
                var searchQueryForWhereClause = categoriesResourceParameters.SearchQuery
                                                .Trim().ToLowerInvariant();

                collectionBeforePaging.QueriedItems = collectionBeforePaging.QueriedItems
                                                      .Where(a => a.Name.ToLowerInvariant().Contains(searchQueryForWhereClause));
            }

            return(Task.Run(() => PagedList <Category> .Create(collectionBeforePaging,
                                                               categoriesResourceParameters.PageIndex,
                                                               categoriesResourceParameters.PageSize)));
        }
Exemplo n.º 4
0
        public async Task <IActionResult> GetCategoriesAsync([FromQuery] CategoriesResourceParameters categoriesResourceParameters,
                                                             [FromHeader(Name = "Accept")] string mediaType)
        {
            if (!_propertyMappingService.ValidMappingExistsFor <CategoryUiModel, Category>
                    (categoriesResourceParameters.OrderBy))
            {
                return(BadRequest());
            }

            if (!_typeHelperService.TypeHasProperties <CategoryUiModel>
                    (categoriesResourceParameters.Fields))
            {
                return(BadRequest());
            }

            var categoriesQueryable =
                await _inquiryAllCategoriesProcessor.GetCategoriesAsync(categoriesResourceParameters);

            var categories = Mapper.Map <IEnumerable <CategoryUiModel> >(categoriesQueryable);

            if (mediaType.Contains("application/vnd.marvin.hateoas+json"))
            {
                var paginationMetadata = new
                {
                    totalCount  = categoriesQueryable.TotalCount,
                    pageSize    = categoriesQueryable.PageSize,
                    currentPage = categoriesQueryable.CurrentPage,
                    totalPages  = categoriesQueryable.TotalPages,
                };

                Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(paginationMetadata));

                var links = CreateLinksForCategories(categoriesResourceParameters,
                                                     categoriesQueryable.HasNext, categoriesQueryable.HasPrevious);

                var shapedCategories = categories.ShapeData(categoriesResourceParameters.Fields);

                var shapedCategoriesWithLinks = shapedCategories.Select(category =>
                {
                    var categoryAsDictionary = category as IDictionary <string, object>;
                    var categoryLinks        =
                        CreateLinksForCategory((Guid)categoryAsDictionary["Id"], categoriesResourceParameters.Fields);

                    categoryAsDictionary.Add("links", categoryLinks);

                    return(categoryAsDictionary);
                });

                var linkedCollectionResource = new
                {
                    value = shapedCategoriesWithLinks,
                    links = links
                };

                return(Ok(linkedCollectionResource));
            }
            else
            {
                var previousPageLink = categoriesQueryable.HasPrevious ? CreateCategoriesResourceUri(categoriesResourceParameters,
                                                                                                     ResourceUriType.PreviousPage)
          : null;

                var nextPageLink = categoriesQueryable.HasNext
          ? CreateCategoriesResourceUri(categoriesResourceParameters, ResourceUriType.NextPage)
          : null;

                var paginationMetadata = new
                {
                    previousPageLink = previousPageLink,
                    nextPageLink     = nextPageLink,
                    totalCount       = categoriesQueryable.TotalCount,
                    pageSize         = categoriesQueryable.PageSize,
                    currentPage      = categoriesQueryable.CurrentPage,
                    totalPages       = categoriesQueryable.TotalPages
                };

                Response.Headers.Add("X-Pagination",
                                     JsonConvert.SerializeObject(paginationMetadata));

                return(Ok(categories.ShapeData(categoriesResourceParameters.Fields)));
            }
        }