/// <summary> /// Async search products by given criteria /// </summary> /// <param name="criteria"></param> /// <returns></returns> public async Task <CatalogSearchResult> SearchProductsAsync(CatalogSearchCriteria criteria) { criteria = criteria.Clone(); //exclude categories criteria.ResponseGroup = criteria.ResponseGroup & (~CatalogSearchResponseGroup.WithCategories); //include products criteria.ResponseGroup = criteria.ResponseGroup | CatalogSearchResponseGroup.WithProducts; var workContext = _workContextFactory(); var searchCriteria = criteria.ToServiceModel(workContext); var result = await _searchApi.SearchModuleSearchAsync(searchCriteria); var products = result.Products.Select(x => x.ToWebModel(workContext.CurrentLanguage, workContext.CurrentCurrency, workContext.CurrentStore)).ToList(); if (!products.IsNullOrEmpty()) { var taskList = new List <Task>(); taskList.Add(LoadProductsInventoriesAsync(products)); taskList.Add(_pricingService.EvaluateProductPricesAsync(products)); await Task.WhenAll(taskList.ToArray()); } return(new CatalogSearchResult { Products = new StaticPagedList <Product>(products, criteria.PageNumber, criteria.PageSize, result.ProductsTotalCount.Value), Aggregations = !result.Aggregations.IsNullOrEmpty() ? result.Aggregations.Select(x => x.ToWebModel(workContext.CurrentLanguage.CultureName)).ToArray() : new Aggregation[] { } }); }
/// <summary> /// Search products by given criteria /// </summary> /// <param name="criteria"></param> /// <returns></returns> public CatalogSearchResult SearchProducts(CatalogSearchCriteria criteria) { var workContext = _workContextFactory(); criteria = criteria.Clone(); //exclude categories criteria.ResponseGroup = criteria.ResponseGroup & (~CatalogSearchResponseGroup.WithCategories); //include products criteria.ResponseGroup = criteria.ResponseGroup | CatalogSearchResponseGroup.WithProducts; var searchCriteria = criteria.ToServiceModel(workContext); var result = _searchApi.SearchModuleSearch(searchCriteria); var products = result.Products.Select(x => x.ToWebModel(workContext.CurrentLanguage, workContext.CurrentCurrency, workContext.CurrentStore)).ToList(); //Unable to make parallel call because its synchronous method (in future this information pricing and inventory will be getting from search index) and this lines can be removed _pricingService.EvaluateProductPrices(products); LoadProductsInventories(products); return(new CatalogSearchResult { Products = new StaticPagedList <Product>(products, criteria.PageNumber, criteria.PageSize, result.ProductsTotalCount.Value), Aggregations = !result.Aggregations.IsNullOrEmpty() ? result.Aggregations.Select(x => x.ToWebModel(workContext.CurrentLanguage.CultureName)).ToArray() : new Aggregation[] { } }); }
/// <summary> /// Async search categories by given criteria /// </summary> /// <param name="criteria"></param> /// <returns></returns> public async Task <IPagedList <Category> > SearchCategoriesAsync(CatalogSearchCriteria criteria) { var workContext = _workContextFactory(); criteria = criteria.Clone(); //exclude products criteria.ResponseGroup = criteria.ResponseGroup & (~CatalogSearchResponseGroup.WithProducts); //include categories criteria.ResponseGroup = criteria.ResponseGroup | CatalogSearchResponseGroup.WithCategories; var searchCriteria = criteria.ToServiceModel(workContext); var result = await _catalogModuleApi.CatalogModuleSearchSearchAsync(searchCriteria); //API temporary does not support paginating request to categories (that's uses PagedList with superset instead StaticPagedList) return(new PagedList <Category>(result.Categories.Select(x => x.ToWebModel(workContext.CurrentLanguage, workContext.CurrentStore)), criteria.PageNumber, criteria.PageSize)); }
/// <summary> /// search categories by given criteria /// </summary> /// <param name="criteria"></param> /// <returns></returns> public IPagedList <Category> SearchCategories(CatalogSearchCriteria criteria) { var workContext = _workContextFactory(); criteria = criteria.Clone(); //exclude products criteria.ResponseGroup = criteria.ResponseGroup & (~CatalogSearchResponseGroup.WithProducts); //include categories criteria.ResponseGroup = criteria.ResponseGroup | CatalogSearchResponseGroup.WithCategories; var searchCriteria = criteria.ToCatalogApiModel(workContext); var categories = _catalogModuleApi.CatalogModuleSearchSearch(searchCriteria).Categories.Select(x => x.ToWebModel(workContext.CurrentLanguage, workContext.CurrentStore)).ToList(); //API temporary does not support paginating request to categories (that's uses PagedList with superset) return(new PagedList <Category>(categories, criteria.PageNumber, criteria.PageSize)); }