Exemplo n.º 1
0
        private string CreateProductsResourceUri(ProductDtoParameter parameters, ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(Url.Link(nameof(GetProducts), new
                {
                    CategoryID = parameters.CategoryID,
                    OrderBy = parameters.OrderBy,
                    PageNumber = parameters.PageNumber - 1,
                    PageSize = parameters.PageSize
                }));

            case ResourceUriType.NextPage:
                return(Url.Link(nameof(GetProducts), new
                {
                    CategoryID = parameters.CategoryID,
                    OrderBy = parameters.OrderBy,
                    PageNumber = parameters.PageNumber + 1,
                    PageSize = parameters.PageSize
                }));

            default:
                return(Url.Link(nameof(GetProducts), new
                {
                    CategoryID = parameters.CategoryID,
                    OrderBy = parameters.OrderBy,
                    PageNumber = parameters.PageNumber,
                    PageSize = parameters.PageSize
                }));
            }
        }
Exemplo n.º 2
0
        public async Task <ActionResult <IEnumerable <ProductDto> > > GetProducts([FromQuery] ProductDtoParameter parameter)
        {
            var queryProduct = productRepository.GetQueryableProducts().Where(p => p.OnSale && !p.IsDeleted);

            if (!string.IsNullOrWhiteSpace(parameter.CategoryID))
            {
                queryProduct = queryProduct.Where(p => p.CategoryID.Equals(parameter.CategoryID));
            }
            switch (parameter.OrderBy)
            {
            case OrderType.None:
                queryProduct = queryProduct.OrderBy(p => p.OrderbyId);
                break;

            case OrderType.Recommend:
                queryProduct = queryProduct.Where(p => p.Recommend > 0)
                               .OrderBy(p => p.Recommend);
                break;

            case OrderType.TopSales:
                queryProduct = queryProduct.OrderByDescending(p => p.SoldCount);
                break;

            default: throw new IndexOutOfRangeException();
            }

            var pagedProduct = await PagedList <Product> .Create(queryProduct, parameter.PageNumber, parameter.PageSize);

            var previousPageLink = pagedProduct.HasPrevious
                                 ? CreateProductsResourceUri(parameter, ResourceUriType.PreviousPage)
                                 : null;

            var nextPageLink = pagedProduct.HasNext
                                 ? CreateProductsResourceUri(parameter, ResourceUriType.NextPage)
                                 : null;

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

            Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadata, new JsonSerializerOptions
            {
                Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
            }));

            var productDtos = mapper.Map <IEnumerable <ProductDto> >(pagedProduct);

            return(Ok(productDtos));
        }