Пример #1
0
        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)));
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        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);
        }