public async Task <ActionResult <CurrencyRateDto[]> > GetQueryAsync( [FromQuery] Dictionary <string, string> currencyCodes, [FromQuery] DateTime startDate, [FromQuery] DateTime endDate, [FromQuery] string apiKey) { var currencyRateQueryDto = new CurrencyRateQueryDto { CurrencyCodes = currencyCodes, StartDate = startDate, EndDate = endDate, ApiKey = apiKey }; return(await GetCurrencyRatesAsync(currencyRateQueryDto)); }
public async Task <CurrencyRateDto[]> GetCurrencyRatesAsync(CurrencyRateQueryDto queryDto) { if (queryDto is null) { throw new NullQueryException(); } var queries = await currencyRateQueryService.GetAsync(queryDto); if (!queries.Any()) { return(Array.Empty <CurrencyRateDto>()); } var currencyRates = new List <CurrencyRate>(); if (cacheConfiguration.IsEnabled) { FilterCachedQueries(ref queries, currencyRates); } var requestsWithQueries = apiHandlingStrategy.GetPreparedRequests(queries); var currencyRateTasks = requestsWithQueries.Select(ExecuteRequestAsync); var currencyRateResults = await Task.WhenAll(currencyRateTasks); currencyRates.AddRange(currencyRateResults.SelectMany(currencyRates => currencyRates.Where(currencyRate => currencyRate != null))); if (currencyRates.Any(currencyRate => currencyRate.Query.Date <= queryDto.StartDate)) { return(mapper.Map <CurrencyRateDto[]>(currencyRates)); } var originalDate = queryDto.StartDate; queryDto.StartDate = originalDate.AddDays(-apiConfiguration.DaysGoingBackForMissingData); var extendedResults = await GetCurrencyRatesAsync(queryDto); return(extendedResults .Where(currencyRate => currencyRate.Date >= originalDate) .ToArray()); }
private async Task <ActionResult <CurrencyRateDto[]> > GetCurrencyRatesAsync(CurrencyRateQueryDto currencyRateQueryDto) { logger.LogInformation($"{currencyRateQueryDto.ApiKey} called for: " + $"{string.Join(", ", currencyRateQueryDto.CurrencyCodes.Select(currencies => $"{currencies.Value}/{currencies.Key}"))} " + $"in time range: {currencyRateQueryDto.StartDate} - {currencyRateQueryDto.EndDate}"); try { var result = await currencyApiService.GetCurrencyRatesAsync(currencyRateQueryDto); return(Ok(result)); } catch (RequestException exception) { return(NotFound(exception.Message)); } catch (Exception exception) { logger.LogError(exception.Message, exception); return(StatusCode(StatusCodes.Status500InternalServerError, exception.Message)); } }
public async Task <CurrencyRateQuery[]> GetAsync(CurrencyRateQueryDto queryDto) { if (queryDto.ApiKey is null) { throw new NullApiKeyException(); } if (!await apiKeyService.IsApiKeyValidAsync(queryDto.ApiKey)) { throw new InvalidApiKeyException(queryDto.ApiKey); } return(queryDto.CurrencyCodes .SelectMany(currencyPair => { var source = currencyPair.Key; var target = currencyPair.Value; var startDate = queryDto.StartDate == default ? DateTime.Today : queryDto.StartDate; var endDate = queryDto.EndDate == default ? DateTime.Today : queryDto.EndDate; return DateHelper.EachDay(startDate.GetRecentWorkDay(), endDate).Select(date => new CurrencyRateQuery(source, target, date)); }) .ToArray()); }