public async Task <IActionResult> Get([FromQuery] PaginationModel pagination, [FromQuery] string categoriesString, [FromQuery] string subcategoriesString, [FromQuery] bool includeBlocked = false)
        {
            if (categoriesString == null)
            {
                categoriesString = "";
            }

            if (subcategoriesString == null)
            {
                subcategoriesString = "";
            }

            if (pagination.FilterElement == null)
            {
                pagination.FilterElement = "";
            }

            if (pagination.FilterValue == null)
            {
                pagination.FilterValue = "";
            }

            if (pagination.SortElement == null)
            {
                pagination.SortElement = "";
            }

            ICollection <string> categories = categoriesString.Split(new[] { ',' }, System.StringSplitOptions.RemoveEmptyEntries);

            ICollection <string> subcategories = subcategoriesString.Split(new[] { ',' }, System.StringSplitOptions.RemoveEmptyEntries);

            return(await this.Execute(false, false, async() =>
            {
                ProductDetailsListPaginatedModel result = await products.GetAll(pagination, categories, subcategories, includeBlocked);

                return this.Ok(result);
            }));
        }
Exemplo n.º 2
0
        //Get details for a range of products - filtered, sorted and paginated
        public async Task <ProductDetailsListPaginatedModel> GetAll(PaginationModel pagination, ICollection <string> categories, ICollection <string> subcategories, bool includeBlocked)
        {
            ICollection <ProductDetailsModel> products = db.Products
                                                         .ProjectTo <ProductDetailsModel>()
                                                         .ToList();

            foreach (var product in products)
            {
                product.PromoDiscountsIds = await this.GetAssociatedPromoDiscuntsIds(product.Id);
            }

            foreach (var product in products)
            {
                product.Categories = await this.GetAssociatedCategoryIds(product.Id);
            }

            foreach (var product in products)
            {
                product.Subcategories = await this.GetAssociatedSubcategoryIds(product.Id);
            }

            foreach (ProductDetailsModel product in products)
            {
                product.Discount = await this.CalculateDiscount(product.Id);
            }

            if (!string.IsNullOrEmpty(pagination.FilterElement))
            {
                products = await this.FilterElements(products, pagination.FilterElement, pagination.FilterValue);
            }

            if (categories != null && categories.Count > 0)
            {
                products = await this.FilterCategories(products, categories);
            }

            if (subcategories != null && subcategories.Count > 0)
            {
                products = await this.FilterSubcategories(products, subcategories);
            }

            if (!string.IsNullOrEmpty(pagination.SortElement))
            {
                products = await this.SortElements(products, pagination.SortElement, pagination.SortDesc);
            }

            if (pagination.FilterElement.ToLower() != SortAndFilterConstants.IsBlocked && includeBlocked == false)
            {
                products = await this.FilterElements(products, SortAndFilterConstants.IsBlocked, false.ToString());
            }

            int productsCount = products.Count();

            if (pagination.Page < 1)
            {
                pagination.Page = 1;
            }

            if (pagination.Size <= 1)
            {
                pagination.Size = productsCount;
            }

            products = products.Skip(pagination.Size * (pagination.Page - 1)).Take(pagination.Size).ToList();

            ICollection <CategoryDetailsModel> uniqueCategories = await this.PopulateCategories(products);

            ICollection <SubcategoryDetailsModel> uniqueSubategories = await this.PopulateSubcategories(products);

            ProductDetailsListPaginatedModel result = new ProductDetailsListPaginatedModel
            {
                Products      = products,
                ProductsCount = productsCount
            };

            result.Categories    = uniqueCategories;
            result.Subcategories = uniqueSubategories;

            return(result);
        }