public async Task <ApprenticeshipSearchResponse> Handle(ApprenticeshipSearchQuery message, CancellationToken cancellationToken)
        {
            var response = new ApprenticeshipSearchResponse
            {
                SortOrder  = message.Order == 0 ? "1" : message.Order.ToString(),
                SearchTerm = message.Keywords
            };

            message.Page = message.Page <= 0 ? 1 : message.Page;

            var searchResults = await _searchService.SearchByKeyword(message.Keywords, message.Page, _paginationSettings.DefaultResultsAmount, message.Order, message.SelectedLevels);

            response.ActualPage       = message.Page;
            response.AggregationLevel = searchResults.LevelAggregation;
            response.SearchTerm       = message.Keywords;
            response.Results          = searchResults.Results;
            response.ResultsToTake    = searchResults.ResultsToTake;
            response.SelectedLevels   = searchResults.SelectedLevels?.ToList();
            response.TotalResults     = searchResults.TotalResults;
            response.LastPage         = searchResults.LastPage;

            if (searchResults.TotalResults > 0 && !searchResults.Results.Any())
            {
                response.StatusCode = ApprenticeshipSearchResponse.ResponseCodes.PageNumberOutOfUpperBound;
                return(response);
            }

            response.StatusCode = ApprenticeshipSearchResponse.ResponseCodes.Success;

            return(response);
        }
        public async Task <FatSearchResultsViewModel> GetSearchResults(SearchQueryViewModel searchQueryModel)
        {
            var cacheKey = $"FatComponentsCache-searchresults-{searchQueryModel.Keywords}-{searchQueryModel.Page}-{searchQueryModel.ResultsToTake}-{searchQueryModel.SortOrder}";

            foreach (var level in searchQueryModel.SelectedLevels)
            {
                cacheKey += $"-{level}";
            }

            var model = await _cacheService.RetrieveFromCache <FatSearchResultsViewModel>(cacheKey);

            if (model == null)
            {
                var results = _apprenticeshipSearchService.SearchByKeyword(searchQueryModel.Keywords, searchQueryModel.Page, searchQueryModel.ResultsToTake, searchQueryModel.SortOrder, searchQueryModel.SelectedLevels);

                model = _fatSearchResultsViewModelMapper.Map(await results);

                await _cacheService.SaveToCache(cacheKey, model, new TimeSpan(_cacheSettings.CacheAbsoluteExpirationDays, 0, 0, 0), new TimeSpan(_cacheSettings.CacheSlidingExpirationDays, 0, 0, 0));
            }

            model.SearchQuery.AddRemoveBasketResponse = searchQueryModel.AddRemoveBasketResponse;

            return(model);
        }