using Microsoft.Extensions.Logging; using Quartz; using System.Threading.Tasks; using Newtonsoft.Json; using System.Text; using birzha_contracts.Managers; using birzha_contracts.Models; using System.Collections.Generic; namespace birzha_contracts.Jobs{ [DisallowConcurrentExecution] public class UpdateJob : IJob { private readonly ILogger _logger; private readonly IServiceProvider _provider; private static HttpClient _client = new HttpClient(); public UpdateJob(ILogger logger, IServiceProvider provider) { _logger = logger; _provider = provider; } private async Task GetData(HttpRequestMessage request) { var response = await _client.SendAsync(request); response.EnsureSuccessStatusCode(); return await response.Content.ReadAsStringAsync(); } public async Task Execute(IJobExecutionContext context) { var tasks = new List>(); using(var scope = _provider.CreateScope()) { var firstTimeDB = Convert.ToBoolean(ConfigManager.AppSetting["FirstTimeDB"]); var dbContext = scope.ServiceProvider.GetService(); var contracts = new List(); var domain = Convert.ToString(ConfigManager.AppSetting["Domain"]); _client.BaseAddress = new Uri(domain); var api = ConfigManager.AppSetting["API_contract_resolution"]; if(firstTimeDB){ var dateFrom = Convert.ToDateTime(ConfigManager.AppSetting["FirstTimeDBFillDateFrom"]); contracts = dbContext!.ContractResolution.Where(x => x.ModifiedDate >= dateFrom).OrderByDescending(d => d.ModifiedDate).ToList(); while(contracts.Any()){ _logger.LogInformation("Sending request: Contract-Resolution"); var chunk = contracts.Take(500).ToList(); contracts = contracts.Skip(500).ToList(); var data = JsonConvert.SerializeObject(chunk); var content = new StringContent(data.ToString(), Encoding.UTF8, "application/json"); var request = new HttpRequestMessage(HttpMethod.Post, $""+api+""); request.Content = content; tasks.Add(GetData(request)); _logger.LogInformation("Sending resolution success!"); } } else{ var minutesAgo = Convert.ToDouble(ConfigManager.AppSetting["DataMinutesAgo"]); minutesAgo = minutesAgo * (-1); contracts = dbContext!.ContractResolution.Where(x => x.ModifiedDate > DateTime.Now.AddMinutes(minutesAgo)).OrderByDescending(d => d.ModifiedDate).ToList(); while(contracts.Any()){ _logger.LogInformation("Sending request: Contract-Resolution"); var chunk = contracts.Take(500).ToList(); contracts = contracts.Skip(500).ToList(); var data = JsonConvert.SerializeObject(chunk); var content = new StringContent(data.ToString(), Encoding.UTF8, "application/json"); var request = new HttpRequestMessage(HttpMethod.Post, $""+api+""); request.Content = content; tasks.Add(GetData(request)); _logger.LogInformation("Sending resolution success!"); } } } _logger.LogInformation("Success!"); await Task.WhenAll(tasks); } } }