示例#1
0
        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));
        }
示例#2
0
        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());
        }
示例#3
0
        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));
            }
        }
示例#4
0
        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());
        }