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); } } }