private List <SearchResultViewModel> ConvertYandexResultToViewModel(YandexSearchResultModel yandexResult)
        {
            var searchResults = new List <SearchResultViewModel>();

            try
            {
                foreach (var item in yandexResult.Response.Results.Grouping.Group)
                {
                    searchResults.Add(new SearchResultViewModel
                    {
                        ResultName   = item.Doc.Domain,
                        ResultUrl    = item.Doc.Url,
                        SearchEngine = SearchEngine.Yandex
                    });

                    searchResults.Add(new SearchResultViewModel());
                }
            }

            catch (NullReferenceException ex)
            {
                Console.WriteLine("There are some problems with converting Yandex search result to ViewModel - " + $"{ex.Message}");
            }

            return(searchResults);
        }
        public async Task <List <SearchResultViewModel> > SearchByPhraseInSearchEngine(string phraseForSearch, SearchEngine searchEngine)
        {
            List <SearchResultViewModel> searchResults = new List <SearchResultViewModel>();

            using (var scope = _serviceProvider.CreateScope())
            {
                var googleCustomSearchClient = scope.ServiceProvider.GetRequiredService <ISearchClient <GoogleSearchResultModel> >();
                var bingCustomSearchClient   = scope.ServiceProvider.GetRequiredService <ISearchClient <BingCustomSearchResponseModel> >();
                var yandexXmlSearchClient    = scope.ServiceProvider.GetRequiredService <ISearchClient <YandexSearchResultModel> >();
                var searchResultRepository   = scope.ServiceProvider.GetRequiredService <ISearchResultRepository>();
                var searchEngineRepository   = scope.ServiceProvider.GetRequiredService <ISearchEngineRepository>();

                if (searchEngine == SearchEngine.Google)
                {
                    //Add search engine to database if not exist and get id of existed search engine
                    var googleDto = new SearchEngineDto {
                        NameOfSearchEngine = "Google"
                    };
                    var searchEngineId = await searchEngineRepository.AddSearchEngineToDbIfNotExistAsync(googleDto);

                    googleDto = await searchEngineRepository.GetSearchEngineByIdAsync(searchEngineId);

                    //Create request to Google custom search api and convert to ViewModel for returning in controller
                    var googleSearchResult = await googleCustomSearchClient.SearchByPhrase(phraseForSearch);

                    var googleSearchResultViewModel = ConvertGoogleResultToViewModel(googleSearchResult);
                    searchResults = googleSearchResultViewModel;

                    //Convert result to Dto and add the first result to database
                    var googleSearchResultDto = ConvertGoogleResultToDto(googleSearchResult, googleDto);
                    await searchResultRepository.AddResultToDbAsync(googleSearchResultDto[0]);
                }

                if (searchEngine == SearchEngine.Bing)
                {
                    var bingDto = new SearchEngineDto {
                        NameOfSearchEngine = "Bing"
                    };
                    var searchEngineId = await searchEngineRepository.AddSearchEngineToDbIfNotExistAsync(bingDto);

                    bingDto = await searchEngineRepository.GetSearchEngineByIdAsync(searchEngineId);

                    var bingSearchResult = await bingCustomSearchClient.SearchByPhrase(phraseForSearch);

                    var bingSearchResultViewModel = ConvertBingResultToViewModel(bingSearchResult);
                    searchResults = bingSearchResultViewModel;

                    var bingSearchResultDto = ConvertBingResultToDto(bingSearchResult, bingDto);
                    await searchResultRepository.AddResultToDbAsync(bingSearchResultDto[0]);
                }

                if (searchEngine == SearchEngine.Yandex)
                {
                    var yandexDto = new SearchEngineDto {
                        NameOfSearchEngine = "Yandex"
                    };
                    var searchEngineId = await searchEngineRepository.AddSearchEngineToDbIfNotExistAsync(yandexDto);

                    yandexDto = await searchEngineRepository.GetSearchEngineByIdAsync(searchEngineId);

                    YandexSearchResultModel yandexSearchResult = await yandexXmlSearchClient.SearchByPhrase(phraseForSearch);

                    var yandexSearchResultViewModel = ConvertYandexResultToViewModel(yandexSearchResult);
                    searchResults = yandexSearchResultViewModel;

                    var yandexSearchResultDto = ConvertYandexResultToDto(yandexSearchResult, yandexDto);
                    await searchResultRepository.AddResultToDbAsync(yandexSearchResultDto[0]);
                }
            }
            return(searchResults);
        }