Ejemplo n.º 1
0
        public async Task <IActionResult> GetPaginated([FromQuery] ProductPagingModel parameters)
        {
            var products = await _productRepository.ListAllAsync();

            var productsPaginated = _productRepository.ListPaginated(parameters.pageNumber, parameters.pageSize);
            // if CurrentPage is greater than 1 means it has previousPage
            var previousPage = parameters.pageNumber > 1 ? "Yes" : "No";
            var TotalPages   = (int)Math.Ceiling(products.Count / (double)parameters.pageSize);
            // if TotalPages is greater than CurrentPage means it has nextPage
            var nextPage           = parameters.pageNumber < (int)Math.Ceiling(products.Count / (double)parameters.pageSize) ? "Yes" : "No";
            var paginationMetadata = new
            {
                totalCount  = products.Count,
                pageSize    = parameters.pageSize,
                currentPage = parameters.pageNumber,
                totalPages  = TotalPages,
                previousPage,
                nextPage
            };

            // Setting Header
            HttpContext.Response.Headers.Add("Paging-Headers", JsonConvert.SerializeObject(paginationMetadata));
            return(Ok(productsPaginated));
        }
        public ActionResult List(
            [CanBeNull][Bind(Prefix = "category")] string category       = null,
            [CanBeNull][Bind(Prefix = "subCategory")] string subCategory = null,
            [CanBeNull][Bind(Prefix = "page")] int page         = 0,
            [CanBeNull][Bind(Prefix = "pageSize")] int pageSize = 6,
            [CanBeNull][Bind(Prefix = "sort")] string sort      = "name:asc")
        {
            if (page < 0)
            {
                page = 0;
            }

            if (pageSize < 1)
            {
                pageSize = 1;
            }

            var searchStringModel = this.contentSearchHelper.GetDataSourceQuery(Context.Item, Context.Device, ProductListRenderingId).ToList();

            if (!searchStringModel.Any())
            {
                return(new EmptyResult());
            }

            string currectCategory = !string.IsNullOrEmpty(subCategory) ? subCategory : category;

            if (!string.IsNullOrEmpty(currectCategory))
            {
                Item categoryItem = this.productService.GetCategory(currectCategory);
                if (ReferenceEquals(categoryItem, null))
                {
                    return(new EmptyResult());
                }

                var categories = this.productService.GetRelatedCategories(categoryItem.ID);
                categories.Insert(0, categoryItem);

                foreach (Item item in categories)
                {
                    searchStringModel.Add(new SearchStringModel(Constants.KnownFieldNames.ProductClassesFieldName, IdHelper.NormalizeGuid(item.ID), "should"));
                }
            }

            var sorting = ProductSortingModel.Parse(sort);

            searchStringModel.Add(new SearchStringModel("sort", sorting.Field, sorting.Direction));

            var pagedProducts = this.productService.GetProducts(searchStringModel, page, pageSize);
            var productIds    = pagedProducts.List.Select(p => p["ExternalID"]).ToList();

            var prices     = this.pricingService.GetProductBulkPrices(productIds);
            var stockInfos = this._inventoryService.GetStockInformation(Context.Site.Name, productIds, StockDetailsLevel.All, this._obecContext.InventoryLocation, string.Empty);

            var productModels = pagedProducts.List.Select(p => this.GetProductModel(p, prices[p["ExternalID"]], stockInfos.FirstOrDefault(i => i.Product.ProductId.Equals(p["ExternalID"], StringComparison.OrdinalIgnoreCase))));

            var pagingModel = new ProductPagingModel(pagedProducts.Page, pagedProducts.PageSize, pagedProducts.TotalCount);

            var model = new ProductListModel(productModels, pagingModel, sorting);

            return(this.View(model));
        }