using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using PARR.BLL.Domain.Mq; using PARR.BLL.Services.Interfaces; using PARR.Constants; namespace PARR.TemplateActivator; internal class MqTemplateActivator : IMqTemplateActivator { private readonly MqSettings mqSettings; private readonly IMqService mqService; private readonly ILogger logger; private readonly ITransformService transformService; private readonly IValidatorService validatorService; private readonly IServiceProvider serviceProvider; public MqTemplateActivator( MqSettings mqSettings, IMqService mqService, ILogger logger, ITransformService transformService, IValidatorService validatorService, IServiceProvider serviceProvider ) { this.mqSettings = mqSettings; this.mqService = mqService; this.logger = logger; this.transformService = transformService; this.validatorService = validatorService; this.serviceProvider = serviceProvider; } public void Start() { var isConnected = mqService.InitConsumer(mqSettings, UpdateTemplateStatusAsync); if (!isConnected) throw new Exception("Ошибка при подключении к RabbitMq"); } private async Task UpdateTemplateStatusAsync(string msg) { logger.LogInformation($"{this.GetType().Name}. Получили запрос: {msg}"); var query = transformService.GetModelFromJson(msg); if (query == null) return; if (!await validatorService.IsValidApplicationInWorkAsync(query.JobId)) { logger.LogError($"{this.GetType().Name}. Некорректные параметры регламентной работы {nameof(query.JobId)}: {query.JobId}"); return; } using (var scope = serviceProvider.CreateScope()) { var service = scope.ServiceProvider.GetService(); if (service == null) throw new Exception($"{this.GetType().Name}. Не найден сервис: {nameof(service.GetType)}"); await service.ChangeStateAsync(query.JobId, query.Action, query.HistoryInitiator); } } public void Stop() { mqService.Dispose(); } }