Fix TimeOut Api

This commit is contained in:
2025-08-17 20:31:25 -03:00
parent 258add9305
commit eed8d2f065

View File

@@ -34,15 +34,12 @@ public class Worker : BackgroundService
{
_logger.LogInformation("Elecciones Worker iniciado a las: {time}", DateTimeOffset.Now);
// 1. SINCRONIZACIÓN INICIAL: Se ejecuta una vez al iniciar el worker para
// asegurar que la base de datos local tenga todos los catálogos maestros.
await SincronizarCatalogosMaestrosAsync(stoppingToken);
_logger.LogInformation("-------------------------------------------------");
_logger.LogInformation("Iniciando sondeo periódico de resultados...");
_logger.LogInformation("-------------------------------------------------");
// 2. BUCLE DE SONDEO: Se ejecuta continuamente hasta que se detenga la aplicación.
while (!stoppingToken.IsCancellationRequested)
{
var authToken = await _apiService.GetAuthTokenAsync();
@@ -53,13 +50,23 @@ public class Worker : BackgroundService
continue;
}
await Task.WhenAll(
SondearResultadosMunicipalesAsync(authToken, stoppingToken),
SondearProyeccionBancasAsync(authToken, stoppingToken),
SondearNuevosTelegramasAsync(authToken, stoppingToken),
SondearResumenProvincialAsync(authToken, stoppingToken),
SondearEstadoRecuentoGeneralAsync(authToken, stoppingToken)
);
// --- CAMBIO CLAVE: DE PARALELO A SECUENCIAL ---
// Se elimina Task.WhenAll y se ejecutan las tareas una después de la otra.
// Esto previene los errores de Gateway Timeout (504).
_logger.LogInformation("--- Iniciando sondeo de Resultados Municipales ---");
await SondearResultadosMunicipalesAsync(authToken, stoppingToken);
_logger.LogInformation("--- Iniciando sondeo de Proyección de Bancas ---");
await SondearProyeccionBancasAsync(authToken, stoppingToken);
_logger.LogInformation("--- Iniciando sondeo de Nuevos Telegramas ---");
await SondearNuevosTelegramasAsync(authToken, stoppingToken);
_logger.LogInformation("--- Iniciando sondeo de Resumen Provincial ---");
await SondearResumenProvincialAsync(authToken, stoppingToken);
_logger.LogInformation("--- Iniciando sondeo de Estado de Recuento General ---");
await SondearEstadoRecuentoGeneralAsync(authToken, stoppingToken);
try
{
@@ -117,13 +124,18 @@ public class Worker : BackgroundService
// --- 2. SINCRONIZAR ÁMBITOS Y AGRUPACIONES POR CADA CATEGORÍA ---
// CORRECCIÓN: La siguiente línea faltaba por completo, causando el error CS0103.
// Carga todos los ámbitos existentes en un diccionario para una verificación rápida.
var ambitosEnDb = await dbContext.AmbitosGeograficos.ToDictionaryAsync(
a => (a.DistritoId, a.SeccionId, a.MunicipioId, a.CircuitoId, a.EstablecimientoId),
a => a,
stoppingToken
);
var ambitosEnDb = new Dictionary<string, AmbitoGeografico>();
var todosLosAmbitos = await dbContext.AmbitosGeograficos.ToListAsync(stoppingToken);
foreach (var ambito in todosLosAmbitos)
{
// Creamos una clave única que SIEMPRE funciona, incluso con nulos.
string clave = $"{ambito.NivelId}|{ambito.DistritoId}|{ambito.SeccionProvincialId}|{ambito.SeccionId}|{ambito.MunicipioId}|{ambito.CircuitoId}|{ambito.EstablecimientoId}|{ambito.MesaId}";
if (!ambitosEnDb.ContainsKey(clave))
{
ambitosEnDb.Add(clave, ambito);
}
}
var agrupacionesEnDb = await dbContext.AgrupacionesPoliticas.ToDictionaryAsync(a => a.Id, a => a, stoppingToken);
@@ -135,18 +147,11 @@ public class Worker : BackgroundService
var catalogoDto = await _apiService.GetCatalogoAmbitosAsync(authToken, categoria.CategoriaId);
if (catalogoDto != null)
{
// SINCRONIZAR ÁMBITOS
foreach (var ambitoDto in catalogoDto.Ambitos)
{
var claveUnica = (
ambitoDto.CodigoAmbitos.DistritoId,
ambitoDto.CodigoAmbitos.SeccionId,
ambitoDto.CodigoAmbitos.MunicipioId,
ambitoDto.CodigoAmbitos.CircuitoId,
ambitoDto.CodigoAmbitos.EstablecimientoId
);
// Volvemos a generar la misma clave única para la comparación
string claveUnica = $"{ambitoDto.NivelId}|{ambitoDto.CodigoAmbitos.DistritoId}|{ambitoDto.CodigoAmbitos.SeccionProvincialId}|{ambitoDto.CodigoAmbitos.SeccionId}|{ambitoDto.CodigoAmbitos.MunicipioId}|{ambitoDto.CodigoAmbitos.CircuitoId}|{ambitoDto.CodigoAmbitos.EstablecimientoId}|{ambitoDto.CodigoAmbitos.MesaId}";
// Aquí se usaba 'ambitosEnDb' sin haberlo declarado. Ahora funciona.
if (!ambitosEnDb.ContainsKey(claveUnica))
{
var nuevoAmbito = new AmbitoGeografico
@@ -154,14 +159,14 @@ public class Worker : BackgroundService
Nombre = ambitoDto.Nombre,
NivelId = ambitoDto.NivelId,
DistritoId = ambitoDto.CodigoAmbitos.DistritoId,
SeccionProvincialId = ambitoDto.CodigoAmbitos.SeccionProvincialId,
SeccionId = ambitoDto.CodigoAmbitos.SeccionId,
MunicipioId = ambitoDto.CodigoAmbitos.MunicipioId,
CircuitoId = ambitoDto.CodigoAmbitos.CircuitoId,
EstablecimientoId = ambitoDto.CodigoAmbitos.EstablecimientoId,
SeccionProvincialId = ambitoDto.CodigoAmbitos.SeccionProvincialId
MesaId = ambitoDto.CodigoAmbitos.MesaId,
};
dbContext.AmbitosGeograficos.Add(nuevoAmbito);
// Se añade al diccionario en memoria para evitar duplicados en el mismo ciclo.
ambitosEnDb.Add(claveUnica, nuevoAmbito);
}
}