Files
parr_api/PARR.GeneratorTemplates/Services/TemplateManager.cs
2023-09-25 11:47:13 +10:00

141 lines
6.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<TemplateManager> logger;
private readonly SettingsFromDb settingsFromDb;
public TemplateManager(
ITemplateService templateService,
IHostService hostService,
ILogger<TemplateManager> 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}"));
}
}
}