async public Task <IActionResult> SearchDatasets(HttpRequest request) { string json = await request.GetRawBodyStringAsync(); SearchModel searchModel = JsonConvert.DeserializeObject <SearchModel>(json); if (searchModel == null || searchModel.PageNumber < 1 || searchModel.Top < 1) { _logger.Error("A null or invalid search model was provided for searching datasets"); return(new BadRequestObjectResult("An invalid search model was provided")); } IEnumerable <Task <SearchResults <DatasetIndex> > > searchTasks = BuildSearchTasks(searchModel); try { await TaskHelper.WhenAllAndThrow(searchTasks.ToArraySafe()); DatasetSearchResults results = new DatasetSearchResults(); foreach (var searchTask in searchTasks) { ProcessSearchResults(searchTask.Result, results); } return(new OkObjectResult(results)); } catch (FailedToQuerySearchException exception) { _logger.Error(exception, $"Failed to query search with term: {searchModel.SearchTerm}"); return(new StatusCodeResult(500)); } }
void ProcessSearchResults(SearchResults <DatasetIndex> searchResult, DatasetSearchResults results) { if (!searchResult.Facets.IsNullOrEmpty()) { results.Facets = results.Facets.Concat(searchResult.Facets); } else { results.TotalCount = (int)(searchResult?.TotalCount ?? 0); results.Results = searchResult?.Results?.Select(m => new DatasetSearchResult { Id = m.Result.Id, Name = m.Result.Name, Status = m.Result.Status, DefinitionName = m.Result.DefinitionName, LastUpdatedDate = m.Result.LastUpdatedDate.LocalDateTime, PeriodNames = m.Result.FundingPeriodNames, SpecificationNames = m.Result.SpecificationNames, Description = m.Result.Description, Version = m.Result.Version, ChangeNote = m.Result.ChangeNote, LastUpdatedByName = m.Result.LastUpdatedByName, LastUpdatedById = m.Result.LastUpdatedById }); } }