Fase 3: Refactorizado SignalR a un hook reutilizable (useSignalR) y conectado al Dashboard.
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
// 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;
|
||||
@@ -11,10 +13,20 @@ namespace Titulares.Api.Controllers;
|
||||
public class TitularesController : ControllerBase
|
||||
{
|
||||
private readonly TitularRepositorio _repositorio;
|
||||
private readonly IHubContext<TitularesHub> _hubContext;
|
||||
|
||||
public TitularesController(TitularRepositorio repositorio)
|
||||
public TitularesController(TitularRepositorio repositorio, IHubContext<TitularesHub> 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]
|
||||
@@ -27,40 +39,35 @@ public class TitularesController : ControllerBase
|
||||
[HttpPost]
|
||||
public async Task<IActionResult> CrearManual([FromBody] CrearTitularDto titularDto)
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
{
|
||||
return BadRequest(ModelState);
|
||||
}
|
||||
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<IActionResult> Actualizar(int id, [FromBody] ActualizarTitularDto titularDto)
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
{
|
||||
return BadRequest(ModelState);
|
||||
}
|
||||
var resultado = await _repositorio.ActualizarTextoAsync(id, titularDto);
|
||||
return resultado ? NoContent() : NotFound();
|
||||
if (!resultado) return NotFound();
|
||||
await NotificarCambios(); // Notificamos después de actualizar
|
||||
return NoContent();
|
||||
}
|
||||
|
||||
[HttpPut("reordenar")]
|
||||
public async Task<IActionResult> Reordenar([FromBody] List<ReordenarTitularDto> ordenes)
|
||||
{
|
||||
if (ordenes == null || !ordenes.Any())
|
||||
{
|
||||
return BadRequest("La lista de órdenes no puede estar vacía.");
|
||||
}
|
||||
var resultado = await _repositorio.ActualizarOrdenAsync(ordenes);
|
||||
return resultado ? Ok() : StatusCode(500, "Error al actualizar el orden.");
|
||||
if (!resultado) return StatusCode(500, "Error al actualizar el orden.");
|
||||
await NotificarCambios(); // Notificamos después de reordenar
|
||||
return Ok();
|
||||
}
|
||||
|
||||
[HttpDelete("{id}")]
|
||||
public async Task<IActionResult> Eliminar(int id)
|
||||
{
|
||||
var resultado = await _repositorio.EliminarAsync(id);
|
||||
return resultado ? NoContent() : NotFound();
|
||||
if (!resultado) return NotFound();
|
||||
await NotificarCambios(); // Notificamos después de eliminar
|
||||
return NoContent();
|
||||
}
|
||||
}
|
||||
12
backend/src/Titulares.Api/Hubs/TitularesHub.cs
Normal file
12
backend/src/Titulares.Api/Hubs/TitularesHub.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
// backend/src/Titulares.Api/Hubs/TitularesHub.cs
|
||||
|
||||
using Microsoft.AspNetCore.SignalR;
|
||||
|
||||
namespace Titulares.Api.Hubs;
|
||||
|
||||
// Esta clase es el punto de conexión para los clientes de SignalR.
|
||||
// No necesitamos añadirle métodos personalizados porque solo enviaremos
|
||||
// mensajes desde el servidor hacia los clientes.
|
||||
public class TitularesHub : Hub
|
||||
{
|
||||
}
|
||||
@@ -1,35 +1,34 @@
|
||||
// backend/src/Titulares.Api/Program.cs
|
||||
using Titulares.Api.Data;
|
||||
using Titulares.Api.Hubs; // Añadir este using
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
// 1. Añadir servicios al contenedor.
|
||||
// ===================================
|
||||
|
||||
// Añadimos los servicios para los controladores API
|
||||
// Add services to the container.
|
||||
builder.Services.AddControllers();
|
||||
|
||||
builder.Services.AddEndpointsApiExplorer();
|
||||
builder.Services.AddSwaggerGen();
|
||||
|
||||
// Añadimos nuestro repositorio personalizado
|
||||
builder.Services.AddSingleton<TitularRepositorio>();
|
||||
|
||||
// Añadimos los servicios de autorización (necesario para app.UseAuthorization)
|
||||
builder.Services.AddAuthorization();
|
||||
|
||||
// Añadimos la política de CORS
|
||||
builder.Services.AddCors(options =>
|
||||
{
|
||||
options.AddPolicy("AllowReactApp", builder =>
|
||||
{
|
||||
builder.WithOrigins("http://localhost:5174")
|
||||
builder.WithOrigins("http://localhost:5173")
|
||||
.AllowAnyHeader()
|
||||
.AllowAnyMethod()
|
||||
.AllowCredentials();
|
||||
});
|
||||
});
|
||||
|
||||
builder.Services.AddSignalR();
|
||||
|
||||
// Añadimos los servicios de autorización (necesario para app.UseAuthorization)
|
||||
builder.Services.AddAuthorization();
|
||||
|
||||
// 2. Construir la aplicación.
|
||||
// ==========================
|
||||
var app = builder.Build();
|
||||
@@ -43,15 +42,21 @@ if (app.Environment.IsDevelopment())
|
||||
app.UseSwaggerUI();
|
||||
}
|
||||
|
||||
app.UseHttpsRedirection();
|
||||
// COMENTAMOS LA REDIRECCIÓN HTTPS PORQUE TRABAJAMOS CON HTTP
|
||||
// app.UseHttpsRedirection();
|
||||
|
||||
// Usamos la política de CORS que definimos
|
||||
// 1. Activa el enrutamiento para que la app sepa a dónde va la petición.
|
||||
app.UseRouting();
|
||||
|
||||
// 2. APLICA LA POLÍTICA DE CORS.
|
||||
app.UseCors("AllowReactApp");
|
||||
|
||||
// Usamos la autorización
|
||||
// 3. Usamos la autorización.
|
||||
app.UseAuthorization();
|
||||
|
||||
// Mapeamos los controladores para que la API responda a las rutas
|
||||
// 4. Mapeamos los endpoints (Controladores y Hubs).
|
||||
app.MapControllers();
|
||||
app.MapHub<TitularesHub>("/titularesHub");
|
||||
|
||||
|
||||
app.Run();
|
||||
Reference in New Issue
Block a user