public IHttpActionResult Search(Domain.Catalog.Model.SearchCriteria criteria) { criteria = criteria ?? new Domain.Catalog.Model.SearchCriteria(); criteria.Normalize(); criteria.ApplyRestrictionsForUser(User.Identity.Name, _securityService); var result = new Domain.Catalog.Model.SearchResult(); if ((criteria.ResponseGroup & SearchResponseGroup.WithProducts) == SearchResponseGroup.WithProducts) { result = SearchProducts(criteria); } var catalogResponseGroup = criteria.ResponseGroup & (SearchResponseGroup.WithCatalogs | SearchResponseGroup.WithCategories); if (catalogResponseGroup != SearchResponseGroup.None) { criteria.ResponseGroup = catalogResponseGroup; var catalogResult = _catalogSearchService.Search(criteria); result.Catalogs = catalogResult.Catalogs; result.Categories = catalogResult.Categories; } return(Ok(result.ToWebModel(_blobUrlResolver))); }
/// <summary> /// Filter catalog search criteria based on current user permissions /// </summary> /// <param name="criteria"></param> /// <returns></returns> protected void ApplyRestrictionsForCurrentUser(Domain.Catalog.Model.SearchCriteria criteria) { var userName = User.Identity.Name; criteria.ApplyRestrictionsForUser(userName, _securityService); }
private Domain.Catalog.Model.SearchResult SearchProducts(Domain.Catalog.Model.SearchCriteria criteria) { var context = new Dictionary <string, object> { { "StoreId", criteria.StoreId }, }; var catalog = criteria.CatalogId; var categoryId = criteria.CategoryId; var serviceCriteria = new CatalogIndexedSearchCriteria { Locale = criteria.LanguageCode, Catalog = catalog.ToLowerInvariant(), IsFuzzySearch = true, }; if (!string.IsNullOrWhiteSpace(criteria.Outline)) { serviceCriteria.Outlines.Add(string.Format(CultureInfo.InvariantCulture, "{0}/{1}*", catalog, criteria.Outline)); categoryId = criteria.Outline.Split('/').Last(); } else { if (!string.IsNullOrEmpty(categoryId)) { serviceCriteria.Outlines.Add(string.Format(CultureInfo.InvariantCulture, "{0}/{1}*", catalog, categoryId)); } } if (!string.IsNullOrEmpty(categoryId)) { context.Add("CategoryId", categoryId); } #region Filters // Now fill in filters var filters = _cacheManager.Get("GetFilters-" + criteria.StoreId, "SearchProducts", TimeSpan.FromMinutes(5), () => _browseFilterService.GetFilters(context)); // Add all filters foreach (var filter in filters) { serviceCriteria.Add(filter); } // apply terms var terms = ParseKeyValues(criteria.Terms); if (terms.Any()) { var filtersWithValues = filters .Where(x => (!(x is PriceRangeFilter) || ((PriceRangeFilter)x).Currency.Equals(criteria.Currency, StringComparison.OrdinalIgnoreCase))) .Select(x => new { Filter = x, Values = x.GetValues() }) .ToList(); foreach (var term in terms) { var filter = filters.SingleOrDefault(x => x.Key.Equals(term.Key, StringComparison.OrdinalIgnoreCase) && (!(x is PriceRangeFilter) || ((PriceRangeFilter)x).Currency.Equals(criteria.Currency, StringComparison.OrdinalIgnoreCase))); // handle special filter term with a key = "tags", it contains just values and we need to determine which filter to use if (filter == null && term.Key == "tags") { foreach (var termValue in term.Values) { // try to find filter by value var foundFilter = filtersWithValues.FirstOrDefault(x => x.Values.Any(y => y.Id.Equals(termValue))); if (foundFilter != null) { filter = foundFilter.Filter; var appliedFilter = _browseFilterService.Convert(filter, term.Values); serviceCriteria.Apply(appliedFilter); } } } else { var attributeFilter = filter as AttributeFilter; if (attributeFilter != null && attributeFilter.Values == null) { var dynamicValues = new List <AttributeFilterValue>(); foreach (var value in term.Values) { dynamicValues.Add(new AttributeFilterValue() { Id = value, Value = value }); } attributeFilter.Values = dynamicValues.ToArray(); } var appliedFilter = _browseFilterService.Convert(filter, term.Values); serviceCriteria.Apply(appliedFilter); } } } #endregion #region Facets // apply facet filters var facets = ParseKeyValues(criteria.Facets); foreach (var facet in facets) { var filter = filters.SingleOrDefault( x => x.Key.Equals(facet.Key, StringComparison.OrdinalIgnoreCase) && (!(x is PriceRangeFilter) || ((PriceRangeFilter)x).Currency.Equals(criteria.Currency, StringComparison.OrdinalIgnoreCase))); var appliedFilter = _browseFilterService.Convert(filter, facet.Values); serviceCriteria.Apply(appliedFilter); } #endregion //criteria.ClassTypes.Add("Product"); serviceCriteria.RecordsToRetrieve = criteria.Take < 0 ? 10 : criteria.Take; serviceCriteria.StartingRecord = criteria.Skip; serviceCriteria.Pricelists = criteria.PricelistIds; serviceCriteria.Currency = criteria.Currency; serviceCriteria.StartDateFrom = criteria.StartDateFrom; serviceCriteria.SearchPhrase = criteria.Keyword; #region sorting if (!criteria.SortInfos.IsNullOrEmpty()) { var sortInfo = criteria.SortInfos.FirstOrDefault(); var isDescending = sortInfo.SortDirection == SortDirection.Descending; SearchSort sortObject = null; switch (sortInfo.SortColumn.ToLowerInvariant()) { case "price": if (serviceCriteria.Pricelists != null) { sortObject = new SearchSort( serviceCriteria.Pricelists.Select( priceList => new SearchSortField(string.Format("price_{0}_{1}", serviceCriteria.Currency.ToLower(), priceList.ToLower())) { IgnoredUnmapped = true, IsDescending = isDescending, DataType = SearchSortField.DOUBLE }) .ToArray()); } break; case "position": sortObject = new SearchSort( new SearchSortField(string.Concat("sort", catalog, categoryId).ToLower()) { IgnoredUnmapped = true, IsDescending = isDescending }); break; case "name": case "title": sortObject = new SearchSort("name", isDescending); break; case "rating": sortObject = new SearchSort(serviceCriteria.ReviewsAverageField, isDescending); break; case "reviews": sortObject = new SearchSort(serviceCriteria.ReviewsTotalField, isDescending); break; default: sortObject = CatalogIndexedSearchCriteria.DefaultSortOrder; break; } serviceCriteria.Sort = sortObject; } #endregion var responseGroup = ItemResponseGroup.ItemInfo | ItemResponseGroup.ItemAssets | ItemResponseGroup.Seo; if ((criteria.ResponseGroup & SearchResponseGroup.WithProperties) == SearchResponseGroup.WithProperties) { responseGroup |= ItemResponseGroup.ItemProperties; } if ((criteria.ResponseGroup & SearchResponseGroup.WithVariations) == SearchResponseGroup.WithVariations) { responseGroup |= ItemResponseGroup.Variations; } //Load ALL products var searchResults = _browseService.SearchItems(serviceCriteria, responseGroup); //// populate inventory ////if ((request.ResponseGroup & ItemResponseGroup.ItemProperties) == ItemResponseGroup.ItemProperties) //if ((criteria.ResponseGroup & SearchResponseGroup.WithProperties) == SearchResponseGroup.WithProperties) //{ // PopulateInventory(store.FulfillmentCenter, searchResults.Products); //} return(searchResults); }