using Microsoft.AspNetCore.Mvc;
using RoslynBridge.WebApi.Models;
using RoslynBridge.WebApi.Services;
namespace RoslynBridge.WebApi.Controllers;
///
/// Controller for managing Visual Studio instance registrations
///
[ApiController]
[Route("api/[controller]")]
[Produces("application/json")]
public class InstancesController : ControllerBase
{
private readonly IInstanceRegistryService _registryService;
private readonly ILogger _logger;
public InstancesController(
IInstanceRegistryService registryService,
ILogger logger)
{
_registryService = registryService;
_logger = logger;
}
///
/// Register a new Visual Studio instance
///
/// Instance information
/// Registration result
[HttpPost("register")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public IActionResult Register([FromBody] VSInstanceInfo instance)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
_registryService.Register(instance);
return Ok(new
{
success = true,
message = "Instance registered successfully",
processId = instance.ProcessId,
port = instance.Port
});
}
///
/// Unregister a Visual Studio instance
///
/// Process ID of the instance to unregister
/// Unregistration result
[HttpPost("unregister/{processId}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public IActionResult Unregister(int processId)
{
var removed = _registryService.Unregister(processId);
if (!removed)
{
return NotFound(new { success = false, message = "Instance not found" });
}
return Ok(new { success = true, message = "Instance unregistered successfully" });
}
///
/// Update heartbeat for a Visual Studio instance
///
/// Process ID of the instance
/// Heartbeat update result
[HttpPost("heartbeat/{processId}")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public IActionResult Heartbeat(int processId)
{
var updated = _registryService.UpdateHeartbeat(processId);
if (!updated)
{
return NotFound(new { success = false, message = "Instance not found" });
}
return Ok(new { success = true, message = "Heartbeat updated" });
}
///
/// Get all registered Visual Studio instances
///
/// List of registered instances
[HttpGet]
[ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)]
public IActionResult GetAll()
{
var instances = _registryService.GetAllInstances();
return Ok(instances);
}
///
/// Get instance by process ID
///
/// Process ID
/// Instance information
[HttpGet("by-pid/{processId}")]
[ProducesResponseType(typeof(VSInstanceInfo), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public IActionResult GetByProcessId(int processId)
{
var instance = _registryService.GetByProcessId(processId);
if (instance == null)
{
return NotFound(new { success = false, message = "Instance not found" });
}
return Ok(instance);
}
///
/// Get instance by solution path
///
/// Solution file path
/// Instance information
[HttpGet("by-solution")]
[ProducesResponseType(typeof(VSInstanceInfo), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public IActionResult GetBySolutionPath([FromQuery] string solutionPath)
{
if (string.IsNullOrEmpty(solutionPath))
{
return BadRequest(new { success = false, message = "Solution path is required" });
}
var instance = _registryService.GetBySolutionPath(solutionPath);
if (instance == null)
{
return NotFound(new { success = false, message = "No instance found for this solution" });
}
return Ok(instance);
}
///
/// Get instance by port
///
/// Port number
/// Instance information
[HttpGet("by-port/{port}")]
[ProducesResponseType(typeof(VSInstanceInfo), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public IActionResult GetByPort(int port)
{
var instance = _registryService.GetByPort(port);
if (instance == null)
{
return NotFound(new { success = false, message = "Instance not found" });
}
return Ok(instance);
}
}