diff --git a/cv-matcher-api/Controllers/HealthController.cs b/cv-matcher-api/Controllers/HealthController.cs
new file mode 100644
index 0000000..cb8cd2a
--- /dev/null
+++ b/cv-matcher-api/Controllers/HealthController.cs
@@ -0,0 +1,64 @@
+using Microsoft.AspNetCore.Mvc;
+
+namespace Api.Controllers
+{
+ ///
+ /// Controller that exposes simple health and readiness endpoints for the API.
+ /// Routes are prefixed with "api/health".
+ ///
+ [ApiController]
+ [Route("api/[controller]")]
+ public sealed class HealthController : ControllerBase
+ {
+ ///
+ /// Liveness probe.
+ /// Indicates whether the process is running. Used by orchestration systems to confirm the process is alive.
+ ///
+ ///
+ /// 200 OK with JSON payload: { "status": "alive" } when the process is running.
+ ///
+ // GET api/health/live
+ [HttpGet("live")]
+ public IActionResult Live() => Ok(new { status = "alive" });
+
+ ///
+ /// Basic health check endpoint.
+ /// Returns overall status and the current server time in UTC.
+ ///
+ ///
+ /// 200 OK with JSON payload: { "status": "ok", "time": <UTC time> }.
+ ///
+ // GET api/health
+ [HttpGet]
+ public IActionResult Health() => Ok(new { status = "ok", time = DateTimeOffset.UtcNow });
+
+ ///
+ /// Echo endpoint.
+ /// Returns the received JSON payload unchanged. Useful for testing request/response plumbing.
+ ///
+ /// Arbitrary JSON from the request body. The endpoint returns the same object.
+ /// 200 OK with the same JSON payload provided in the request body.
+ // POST api/health/echo
+ [HttpPost("echo")]
+ public IActionResult Echo(object payload) => Ok(payload);
+
+ ///
+ /// Readiness probe.
+ /// Indicates whether the service is ready to accept traffic. Typically checks downstream dependencies.
+ ///
+ ///
+ /// 200 OK with JSON { "status": "ready" } when ready;
+ /// 503 Service Unavailable with JSON { "status": "not_ready" } when not ready.
+ ///
+ // GET api/health/ready
+ [HttpGet("ready")]
+ public IActionResult Ready()
+ {
+ var ready = true;
+
+ return ready
+ ? Ok(new { status = "ready" })
+ : StatusCode(503, new { status = "not_ready" });
+ }
+ }
+}
\ No newline at end of file
diff --git a/cv-matcher-api/Program.cs b/cv-matcher-api/Program.cs
index f640e1a..ce602b9 100644
--- a/cv-matcher-api/Program.cs
+++ b/cv-matcher-api/Program.cs
@@ -83,7 +83,6 @@ try
app.UseSwaggerInDevelopment(ServiceName, ServiceName);
app.MapControllers();
- app.MapHealthEndpoint(ServiceName, appVersion);
Log.Information("Running EF Core migrations if any");
using (var scope = app.Services.CreateScope())
diff --git a/rag-api/Controllers/HealthController.cs b/rag-api/Controllers/HealthController.cs
new file mode 100644
index 0000000..cb8cd2a
--- /dev/null
+++ b/rag-api/Controllers/HealthController.cs
@@ -0,0 +1,64 @@
+using Microsoft.AspNetCore.Mvc;
+
+namespace Api.Controllers
+{
+ ///
+ /// Controller that exposes simple health and readiness endpoints for the API.
+ /// Routes are prefixed with "api/health".
+ ///
+ [ApiController]
+ [Route("api/[controller]")]
+ public sealed class HealthController : ControllerBase
+ {
+ ///
+ /// Liveness probe.
+ /// Indicates whether the process is running. Used by orchestration systems to confirm the process is alive.
+ ///
+ ///
+ /// 200 OK with JSON payload: { "status": "alive" } when the process is running.
+ ///
+ // GET api/health/live
+ [HttpGet("live")]
+ public IActionResult Live() => Ok(new { status = "alive" });
+
+ ///
+ /// Basic health check endpoint.
+ /// Returns overall status and the current server time in UTC.
+ ///
+ ///
+ /// 200 OK with JSON payload: { "status": "ok", "time": <UTC time> }.
+ ///
+ // GET api/health
+ [HttpGet]
+ public IActionResult Health() => Ok(new { status = "ok", time = DateTimeOffset.UtcNow });
+
+ ///
+ /// Echo endpoint.
+ /// Returns the received JSON payload unchanged. Useful for testing request/response plumbing.
+ ///
+ /// Arbitrary JSON from the request body. The endpoint returns the same object.
+ /// 200 OK with the same JSON payload provided in the request body.
+ // POST api/health/echo
+ [HttpPost("echo")]
+ public IActionResult Echo(object payload) => Ok(payload);
+
+ ///
+ /// Readiness probe.
+ /// Indicates whether the service is ready to accept traffic. Typically checks downstream dependencies.
+ ///
+ ///
+ /// 200 OK with JSON { "status": "ready" } when ready;
+ /// 503 Service Unavailable with JSON { "status": "not_ready" } when not ready.
+ ///
+ // GET api/health/ready
+ [HttpGet("ready")]
+ public IActionResult Ready()
+ {
+ var ready = true;
+
+ return ready
+ ? Ok(new { status = "ready" })
+ : StatusCode(503, new { status = "not_ready" });
+ }
+ }
+}
\ No newline at end of file
diff --git a/rag-api/Program.cs b/rag-api/Program.cs
index 1c2acd7..daadebf 100644
--- a/rag-api/Program.cs
+++ b/rag-api/Program.cs
@@ -71,7 +71,6 @@ try
app.UseSwaggerInDevelopment(ServiceName, ServiceName);
app.MapControllers();
- app.MapHealthEndpoint(ServiceName, appVersion);
Log.Information("Running EF Core migrations if any");
using (var scope = app.Services.CreateScope())
diff --git a/startup-helpers/StartupExtensions.cs b/startup-helpers/StartupExtensions.cs
index 7bda41c..65b6c80 100644
--- a/startup-helpers/StartupExtensions.cs
+++ b/startup-helpers/StartupExtensions.cs
@@ -215,15 +215,4 @@ public static class StartupExtensions
options.RoutePrefix = "swagger";
});
}
-
- public static void MapHealthEndpoint(this WebApplication app, string serviceName, string appVersion)
- {
- app.MapGet("/health", () => Results.Ok(new
- {
- status = "ok",
- service = serviceName,
- version = appVersion,
- timeUtc = DateTimeOffset.UtcNow
- }));
- }
}