using Microsoft.AspNetCore.Mvc; using RoslynBridge.WebApi.Models; using RoslynBridge.WebApi.Services; namespace RoslynBridge.WebApi.Controllers; /// /// Health check and status controller /// [ApiController] [Route("api/[controller]")] [Produces("application/json")] public class HealthController : ControllerBase { private readonly IRoslynBridgeClient _bridgeClient; private readonly ILogger _logger; public HealthController(IRoslynBridgeClient bridgeClient, ILogger logger) { _bridgeClient = bridgeClient; _logger = logger; } /// /// Get the health status of the middleware and Visual Studio plugin /// /// Cancellation token /// Health status information /// Service is healthy /// Service is unhealthy [HttpGet] [ProducesResponseType(typeof(HealthCheckResponse), StatusCodes.Status200OK)] [ProducesResponseType(typeof(HealthCheckResponse), StatusCodes.Status503ServiceUnavailable)] public async Task> GetHealth(CancellationToken cancellationToken) { var response = new HealthCheckResponse(); try { var isVsPluginHealthy = await _bridgeClient.IsHealthyAsync(null, cancellationToken); response.VsPluginStatus = isVsPluginHealthy ? "Connected" : "Disconnected"; if (!isVsPluginHealthy) { response.Status = "Degraded"; _logger.LogWarning("Visual Studio plugin is not accessible"); return StatusCode(StatusCodes.Status503ServiceUnavailable, response); } _logger.LogInformation("Health check passed"); return Ok(response); } catch (Exception ex) { _logger.LogError(ex, "Health check failed"); response.Status = "Unhealthy"; response.VsPluginStatus = "Error"; return StatusCode(StatusCodes.Status503ServiceUnavailable, response); } } /// /// Simple ping endpoint /// /// Pong response [HttpGet("ping")] [ProducesResponseType(typeof(object), StatusCodes.Status200OK)] public IActionResult Ping() { return Ok(new { message = "pong", timestamp = DateTime.UtcNow }); } }