Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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));
        }