private static CurrencyExchangeRateResult.DateAndRate[] CreateDatesAndRates(
            CurrencyExchangeRateRequest request)
        {
            var random = new Random(request.BaseCurrencyCode.GetHashCode());

            var dateCounter = request.StartDate;

            var dateAndRates = new List <CurrencyExchangeRateResult.DateAndRate>();

            var nextRate = CreateInitialRate(random);

            while (dateCounter <= request.EndDate)
            {
                if (!IsWeekend(dateCounter))
                {
                    dateAndRates.Add(new CurrencyExchangeRateResult.DateAndRate()
                    {
                        Date = dateCounter,
                        Rate = nextRate
                    });

                    nextRate = nextRate + CreateVariance(random);
                }

                dateCounter = dateCounter.AddDays(1);
            }

            return(dateAndRates.ToArray());
        }
        public async Task <IActionResult> Get([FromRoute] CurrencyExchangeRateRequest request,
                                              [FromRoute, SwaggerParameter(Required = false)] float value  = 1,
                                              [FromQuery, SwaggerParameter(Required = false)] DateTime?day = null,
                                              CancellationToken token = default)
        {
            try
            {
                var currencies = await _currencyService.GetCurrenciesByIsoCode(request.Source.IsoCodeValue, request.Target.IsoCodeValue, token : token)
                                 .ConfigureAwait(false);

                if (currencies.Values.Any(x => x == null))
                {
                    return(NotFoundObjectResult(nameof(CurrencyService), "currency code don't exist"));
                }

                var exchangeRate = await _exchangeService.GetExchangeRateAsync(currencies["source"], currencies["target"], day, token)
                                   .ConfigureAwait(false);

                return(exchangeRate == null?NotFoundObjectResult(nameof(ExchangeService), "exchange rate don't exist")
                           : OkObjectResult(value * exchangeRate.Rate));
            }
            catch (Exception e)
            {
                return(LogAndError500Response(nameof(CurrencyExchangeRatesController), e));
            }
        }
 private static CurrencyExchangeRateResult CreateValidResult(
     CurrencyExchangeRateResult.DateAndRate[] andRates,
     CurrencyExchangeRateRequest request)
 {
     return(new CurrencyExchangeRateResult()
     {
         BaseCurrencyCode = request.BaseCurrencyCode,
         StartDate = request.StartDate,
         EndDate = request.EndDate,
         Rates = andRates,
         HasError = false,
     });
 }
 private static CurrencyExchangeRateResult CreateResultWithError(
     string errorMessage,
     CurrencyExchangeRateRequest request)
 {
     return(new CurrencyExchangeRateResult()
     {
         BaseCurrencyCode = request.BaseCurrencyCode,
         StartDate = request.StartDate,
         EndDate = request.EndDate,
         HasError = true,
         ErrorMessage = errorMessage
     });
 }
        private CurrencyExchangeRateResult CreateResult(
            CurrencyExchangeRateRequest request)
        {
            var validCodes = GetValidCodes();

            if (validCodes.Any(c => c == request.BaseCurrencyCode))
            {
                var dateAndRates = CreateDatesAndRates(request);

                return(CreateValidResult(
                           dateAndRates,
                           request));
            }

            return(CreateResultWithError(
                       "Could not find rates for given currency code.",
                       request));
        }
        public async Task <IActionResult> Post([FromRoute] CurrencyExchangeRateRequest request, [FromBody] CurrencyExchangeRateModel model, CancellationToken token = default)
        {
            try
            {
                var currencies = await _currencyService.GetCurrenciesByIsoCode(request.Source.IsoCodeValue, request.Target.IsoCodeValue, token : token)
                                 .ConfigureAwait(false);

                if (currencies.Values.Any(x => x == null))
                {
                    return(NotFoundObjectResult(nameof(CurrencyService), "currency code don't exist"));
                }

                var currencyExchangeRate = model.ToEntity(currencies);

                await _repository.InsertAsync(currencyExchangeRate, token : token).ConfigureAwait(false);

                return(CreateObjectResult(currencyExchangeRate.ToModel()));
            }
            catch (Exception e)
            {
                return(LogAndError500Response(nameof(CurrencyExchangeRatesController), e));
            }
        }