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:
Joseph Doherty
2026-01-02 07:43:29 -05:00
commit 26ff8d9b4f
1761 changed files with 596509 additions and 0 deletions
@@ -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);
}
}
}