using foodmarket.Infrastructure.Persistence;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Diagnostics.HealthChecks;
namespace foodmarket.Api.Infrastructure.Health;
/// Readiness-проба: приложение готово принимать трафик только когда
/// БД отвечает И все миграции применены. Если есть неприменённые миграции —
/// схема не соответствует коду (например, контейнер поднялся раньше, чем
/// отработал Migrate(), или откатили не ту версию) — отдаём Unhealthy,
/// чтобы оркестратор/прокси не слал на этот инстанс запросы.
public sealed class DatabaseReadyHealthCheck : IHealthCheck
{
private readonly AppDbContext _db;
public DatabaseReadyHealthCheck(AppDbContext db) => _db = db;
public async Task CheckHealthAsync(
HealthCheckContext context, CancellationToken cancellationToken = default)
{
try
{
if (!await _db.Database.CanConnectAsync(cancellationToken))
{
return HealthCheckResult.Unhealthy("Нет соединения с БД.");
}
var pending = (await _db.Database.GetPendingMigrationsAsync(cancellationToken)).ToList();
if (pending.Count > 0)
{
return HealthCheckResult.Unhealthy(
$"Неприменённые миграции: {pending.Count} (первая: {pending[0]}).",
data: new Dictionary { ["pendingMigrations"] = pending });
}
return HealthCheckResult.Healthy("БД доступна, миграции применены.");
}
catch (Exception ex)
{
return HealthCheckResult.Unhealthy("Ошибка проверки готовности БД.", ex);
}
}
}