Initial commit: JDE Scoping Tool migration project
Set up repository with legacy .NET Framework 4.8 source (OLD/), new .NET 10 Blazor solution (NEW/), OpenSpec specifications, documentation, and project configuration.
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
using JdeScoping.DataSync.Contracts;
|
||||
using Microsoft.Extensions.Diagnostics.HealthChecks;
|
||||
|
||||
namespace JdeScoping.DataSync.HealthChecks;
|
||||
|
||||
/// <summary>
|
||||
/// Health check for data sync operations.
|
||||
/// </summary>
|
||||
public class DataSyncHealthCheck : IHealthCheck
|
||||
{
|
||||
private readonly IDataUpdateRepository _repository;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="DataSyncHealthCheck"/> class.
|
||||
/// </summary>
|
||||
public DataSyncHealthCheck(IDataUpdateRepository repository)
|
||||
{
|
||||
_repository = repository ?? throw new ArgumentNullException(nameof(repository));
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
public async Task<HealthCheckResult> CheckHealthAsync(
|
||||
HealthCheckContext context,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
try
|
||||
{
|
||||
var statuses = await _repository.GetSyncStatusAsync(cancellationToken);
|
||||
var data = new Dictionary<string, object>();
|
||||
|
||||
foreach (var status in statuses)
|
||||
{
|
||||
var key = $"{status.TableName}_{status.UpdateType}";
|
||||
data[$"{key}_LastSync"] = status.LastSyncTime?.ToString("O") ?? "Never";
|
||||
data[$"{key}_Status"] = status.IsOverdue ? "Overdue" : "Current";
|
||||
data[$"{key}_RecentFailures"] = status.RecentFailures;
|
||||
}
|
||||
|
||||
var overdueCount = statuses.Count(s => s.IsOverdue);
|
||||
var failedCount = statuses.Count(s => s.RecentFailures > 0);
|
||||
var totalTables = statuses.Select(s => s.TableName).Distinct().Count();
|
||||
|
||||
data["TotalTables"] = totalTables;
|
||||
data["OverdueCount"] = overdueCount;
|
||||
data["FailedCount"] = failedCount;
|
||||
|
||||
if (failedCount > 2)
|
||||
{
|
||||
return HealthCheckResult.Unhealthy(
|
||||
$"Multiple recent sync failures ({failedCount} tables)",
|
||||
data: data);
|
||||
}
|
||||
|
||||
if (failedCount > 0)
|
||||
{
|
||||
return HealthCheckResult.Degraded(
|
||||
$"{failedCount} tables with recent failures",
|
||||
data: data);
|
||||
}
|
||||
|
||||
if (overdueCount > totalTables / 2)
|
||||
{
|
||||
return HealthCheckResult.Degraded(
|
||||
$"{overdueCount} tables overdue for sync",
|
||||
data: data);
|
||||
}
|
||||
|
||||
if (overdueCount > 0)
|
||||
{
|
||||
return HealthCheckResult.Healthy(
|
||||
$"All syncs progressing ({overdueCount} tables slightly overdue)",
|
||||
data: data);
|
||||
}
|
||||
|
||||
return HealthCheckResult.Healthy(
|
||||
"All syncs current",
|
||||
data: data);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return HealthCheckResult.Unhealthy(
|
||||
"Unable to check sync status",
|
||||
exception: ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user