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