private static GetProductsByCategoryRequest GenerateProductSearchRequestFrom(JsonProductSearchRequest request)
        {
            GetProductsByCategoryRequest productSearchRequest = new GetProductsByCategoryRequest();
            productSearchRequest.NoOfResultsPerPage = int.Parse(ApplicationSettingsFactory.GetApplicationSettings().NoOfResultsPerPage);
            productSearchRequest.Index = request.Index;
            productSearchRequest.CategoryId = request.CategoryId;
            productSearchRequest.SortBy = request.SortBy;

            List<RefinementGroup> refinementGroups = new List<RefinementGroup>();
            foreach (var jsonRefinementGroup in request.RefinementGroups)
            {
                switch ((RefinementGroupings)jsonRefinementGroup.GroupId)
                {
                    case RefinementGroupings.brand:
                        productSearchRequest.BrandIds = jsonRefinementGroup.SelectedRefinements;
                        break;
                    case RefinementGroupings.color:
                        productSearchRequest.ColorIds = jsonRefinementGroup.SelectedRefinements;
                        break;
                    case  RefinementGroupings.size:
                        productSearchRequest.SizeIds = jsonRefinementGroup.SelectedRefinements;
                        break;
                    default:
                        break;
                }
            }
            return productSearchRequest;
        }
 private static GetProductsByCategoryRequest GenerateInitialProductSearchRequestFrom(int categoryId)
 {
     GetProductsByCategoryRequest productSearchRequest = new GetProductsByCategoryRequest();
     productSearchRequest.NoOfResultsPerPage = int.Parse(ApplicationSettingsFactory.GetApplicationSettings().NoOfResultsPerPage);
     productSearchRequest.CategoryId = categoryId;
     productSearchRequest.Index = 1;
     productSearchRequest.SortBy = ProductsSortBy.PriceHighToLow;
     return productSearchRequest;
 }
 public GetProductsByCategoryResponse GetProductsByCategory(GetProductsByCategoryRequest request)
 {
     GetProductsByCategoryResponse response;
     Query productQuery = ProductSearchRequestQueryGenerator.CreateQueryFor(request);
     IEnumerable<Product> productMatchingRefinemens = GetAllProductsMatchingQueryAndSort(request, productQuery);
     response = productMatchingRefinemens.CreateProductSearchResultsFrom(request);
     response.SelectedCategoryName = _categoryRepository.FindBy(request.CategoryId).Name;
     return response;
 }
 public static GetProductsByCategoryResponse CreateProductSearchResultsFrom( this IEnumerable<Product> productsMatchingRefinement, GetProductsByCategoryRequest request)
 {
     GetProductsByCategoryResponse productSearchResultView = new GetProductsByCategoryResponse();
     IEnumerable<ProductTitle> productsFound = productsMatchingRefinement.Select(p => p.Title).Distinct();
     productSearchResultView.SelectedCategory = request.CategoryId;
     productSearchResultView.NoOfTitlesFound = productsFound.Count();
     productSearchResultView.TotalNumberOfPages = NoOfResultPagesGiven(request.NoOfResultsPerPage, productSearchResultView.NoOfTitlesFound);
     productSearchResultView.RefinementGroups = GenerateAvailableProductRefinementsFrom(productsFound);
     productSearchResultView.Products = CropProductListToSatisfyGivenIndex(request.Index, request.NoOfResultsPerPage, productsFound);
     return productSearchResultView;
 }
 private IEnumerable<Product> GetAllProductsMatchingQueryAndSort(GetProductsByCategoryRequest request, Query productQuery)
 {
     IEnumerable<Product> productsMatchingRefinement = _productRepository.FindBy(productQuery);
     switch (request.SortBy)
     {
         case ProductsSortBy.PriceHighToLow:
             productsMatchingRefinement = productsMatchingRefinement.OrderByDescending(p => p.Price);
             break;
         case ProductsSortBy.PriceLowToHigh:
             productsMatchingRefinement = productsMatchingRefinement.OrderBy(p => p.Price);
             break;
     }
     return productsMatchingRefinement;
 }
        public static Query CreateQueryFor(GetProductsByCategoryRequest request)
        {
            Query productQuery = new Query();
            Query colorQuery = new Query();
            Query brandQuery = new Query();
            Query sizeQuery = new Query();
            colorQuery.QueryOperator = QueryOperator.Or;
            foreach (var id in request.ColorIds)
            {
                colorQuery.Add(Criterion.Create<Product>(p => p.Color.Id, id, CriteriaOperator.Equal));
            }
            if (colorQuery.Criteria.Count() > 0)
            {
                productQuery.AddSubQuery(colorQuery);
            }

            brandQuery.QueryOperator = QueryOperator.Or;
            foreach (var id in request.BrandIds)
            {
                brandQuery.Add(Criterion.Create<Product>(p => p.Brand.Id,id, CriteriaOperator.Equal));
            }

            if (brandQuery.Criteria.Count() > 0)
            {
                productQuery.AddSubQuery(brandQuery);
            }

            sizeQuery.QueryOperator = QueryOperator.Or;
            foreach (var id in request.SizeIds)
            {
                sizeQuery.Add(Criterion.Create<Product>(t => t.Size.Id, id, CriteriaOperator.Equal));
            }
            if (sizeQuery.Criteria.Count() > 0)
            {
                productQuery.AddSubQuery(sizeQuery);
            }

            productQuery.Add(Criterion.Create<Product>(t => t.Category.Id, request.CategoryId, CriteriaOperator.Equal));
            return productQuery;
        }