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