Files
Ai/TrafagSalesExporter/Components/Pages/Logs.razor

95 lines
3.4 KiB
Plaintext

@page "/logs"
@using Microsoft.EntityFrameworkCore
@inject IDbContextFactory<AppDbContext> DbFactory
<PageTitle>Logs</PageTitle>
<MudText Typo="Typo.h4" Class="mb-4">Logs</MudText>
<MudGrid Class="mb-4">
<MudItem xs="12" md="3"><MudTextField Label="Land" @bind-Value="filterLand" /></MudItem>
<MudItem xs="12" md="3">
<MudSelect T="string" Label="Status" @bind-Value="filterStatus">
<MudSelectItem Value="">Alle</MudSelectItem>
<MudSelectItem Value="OK">OK</MudSelectItem>
<MudSelectItem Value="Error">Error</MudSelectItem>
</MudSelect>
</MudItem>
<MudItem xs="12" md="3"><MudDatePicker Label="Ab Datum" @bind-Date="filterFromDate" /></MudItem>
<MudItem xs="12" md="3"><MudButton Variant="Variant.Filled" OnClick="LoadAsync">Filtern</MudButton></MudItem>
</MudGrid>
<MudStack Row="true" Spacing="2" Class="mb-2">
<MudNumericField T="int" Label="Logs älter als Tage löschen" @bind-Value="deleteOlderThanDays" Min="1" />
<MudButton Variant="Variant.Outlined" Color="Color.Error" OnClick="DeleteOlderAsync">Logs löschen</MudButton>
</MudStack>
<MudTable Items="logs" Dense="true" Hover="true" RowClassFunc="GetRowClass">
<HeaderContent>
<MudTh>Timestamp</MudTh>
<MudTh>Land</MudTh>
<MudTh>TSC</MudTh>
<MudTh>Status</MudTh>
<MudTh>Rows</MudTh>
<MudTh>Dauer</MudTh>
<MudTh>Fehler</MudTh>
<MudTh>Dateiname</MudTh>
</HeaderContent>
<RowTemplate>
<MudTd>@context.Timestamp.ToLocalTime().ToString("dd.MM.yyyy HH:mm:ss")</MudTd>
<MudTd>@context.Land</MudTd>
<MudTd>@context.TSC</MudTd>
<MudTd>@context.Status</MudTd>
<MudTd>@context.RowCount</MudTd>
<MudTd>@($"{context.DurationSeconds:F1}s")</MudTd>
<MudTd>@context.ErrorMessage</MudTd>
<MudTd>@context.FileName</MudTd>
</RowTemplate>
</MudTable>
@code {
private List<ExportLog> logs = [];
private string filterLand = string.Empty;
private string filterStatus = string.Empty;
private DateTime? filterFromDate;
private int deleteOlderThanDays = 30;
protected override async Task OnInitializedAsync() => await LoadAsync();
private async Task LoadAsync()
{
await using var db = await DbFactory.CreateDbContextAsync();
var query = db.ExportLogs.AsQueryable();
if (!string.IsNullOrWhiteSpace(filterLand))
{
query = query.Where(x => x.Land.Contains(filterLand));
}
if (!string.IsNullOrWhiteSpace(filterStatus))
{
query = query.Where(x => x.Status == filterStatus);
}
if (filterFromDate.HasValue)
{
var fromUtc = filterFromDate.Value.Date.ToUniversalTime();
query = query.Where(x => x.Timestamp >= fromUtc);
}
logs = await query.OrderByDescending(x => x.Timestamp).ToListAsync();
}
private string GetRowClass(ExportLog log, int _) => log.Status == "Error" ? "mud-theme-error" : string.Empty;
private async Task DeleteOlderAsync()
{
var threshold = DateTime.UtcNow.AddDays(-deleteOlderThanDays);
await using var db = await DbFactory.CreateDbContextAsync();
var oldLogs = await db.ExportLogs.Where(x => x.Timestamp < threshold).ToListAsync();
db.ExportLogs.RemoveRange(oldLogs);
await db.SaveChangesAsync();
await LoadAsync();
}
}