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)); }