using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using PARR.BLL.Domain.Mq; using PARR.BLL.Helpers; using PARR.DAL.Contracts; using PARR.DAL.Models; using PARR.DAL.Services.Interfaces; using System.Text.Json; namespace PARR.GeneratorTemplates.Services { internal class TemplateManager : ITemplateManager { private readonly ITemplateService templateService; private readonly IHostService hostService; private readonly ILogger logger; private readonly SettingsFromDb settingsFromDb; public TemplateManager( ITemplateService templateService, IHostService hostService, ILogger logger, SettingsFromDb settingsFromDb ) { this.templateService = templateService; this.hostService = hostService; this.logger = logger; this.settingsFromDb = settingsFromDb; } public async Task CreateTemplates(GeneratorTemplateMq query) { //Согласно параметрам, находит все ЭК в таблице Hosts. //Далее проверяет есть ли такие шаблоны в таблице Templates, если нет, то создает, активирует и ставит статус Creating. //Если такие шаблоны уже есть, ничего с ними не делает. string ekPattern = SqlHelpers.RegexToLike(query.Ek); // список хостов для создания шаблонов var hosts = await hostService.Get() .Include(t => t.ApplicationsInHosts) .ThenInclude(t => t.Application).ThenInclude(t => t!.ApplicationsInWorks).ThenInclude(w => w.Work) .Include(t => t.Templates) .ThenInclude(w => w.ApplicationsInWork) .Where(t => //TODO: add status ЭК t.ApplicationsInHosts.Any(h => h.ApplicationId == query.ApplicationId && h.Application!.ApplicationsInWorks.Any(w => w.WorkId == query.WorkId) ) && EF.Functions.Like(t.Ek.ToLower(), ekPattern) // смотрим что нет такого шаблона && t.Templates.Any(templ => templ.ApplicationsInWork!.WorkId == query.WorkId && templ.ApplicationsInWork.ApplicationId == query.ApplicationId) == false ) .AsSplitQuery() .ToListAsync(); if (!hosts.Any()) { logger.LogInformation($"Не найдено ЭК попадающих под условие: ${JsonSerializer.Serialize(query)}"); return; } //Создаем шаблоны foreach (var host in hosts) { var appInWork = host.ApplicationsInHosts.FirstOrDefault(t => t.ApplicationId == query.ApplicationId)?.Application?.ApplicationsInWorks.FirstOrDefault(a => a.WorkId == query.WorkId); if (appInWork == null) { // такого не может быть, так как выполнился запрос при получении списка хостов, но мало ли logger.LogError($"Ошибка при создании шаблона. В таблице ApplicationsInWorks не найден Id согласно запроса WorkId: {query.WorkId}, ApplicationId: {query.ApplicationId}"); return; } var template = new Template { Id = Guid.NewGuid(), Name = TemplateHelpers.GenerateTemplateName(settingsFromDb.TemplatePrefixName, host.Ek, appInWork.Work!.Name), IsActive = true, StatusCode = (int)StatusTemplateEnum.Creating, ApplicationInWorkId = appInWork.Id, HostId = host.Id }; if (!await templateService.CreateAsync(template) || !await templateService.CommitAsync()) { logger.LogError($"Ошибка при создании шаблона: Name: {template.Name}, ApplicationInWorkId: {template.ApplicationInWorkId}, HostId: {template.HostId}"); } else { logger.LogInformation($"Создан шаблон: Name: {template.Name}, ApplicationInWorkId: {template.ApplicationInWorkId}, " + $"HostId: {template.HostId}, IsActive: {template.IsActive}, StatusCode: {template.StatusCode}"); } } } public async Task DeactivateTemplates(GeneratorTemplateMq query) { //Ищет все активные шаблоны согласно параметрам в таблице Templates, и деактивирует их. Меняем на статус Updating // делаем sql формат для like из запроса. string ekPattern = SqlHelpers.RegexToLike(query.Ek); var existTemplates = await templateService.Get() .Include(t => t.Host) .Include(t => t.ApplicationsInWork) .Where(t => t.IsActive == true && t.ApplicationsInWork!.ApplicationId == query.ApplicationId && t.ApplicationsInWork!.WorkId == query.WorkId //TODO: add status ЭК && EF.Functions.Like(t.Host!.Ek.ToLower(), ekPattern) ) .ToListAsync(); if (!existTemplates.Any()) { logger.LogInformation("Нет шаблонов для деактивации"); return; } existTemplates.ForEach(item => { item.IsActive = false; item.StatusCode = (int)StatusTemplateEnum.Updating; item.DateModified = DateTimeOffset.UtcNow; }); if (await templateService.CommitAsync()) existTemplates.ForEach(item => logger.LogInformation($"Деактивирован шаблон: {item.Name}")); else existTemplates.ForEach(item => logger.LogError($"Ошибка при дактивации шаблона: {item.Name}")); } } }