diff --git a/apps/server/AliasVault.Api/Controllers/RootController.cs b/apps/server/AliasVault.Api/Controllers/RootController.cs index 13cb86ff3..1356ecc28 100644 --- a/apps/server/AliasVault.Api/Controllers/RootController.cs +++ b/apps/server/AliasVault.Api/Controllers/RootController.cs @@ -24,29 +24,49 @@ public class RootController(IAliasServerDbContextFactory dbContextFactory) : Con /// /// Http 200 if database connection is successful. [HttpGet] + [HttpHead] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status500InternalServerError)] public async Task Get() { - await using var context = await dbContextFactory.CreateDbContextAsync(); - try { - var appliedMigrations = await context.Database.GetAppliedMigrationsAsync(); - var allMigrations = context.Database.GetMigrations(); + await using var context = await dbContextFactory.CreateDbContextAsync(); - if (allMigrations.Except(appliedMigrations).Any()) + // Verify we can actually reach the database. + if (!await context.Database.CanConnectAsync()) { - // There are pending migrations - return StatusCode(500, "There are pending migrations. Please run 'dotnet ef database update' to apply them."); + return StatusCode(500, "ERROR: Database unreachable"); } - // Database is up-to-date + // Check if the database schema exists. + IEnumerable appliedMigrations; + try + { + appliedMigrations = await context.Database.GetAppliedMigrationsAsync(); + } + catch + { + return StatusCode(500, "ERROR: Database schema not initialized"); + } + + // Check if the database schema is up-to-date. + var allMigrations = context.Database.GetMigrations(); + if (allMigrations.Except(appliedMigrations).Any()) + { + return StatusCode(500, "ERROR: Database schema outdated (pending migrations)"); + } + + // Database is reachable and up-to-date. return Ok("OK"); } + catch (Exception ex) when (ex is TimeoutException or OperationCanceledException) + { + return StatusCode(500, "ERROR: Database timeout"); + } catch { - return StatusCode(500, "Internal server error"); + return StatusCode(500, "ERROR: Database error"); } } }