using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using PARR.AIHITSyncer.Services; using PARR.AIHITSyncer.Settings; using PARR.BLL.Services.Interfaces; using PARR.DAL.Models; namespace PARR.AIHITSyncer { internal class AihitSyncer : IAihitSyncer { private readonly ILogger logger; private readonly IMqService mqService; private readonly MqSettings mqSettings; private readonly IServiceProvider serviceProvider; public AihitSyncer( ILogger logger, IMqService mqService, MqSettings mqSettings, IServiceProvider serviceProvider ) { this.logger = logger; this.mqService = mqService; this.mqSettings = mqSettings; this.serviceProvider = serviceProvider; } public void Start() { logger.LogInformation("Запуск сервиса синхронизации данных из АИХИТ и ПАРР."); //var isConnected = mqService.InitConsumer(mqSettings, SyncDataAsync); var isConnected = mqService.InitConsumer(mqSettings, async (string msg) => { using (var scope = serviceProvider.CreateScope()) { var syncerService = scope.ServiceProvider.GetService(); if (syncerService == null) throw new Exception("Не смог получить серивс ISyncerService, scope.ServiceProvider.GetService()"); await syncerService.SyncAsync(msg); //await Task.CompletedTask; } }); if (!isConnected) throw new Exception("Ошибка при подключении к RabbitMq"); } public void Stop() { mqService.Dispose(); } //private async Task SyncDataAsync(string msg) //{ // //SyncService // using (var scope = serviceProvider.CreateScope()) // { // var service = scope.ServiceProvider.GetService(); // //if (service == null) // // throw new Exception("Не смог получить серивс IHostService, scope.ServiceProvider.GetService()"); // await service.StartAsync(msg); // //await SyncHostToScopeAsync(hostService, objFromQuery); // //await GetAppTypesAsync(); // } //var objFromQuery = transformService.GetModelFromJson(msg); //if (objFromQuery == null) // return; //using (var scope = serviceProvider.CreateScope()) //{ // var hostService = scope.ServiceProvider.GetService(); // if (hostService == null) // throw new Exception("Не смог получить серивс IHostService, scope.ServiceProvider.GetService()"); // await SyncHostToScopeAsync(hostService, objFromQuery); // await GetAppTypesAsync(); //} //logger.LogDebug($"Закончил работу с сообщением: {msg}"); //await Task.CompletedTask; //} //private async Task SyncHostToScopeAsync(IHostService hostService, AihitDataMq objFromQuery) //{ // //ищем существующий хост в БД // var host = await hostService.GetHostWithAppsByIpAsync(objFromQuery.IP); // var isNew = false; // //если не нашли - создаём // if (host == null) // { // isNew = true; // host = await CreateHostAsync(hostService, objFromQuery); // } // else // { // logger.LogDebug($"Найден хост в БД: {host!.Ek}({host.IP})"); // //проверям и обновляем поля // await SyncHostFieldsAsync(hostService, host, objFromQuery); // } // //получаем лист ПО из объекта // var appsInObj = await GetAppInObjectAsync(host, objFromQuery); // await SyncApplicationInHostAsync(host, appsInObj, !isNew); //} //private async Task CreateHostAsync(IHostService hostService, AihitDataMq objFromQuery) //{ // var id = Guid.NewGuid(); // var host = new Host // { // Id = id, // Ek = objFromQuery.EK, // IP = objFromQuery.IP, // EkStatusCode = ResolveCode(objFromQuery.Status), // WorkGroup = objFromQuery.WorkGroup, // ResponseAreaCode = ResolveCode(objFromQuery.ResponseArea) // }; // if (!await hostService.CreateAsync(host) || !await hostService.CommitAsync()) // logger.LogError($"Не удалось создать узел {host.Ek}({host.IP})"); // else // logger.LogInformation($"----- Создан узел: {host.Id} -----"); // return await hostService.GetHostWithAppsByIpAsync(host.IP); //} //private int ResolveCode(string field) //{ // var pattern = "\\d+"; // var regex = new Regex(pattern); // int.TryParse(regex.Match(field).Value, out int result); // return result; //} } }