Test Docker

This commit is contained in:
2025-08-15 17:31:51 -03:00
parent 39b1e97072
commit bce5b1dcec
97 changed files with 8493 additions and 216 deletions

View File

@@ -113,4 +113,78 @@ public class ResultadosController : ControllerBase
return Ok(await Task.FromResult(respuestaSimulada));
}
[HttpGet("bancas/{seccionId}")]
public async Task<IActionResult> GetBancasPorSeccion(string seccionId)
{
// 1. Buscamos el ámbito de la sección electoral
var seccion = await _dbContext.AmbitosGeograficos
.AsNoTracking()
.FirstOrDefaultAsync(a => a.SeccionId == seccionId && a.NivelId == 4); // Nivel 4 = Sección Electoral
if (seccion == null)
{
return NotFound(new { message = $"No se encontró la sección electoral con ID {seccionId}" });
}
// 2. Buscamos todas las proyecciones para ese ámbito, incluyendo el nombre de la agrupación
var proyecciones = await _dbContext.ProyeccionesBancas
.AsNoTracking()
.Include(p => p.AgrupacionPolitica) // Incluimos el nombre del partido
.Where(p => p.AmbitoGeograficoId == seccion.Id)
.Select(p => new
{
// Creamos un objeto anónimo para la respuesta, más limpio que un DTO para este caso simple
AgrupacionNombre = p.AgrupacionPolitica.Nombre,
Bancas = p.NroBancas
})
.OrderByDescending(p => p.Bancas)
.ToListAsync();
if (!proyecciones.Any())
{
return NotFound(new { message = $"No se han encontrado proyecciones de bancas para la sección {seccion.Nombre}" });
}
// 3. Devolvemos un objeto que contiene el nombre de la sección y la lista de resultados
return Ok(new
{
SeccionNombre = seccion.Nombre,
Proyeccion = proyecciones
});
}
[HttpGet("mapa")]
public async Task<IActionResult> GetResultadosParaMapa()
{
// Esta consulta es mucho más eficiente y se traduce bien a SQL.
// Paso 1: Para cada ámbito, encontrar la cantidad máxima de votos.
var maxVotosPorAmbito = _dbContext.ResultadosVotos
.GroupBy(rv => rv.AmbitoGeograficoId)
.Select(g => new
{
AmbitoId = g.Key,
MaxVotos = g.Max(v => v.CantidadVotos)
});
// Paso 2: Unir los resultados originales con los máximos para encontrar el registro ganador.
// Esto nos da, para cada ámbito, el registro completo del partido que tuvo más votos.
var resultadosGanadores = await _dbContext.ResultadosVotos
.Join(
maxVotosPorAmbito,
voto => new { AmbitoId = voto.AmbitoGeograficoId, Votos = voto.CantidadVotos },
max => new { AmbitoId = max.AmbitoId, Votos = max.MaxVotos },
(voto, max) => voto // Nos quedamos con el objeto 'ResultadoVoto' completo
)
.Include(rv => rv.AmbitoGeografico) // Incluimos el ámbito para obtener el MunicipioId
.Where(rv => rv.AmbitoGeografico.MunicipioId != null)
.Select(rv => new
{
MunicipioId = rv.AmbitoGeografico.MunicipioId,
AgrupacionGanadoraId = rv.AgrupacionPoliticaId
})
.ToListAsync();
return Ok(resultadosGanadores);
}
}

View File

@@ -0,0 +1,62 @@
using Elecciones.Core.DTOs.ApiResponses;
using Elecciones.Database;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Linq;
using System.Threading.Tasks;
namespace Elecciones.Api.Controllers;
[ApiController]
[Route("api/[controller]")]
public class TelegramasController : ControllerBase
{
private readonly EleccionesDbContext _dbContext;
public TelegramasController(EleccionesDbContext dbContext)
{
_dbContext = dbContext;
}
/// <summary>
/// Obtiene la lista de IDs de todos los telegramas que han sido totalizados y descargados.
/// </summary>
[HttpGet]
public async Task<IActionResult> GetListaTelegramas()
{
var ids = await _dbContext.Telegramas
.AsNoTracking()
.OrderBy(t => t.Id)
.Select(t => t.Id)
.ToListAsync();
return Ok(ids);
}
/// <summary>
/// Obtiene el contenido completo de un telegrama específico, incluyendo la imagen en Base64.
/// </summary>
/// <param name="mesaId">El ID único de la mesa/telegrama (ej. "0200100001M").</param>
[HttpGet("{mesaId}")]
public async Task<IActionResult> GetTelegramaPorId(string mesaId)
{
var telegrama = await _dbContext.Telegramas
.AsNoTracking()
.FirstOrDefaultAsync(t => t.Id == mesaId);
if (telegrama == null)
{
return NotFound(new { message = $"No se encontró el telegrama con ID {mesaId}" });
}
// Devolvemos todos los datos del telegrama
return Ok(new
{
telegrama.Id,
telegrama.AmbitoGeograficoId,
telegrama.ContenidoBase64,
telegrama.FechaEscaneo,
telegrama.FechaTotalizacion
});
}
}