Exemple #1
0
        public Task <CatalogSearchResults> SearchAsync(CatalogSearchRequest searchRequest)
        {
            ValidateSearchRequest(searchRequest);

            var searchId      = Guid.NewGuid().ToString();
            var filterBuilder = new StringBuilder();

            AppendPublisherNameFilter(filterBuilder, searchRequest);
            AppendCategoryFilter(filterBuilder, searchRequest);
            AppendSubcategoryFilter(filterBuilder, searchRequest);
            AppendTagFilter(filterBuilder, searchRequest);

            var searchParameters = new SearchParameters();

            if (filterBuilder.Length > 0)
            {
                searchParameters.Filter = filterBuilder.ToString();
            }

            searchParameters.IncludeTotalResultCount = true;
            searchParameters.Skip = (searchRequest.PageIndex * searchRequest.PageLength);
            searchParameters.Top  = searchRequest.PageLength;

            var searchResults = searchIndexClient.Documents.Search <AzureSearchResult>(
                searchRequest.Query ?? "*", searchParameters);

            return(Task.FromResult(ToCatalogSearchResults(searchId, searchRequest, searchResults)));
        }
Exemple #2
0
        private void ValidateSearchRequest(CatalogSearchRequest searchRequest)
        {
            if (searchRequest == null)
            {
                throw new ArgumentNullException(nameof(searchRequest));
            }

            if (searchRequest.PageLength <= 0)
            {
                throw new ArgumentException($"[{nameof(searchRequest.PageLength)}] must be greater than zero (0).",
                                            nameof(searchRequest));
            }

            if (string.IsNullOrEmpty(searchRequest.Query) &&
                string.IsNullOrEmpty(searchRequest.Category))
            {
                throw new ArgumentException($"[{nameof(searchRequest.Query)}] and/or [{nameof(searchRequest.Category)}] must be provided.",
                                            nameof(searchRequest));
            }

            if (string.IsNullOrEmpty(searchRequest.Category) &&
                string.IsNullOrEmpty(searchRequest.Subcategory) == false)
            {
                throw new ArgumentException($"When [{nameof(searchRequest.Subcategory)}] is provided, " +
                                            $"[{nameof(searchRequest.Category)}] must also be provided.",
                                            nameof(searchRequest));
            }
        }
        public async Task <IActionResult> SearchAsync([Required] string category, string q = null, int pageIndex = 0, int pageSize = 10)
        {
            // Check to make sure that the paging parameters make sense...

            var errors = ValidatePaging(pageIndex, pageSize).ToList();

            // If there were any validation errors, respond with [400 Bad Request] + detailed error description...

            if (errors.Any())
            {
                return(BadRequest(string.Join(' ', errors)));
            }

            var searchRequest = new CatalogSearchRequest
            {
                Category   = category,
                PageIndex  = pageIndex,
                PageLength = pageSize,
                Query      = q
            };

            // Run the search...

            var searchResults = await catalogSearchService.SearchAsync(searchRequest);

            // Always respond with [200 OK] even if there are no results...

            return(Ok(ToDetailApiModel(searchResults)));
        }
Exemple #4
0
        private void AppendCategoryFilter(StringBuilder filterBuilder, CatalogSearchRequest searchRequest)
        {
            if (string.IsNullOrEmpty(searchRequest.Category) == false)
            {
                if (filterBuilder.Length > 0)
                {
                    filterBuilder.Append(" and ");
                }

                filterBuilder.Append($"category eq '{searchRequest.Category}'");
            }
        }
Exemple #5
0
        private void AppendPublisherNameFilter(StringBuilder filterBuilder, CatalogSearchRequest searchRequest)
        {
            if (string.IsNullOrEmpty(searchRequest.PublisherName) == false)
            {
                if (filterBuilder.Length > 0)
                {
                    filterBuilder.Append(" and ");
                }

                filterBuilder.Append($"publisherName eq '{searchRequest.PublisherName}'");
            }
        }
Exemple #6
0
        private CatalogSearchResults ToCatalogSearchResults(string searchId, CatalogSearchRequest searchRequest,
                                                            DocumentSearchResult <AzureSearchResult> searchResults)
        {
            var totalResults = (int)(searchResults.Count.GetValueOrDefault());

            return(new CatalogSearchResults
            {
                SearchId = searchId,
                PageIndex = searchRequest.PageIndex,
                PageLength = searchResults.Results.Count,
                Results = searchResults.Results.Select(r => ToCatalogSearchResult(r.Document)).ToList(),
                TotalPages = (totalResults == 0 ? 0 : ((totalResults + searchRequest.PageLength - 1) / searchRequest.PageLength)),
                TotalResults = totalResults
            });
        }
Exemple #7
0
        private void AppendTagFilter(StringBuilder filterBuilder, CatalogSearchRequest searchRequest)
        {
            if (searchRequest.Tags.Any())
            {
                foreach (var tag in searchRequest.Tags)
                {
                    if (filterBuilder.Length > 0)
                    {
                        filterBuilder.Append(" and ");
                    }

                    filterBuilder.Append($"tags/any(t: t eq '{tag}')");
                }
            }
        }
Exemple #8
0
 /// <summary>
 /// Execute a search against the public catalog using the provided search parameters and returns a set of paginated results.
 /// </summary>
 public static void Search(CatalogSearchRequest request, Action <CatalogSearchResult> resultCallback, Action <PlayFabError> errorCallback, object customData = null, Dictionary <string, string> extraHeaders = null)
 {
     PlayFabHttp.MakeApiCall("/Catalog/Search", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders);
 }