private void InitializeApp() { CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("pl-PL"); NbpClient = new NbpClient(); InitializeDatabase(); MainPage = new TabsPage(); }
public async Task <GetExchangeRateModel> Handle(GetExchangeRateQuery request, CancellationToken cancellationToken) { var datesBetweenStartAndEndDateDividedByDay = GetDatesBetweenStartAndEndDateDividedByDay(); await FillGapsInMissingDailyExchangeRates(datesBetweenStartAndEndDateDividedByDay); var model = await CreateExchangeRateModel(datesBetweenStartAndEndDateDividedByDay); return(model); #region Inner methods List <DateTime> GetDatesBetweenStartAndEndDateDividedByDay() { var startDateAfterFormat = DateTime.Parse(request.StartDate); var endDateAfterFormat = DateTime.Parse(request.EndDate); var datesBetweenStartAndEndDateDividedByDay = new List <DateTime> { startDateAfterFormat }; while (endDateAfterFormat > datesBetweenStartAndEndDateDividedByDay.Last().AddDays(1)) { var dateDayLater = datesBetweenStartAndEndDateDividedByDay.Last().AddDays(1); datesBetweenStartAndEndDateDividedByDay.Add(dateDayLater); } datesBetweenStartAndEndDateDividedByDay.Add(endDateAfterFormat); return(datesBetweenStartAndEndDateDividedByDay); } async Task FillGapsInMissingDailyExchangeRates(List <DateTime> datesBetween) { var gapDays = await GetGapDays(datesBetween); var getNbpExchangeRateDailyQueries = ConvertGapPeriodsToNbpExchangeRateQueries(gapDays); var nbpExchangeRateModel = await NbpClient.GetNbpExchangeRateModels(getNbpExchangeRateDailyQueries, cancellationToken); await SaveNbpExchangeRateModels(nbpExchangeRateModel); } async Task <List <DateTime> > GetGapDays(List <DateTime> datesBetween) { var gapDaysCollection = new List <DateTime>(); for (int i = 0; i < datesBetween.Count; i++) { if (!await databaseContext.DailyExchangeRate .AnyAsync(rate => rate.Date.Equals(datesBetween[i]), cancellationToken)) { gapDaysCollection.Add(datesBetween[i]); } } return(gapDaysCollection); } async Task <GetExchangeRateModel> CreateExchangeRateModel(List <DateTime> datesBetween) { var dailyExchangeRatesDto = await GetDailyExchangeRatesDto(datesBetween); var isoCurrencyCode = request.CurrencyIsoCode.ToUpper(); var exchangeRates = dailyExchangeRatesDto.Select(rate => rate.ExchangeRate); var averageRatesForProvidedPeriod = exchangeRates.Sum() / exchangeRates.Count(); var dailyExchangeRates = dailyExchangeRatesDto .Select(dto => new GetExchangeRateDailyModel(dto.Date, dto.ExchangeRate)) .ToList(); var getExchangeRateModel = new GetExchangeRateModel(dailyExchangeRates, averageRatesForProvidedPeriod, isoCurrencyCode); return(getExchangeRateModel); } async Task <List <DailyExchangeRateDto> > GetDailyExchangeRatesDto(List <DateTime> datesBetween) { return(await databaseContext .DailyExchangeRate .Where(exchangeRate => datesBetween.Any(dateBetween => dateBetween == exchangeRate.Date)) .Select(exchangeRate => new DailyExchangeRateDto(exchangeRate.Date, exchangeRate.ExchangeRate)) .ToListAsync(cancellationToken)); } IEnumerable <NbpExchangeRateDailyQuery> ConvertGapPeriodsToNbpExchangeRateQueries (List <DateTime> gapDays) { if (gapDays != null) { return(gapDays.Select(gapPeriod => new NbpExchangeRateDailyQuery( request.CurrencyIsoCode, gapPeriod.Date.ToString("yyyy-MM-dd") ))); } return(Enumerable.Empty <NbpExchangeRateDailyQuery>()); } async Task SaveNbpExchangeRateModels(NbpExchangeRateModel nbpExchangeRateModel) { if (nbpExchangeRateModel != null && nbpExchangeRateModel.NotEmpty()) { foreach (var dailyExchangeRateFromNbp in nbpExchangeRateModel.Rates) { var date = DateTime.Parse(dailyExchangeRateFromNbp.EffectiveDate); var currencyId = (await databaseContext.Currency .FirstAsync(currency => currency.IsoCode == request.CurrencyIsoCode, cancellationToken)).Id; var dailyExchangeRate = DailyExchangeRate.Create(dailyExchangeRateFromNbp.No, date, dailyExchangeRateFromNbp.Mid, currencyId); databaseContext.DailyExchangeRate.Add(dailyExchangeRate); } await databaseContext.SaveChangesAsync(cancellationToken); } } #endregion }