public async Task <SearchResultVM> Search(string query) { if (string.IsNullOrWhiteSpace(query)) { throw new ArgumentNullException(nameof(query)); } var model = new SearchResultVM { Query = query }; var tasks = searchEngines .Select(se => se.SearchFirst10(query)) .ToList(); while (tasks.Count > 0) { var fastestTask = await Task.WhenAny(tasks); var searchEngine = searchEngines[tasks.IndexOf(fastestTask)]; var engineName = searchEngine.Name; if (fastestTask.IsCompletedSuccessfully) { var count = fastestTask.Result.Count(); if (count > 0 && count <= 10) { model.EngineName = engineName; model.Items = fastestTask.Result; model.TrademarkLink = searchEngine.TrademarkLink; model.AddMessage(HasFoundMessage(engineName, count)); break; } else if (count > 10) { model.AddMessage(Over10EngineErrorMessage(engineName)); tasks.Remove(fastestTask); } else // 0 { model.AddMessage(NotFoundMessage(engineName)); tasks.Remove(fastestTask); } } else //only IsFault (cancel not implemented) { var message = IsFaultedMessage(engineName, fastestTask.Exception.InnerException.Message); model.AddMessage(message); tasks.Remove(fastestTask); } } return(model); }
public async Task <IActionResult> WebSearch(string query) { var model = new SearchResultVM { Query = query }; if (string.IsNullOrWhiteSpace(query)) { model.Query = null; model.AddMessage("Error: query is empty!"); } else { model = await webSearchService.Search(query); if (model.Items?.Any() == true) { await repository.Add(model); } } return(View("Index", model)); }