public async Task <IActionResult> GetHistoryRatesForGivenPeriodsAsync([FromBody] HistoryRatesRequest model)
        {
            try
            {
                if (model == null)
                {
                    return(BadRequest("Argument cannot be null"));
                }

                var result = await _exchangeRatesManagement.GetRatesForGivenPeriodsAsync(model);

                return(Ok(result));
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, ex.Message);
                while (ex.InnerException != null)
                {
                    ex = ex.InnerException;
                    _logger.LogError(ex, ex.Message);
                }

                return(BadRequest(ex.Message));
            }
        }
 private Task <HttpResponseMessage>[] CreateRequestUrls(HistoryRatesRequest request)
 {
     return(request
            .Dates
            .Select(date => _httpClient.GetAsync(
                        $"{_EXCHANGE_RATES_API}{date:yyyy-MM-dd}?base={request.BaseCurrency.ToUpper()}&symbols={request.TargetCurrency.ToUpper()}"))
            .ToArray());
 }
        public async Task <ExchangeRatesResponse> GetRatesForGivenPeriodsAsync(HistoryRatesRequest request)
        {
            ValidateArgument(request);

            var requestUrls = CreateRequestUrls(request);
            var result      = (await GetRatesFromApiAsync(requestUrls))
                              .OrderBy(x => x.Value)
                              .ToList();

            var minimumRate = result.First();
            var maximumRate = result.Last();
            var averageRate = result.Average(x => x.Value);

            return(new ExchangeRatesResponse(minimumRate, maximumRate, averageRate));
        }
        private void ValidateArgument(HistoryRatesRequest request)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(HistoryRatesRequest), $"Argument {nameof(request)} cannot be null");
            }

            CheckCurrency(request.BaseCurrency, nameof(request.BaseCurrency));
            CheckCurrency(request.TargetCurrency, nameof(request.TargetCurrency));

            if (string.Equals(request.BaseCurrency, request.TargetCurrency))
            {
                throw new CurrencyException("Base currency cannot be the same as target currency", nameof(request.BaseCurrency));
            }

            CheckDates(request.Dates, nameof(request.Dates));
        }