//Invoked every 10 minutes //Gets new data from api, updates database and sends message to clients to update data on site private async void DoWork(object state) { using var scope = _scopeFactory.CreateScope(); var dbContext = new CurrencyContext( scope.ServiceProvider.GetRequiredService <DbContextOptions <CurrencyContext> >()); var httpClient = _httpClientFactory.CreateClient("API Client"); foreach (var currency in DropDownHelper.GetCurrenciesList()) { var httpResponse = await httpClient.GetAsync("/latest?base=" + currency); if (!httpResponse.IsSuccessStatusCode) { return; } var content = await httpResponse.Content.ReadAsStringAsync(); var newModel = JsonConvert.DeserializeObject <CurrencyModel>(content); var oldModel = dbContext.Currency.FirstOrDefault(c => c.CurrencyName == newModel.CurrencyName && c.RatesDate.Date == newModel.RatesDate.Date); if (oldModel != null) { var oldExchangeRates = dbContext.ExchangeRates .Where(r => r.CurrencyId == oldModel.Id) .ToList(); dbContext.ExchangeRates.RemoveRange(oldExchangeRates); oldModel.Rates = newModel.Rates; dbContext.Currency.Update(oldModel); } else { dbContext.Currency.Add(newModel); } } await dbContext.SaveChangesAsync(); if (LiveRatesHub.ConnectedClients != null && LiveRatesHub.ConnectedClients.Count != 0) { await _hubContext.Clients.All.SendAsync("UpdateRates"); } }