1
0
mirror of https://github.com/akpaevj/onecmonitor.git synced 2026-06-17 22:34:48 +02:00
Files

143 lines
4.7 KiB
Plaintext

@page "/techlog/settings"
@inject AgentsConnectionsManager AgentsConnectionsManager
@inject TechLogRepositoryManager TechLogRepositoryManager
@inject IMapper Mapper
@inject ISnackbar SnackBar
@using FluentValidation
@using global::AutoMapper
@using Microsoft.EntityFrameworkCore
@using OneSwiss.Common.DTO
@using OneSwiss.Common.Services
@using OneSwiss.Common.Storage
@using OneSwiss.Server.Attributes
@using OneSwiss.Server.Components.Shared
@using OneSwiss.Server.Extensions
@using OneSwiss.Server.Services
@implements IDisposable
@attribute [ExtAuthorize]
<MudText Typo="Typo.h6" Class="mb-3">Сервис экспорта технологического журнала</MudText>
<SettingsForm @ref="_editor" T="Models.TechLogSettings"
Validation="@_validator.ValidateValue"
AfterSave="AfterSave">
<MudStack>
<MudSwitch Class="mb-3" Label="Включен" For="@(() => _editor.Model!.Enabled)"
@bind-Value="@_editor.Model!.Enabled" Color="Color.Primary"/>
<MudSelect Class="mb-3" Label="СУБД" For="@(() => _editor.Model!.DbmsId)" @bind-Value="@_editor.Model!.DbmsId"
Clearable="true">
@foreach (var item in _editor.Context!.Dbms.ToList())
{
<MudSelectItem Value="@((Guid?)item.Id)">@item.Name</MudSelectItem>
}
</MudSelect>
<MudTextField Class="mb-3" Label="Имя базы данных" For="@(() => _editor.Model!.DatabaseName)"
@bind-Value="@_editor.Model!.DatabaseName"/>
<MudTextField Class="mb-3" Label="Имя таблицы" For="@(() => _editor.Model!.Table)"
@bind-Value="@_editor.Model!.Table"/>
<MudSelect Class="mb-3" Label="Учетные данные" For="@(() => _editor.Model!.CredentialsId)"
@bind-Value="@_editor.Model!.CredentialsId" Clearable="true">
@foreach (var item in _editor.Context!.Credentials.Where(c => !c.IsToken).ToList())
{
<MudSelectItem Value="@((Guid?)item.Id)">@item.Name</MudSelectItem>
}
</MudSelect>
</MudStack>
</SettingsForm>
@code
{
private CancellationTokenSource? _cts;
private SettingsForm<Models.TechLogSettings> _editor = null!;
private readonly Validator _validator = new();
protected override void OnInitialized()
{
_cts = new CancellationTokenSource();
}
private class Validator : ModelValidator<Models.TechLogSettings>
{
public Validator()
{
When(c => c.Enabled, () =>
{
RuleFor(x => x.DatabaseName)
.NotEmpty()
.WithMessage("Не указано имя базы данных");
RuleFor(x => x.Table)
.NotEmpty()
.WithMessage("Не указана таблица базы данных");
RuleFor(x => x.DbmsId)
.NotEmpty()
.WithMessage("Не указана СУБД");
RuleFor(x => x.CredentialsId)
.NotEmpty()
.WithMessage("Не указаны учетные данные");
});
}
}
private async Task InitDataBase()
{
var settings = await _editor.Context!.TechLogSettings
.AsNoTracking()
.Include(c => c.Dbms)
.Include(c => c.Credentials)
.SingleOrDefaultAsync(_cts!.Token);
var settingsDto = Mapper.Map<TechLogSettingsDto>(settings);
using var context = new ClickHouseContext(
settingsDto.Dbms,
settingsDto.Credentials,
settingsDto.DatabaseName,
settingsDto.Table);
await context.InitTechLogTable(_cts!.Token);
}
private async Task AfterSave(Models.TechLogSettings obj)
{
if (!obj.Enabled)
return;
try
{
await InitDataBase();
SnackBar.ShowSuccess("База данных инициализирована");
var settings = await _editor.Context!.TechLogSettings
.Include(c => c.Credentials)
.Include(c => c.Dbms)
.SingleOrDefaultAsync();
TechLogRepositoryManager.UpdateSettings(Mapper.Map<TechLogSettingsDto>(settings));
}
catch (Exception e)
{
SnackBar.ShowError(e);
return;
}
try
{
await AgentsConnectionsManager.RaiseUpdateSettings(_cts!.Token);
}
catch (Exception e)
{
SnackBar.ShowError(e);
}
}
public void Dispose()
{
_cts?.Dispose();
}
}