// backend/src/Titulares.Api/Controllers/TitularesController.cs using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.SignalR; using Titulares.Api.Data; using Titulares.Api.Hubs; using Titulares.Api.Models; namespace Titulares.Api.Controllers; [ApiController] [Route("api/[controller]")] public class TitularesController : ControllerBase { private readonly TitularRepositorio _repositorio; private readonly IHubContext _hubContext; public TitularesController(TitularRepositorio repositorio, IHubContext hubContext) { _repositorio = repositorio; _hubContext = hubContext; } private async Task NotificarCambios() { var titularesActualizados = await _repositorio.ObtenerTodosAsync(); // Enviamos un mensaje llamado "TitularesActualizados" a TODOS los clientes conectados // y les pasamos la lista completa y actualizada. await _hubContext.Clients.All.SendAsync("TitularesActualizados", titularesActualizados); } [HttpGet] public async Task ObtenerTodos() { var titulares = await _repositorio.ObtenerTodosAsync(); return Ok(titulares); } [HttpPost] public async Task CrearManual([FromBody] CrearTitularDto titularDto) { var nuevoId = await _repositorio.CrearManualAsync(titularDto); await NotificarCambios(); // Notificamos después de crear return CreatedAtAction(nameof(ObtenerTodos), new { id = nuevoId }, null); } [HttpPut("{id}")] public async Task Actualizar(int id, [FromBody] ActualizarTitularDto titularDto) { var resultado = await _repositorio.ActualizarTextoAsync(id, titularDto); if (!resultado) return NotFound(); await NotificarCambios(); // Notificamos después de actualizar return NoContent(); } [HttpPut("reordenar")] public async Task Reordenar([FromBody] List ordenes) { var resultado = await _repositorio.ActualizarOrdenAsync(ordenes); if (!resultado) return StatusCode(500, "Error al actualizar el orden."); await NotificarCambios(); // Notificamos después de reordenar return Ok(); } [HttpDelete("{id}")] public async Task Eliminar(int id) { var resultado = await _repositorio.EliminarAsync(id); if (!resultado) return NotFound(); await NotificarCambios(); // Notificamos después de eliminar return NoContent(); } }