# 📊 Elecciones 2025 - Plataforma de Visualización de Resultados

Este repositorio contiene el código fuente completo para la plataforma de visualización en tiempo real de los resultados de las Elecciones Legislativas 2025. El sistema está diseñado para ingestar datos desde la API oficial, procesarlos y exponerlos a través de widgets dinámicos para ser consumidos en sitios web como `www.eldia.com`.

---

## ✨ Características Principales

*   **Ingesta en Tiempo Real:** Un servicio `Worker` en segundo plano sondea constantemente la API electoral para obtener los últimos datos del escrutinio.
*   **API Propia de Alto Rendimiento:** Una API RESTful propia, construida con .NET 9, que sirve los datos procesados desde una base de datos SQL Server, asegurando respuestas rápidas y desacoplamiento del servicio oficial.
*   **Widgets Dinámicos:** Componentes de `React` (construidos con Vite + TypeScript) que se actualizan automáticamente para mostrar los resultados en vivo.
*   **Arquitectura Escalable y Segura:** El sistema está completamente contenedorizado con `Docker` y orquestado a través de `Docker Compose`, utilizando un proxy inverso Nginx como único punto de entrada.
*   **Gestión de Secretos:** La configuración sensible (credenciales, cadenas de conexión) se gestiona a través de variables de entorno, manteniendo el código limpio y seguro.

---

## 🛠️ Stack Tecnológico

*   **Backend:** C# / .NET 9
    *   **API:** ASP.NET Core Web API
    *   **Servicio de Ingesta:** .NET Worker Service
    *   **Base de Datos:** SQL Server
    *   **ORM:** Entity Framework Core
*   **Frontend:**
    *   **Librería:** React
    *   **Build Tool:** Vite
    *   **Lenguaje:** TypeScript
    *   **Peticiones HTTP:** Axios
*   **Infraestructura:**
    *   **Contenedores:** Docker
    *   **Orquestación:** Docker Compose
    *   **Proxy Inverso:** Nginx

---

## 🚀 Puesta en Marcha (Entorno de Desarrollo Local)

Para ejecutar el proyecto en tu máquina local sin Docker, sigue estos pasos.

### **Prerrequisitos**

1.  **SDK de .NET 9:** [Descargar aquí](https://dotnet.microsoft.com/download/dotnet/9.0)
2.  **Node.js:** (Versión 18+ recomendada) [Descargar aquí](https://nodejs.org/)
3.  **SQL Server:** Una instancia local de SQL Server (Express, Developer, etc.).
4.  **Git:** Para clonar el repositorio.

### **1. Clonar el Repositorio**

```bash
git clone https://repo.eldiaservicios.com/dmolinari/Elecciones-2025.git
cd Elecciones-2025
```

### **2. Configurar los Secretos del Backend**

Utilizaremos la herramienta `user-secrets` de .NET para gestionar las credenciales de forma segura en el entorno de desarrollo.

**Para el Proyecto API (`Elecciones.Api`):**
```bash
# Navega a la carpeta del proyecto
cd Elecciones-Web/src/Elecciones.Api

# Inicializa los secretos de usuario
dotnet user-secrets init

# Añade los secretos necesarios
dotnet user-secrets set "ConnectionStrings:DefaultConnection" "Server=localhost;Database=Elecciones2025;User Id=sa;Password=TU_PASSWORD_DE_BD;TrustServerCertificate=True;"
dotnet user-secrets set "ElectoralApi:Username" "TU_USUARIO_ELECTORAL"
dotnet user-secrets set "ElectoralApi:Password" "TU_PASSWORD_ELECTORAL"
dotnet user-secrets set "AllowedOrigins" "http://localhost:5173,http://localhost:8600"
```

**Para el Proyecto Worker (`Elecciones.Worker`):**
```bash
# Navega a la carpeta del proyecto
cd ../Elecciones.Worker

# Inicializa los secretos de usuario
dotnet user-secrets init

# Añade los secretos necesarios
dotnet user-secrets set "ConnectionStrings:DefaultConnection" "Server=localhost;Database=Elecciones2025;User Id=sa;Password=TU_PASSWORD_DE_BD;TrustServerCertificate=True;"
dotnet user-secrets set "ElectoralApi:Username" "TU_USUARIO_ELECTORAL"
dotnet user-secrets set "ElectoralApi:Password" "TU_PASSWORD_ELECTORAL"
```
> **Nota:** Reemplaza los valores `TU_...` con tus credenciales reales.

### **3. Crear y Poblar la Base de Datos**

Desde la carpeta `src` (`Elecciones-Web/src/`), ejecuta los siguientes comandos de Entity Framework:
```bash
# Instala la herramienta de EF Core si no la tienes
dotnet tool install --global dotnet-ef

# Crea la base de datos y aplica las migraciones
dotnet ef database update --startup-project Elecciones.Api
```

### **4. Ejecutar la Aplicación**

Necesitarás **3 terminales separadas**:

*   **Terminal 1: Iniciar el Worker**
    ```bash
    # Desde Elecciones-Web/src/Elecciones.Worker
    dotnet run
    ```
    *El worker comenzará a poblar la base de datos con datos simulados.*

*   **Terminal 2: Iniciar la API**
    ```bash
    # Desde Elecciones-Web/src/Elecciones.Api
    dotnet run
    ```
    *La API se iniciará y estará lista para servir los datos. Fíjate en la URL (ej. `https://localhost:7123`).*

*   **Terminal 3: Iniciar el Frontend**
    ```bash
    # Desde Elecciones-Web/frontend
    npm install
    npm run dev
    ```
    *El servidor de desarrollo de Vite se iniciará. Abre tu navegador en la URL que te indique (ej. `http://localhost:5173`).*

¡Y listo! Deberías ver la aplicación funcionando en tu navegador, con datos que se actualizan en tiempo real.

---

## 📦 Despliegue en Producción (con Docker)**

El despliegue en el servidor de producción está diseñado para ser simple y robusto gracias a Docker.

### **1. Configurar el Fichero de Entorno**

En el servidor de producción, crea el fichero `/opt/elecciones-app/.env` (o la ruta que prefieras) con el contenido del fichero `.env` del repositorio, asegurándote de:
*   Usar la cadena de conexión a la base de datos de producción (apuntando al nombre del servicio Docker de la BD, si aplica).
*   Establecer `ASPNETCORE_ENVIRONMENT="Production"`.

### **2. Construir y Ejecutar los Contenedores**

Desde la raíz del proyecto en el servidor, donde se encuentra el `docker-compose.yml`:
```bash
# Construye las imágenes y levanta los servicios en segundo plano
docker-compose up --build -d
```
El proxy Nginx expondrá la aplicación en el puerto `8600` (o el que se configure en `docker-compose.yml`), y se encargará de dirigir el tráfico a la API y al frontend.

---

## 📂 Estructura del Repositorio

```
.
├── Elecciones-Web/         # Contenedor principal del código fuente
│   ├── src/
│   │   ├── Elecciones.Api/       # Proyecto de la API REST
│   │   ├── Elecciones.Core/      # Lógica de negocio, DTOs y entidades
│   │   ├── Elecciones.Database/  # DbContext y migraciones
│   │   ├── Elecciones.Infrastructure/ # Servicios, acceso a APIs externas
│   │   └── Elecciones.Worker/    # Servicio de ingesta de datos
│   └── frontend/             # Aplicación de React
├── proxy/
│   └── nginx.conf          # Configuración del proxy inverso Nginx
├── .env.example            # Ejemplo del fichero de entorno (sin secretos)
├── .gitignore
├── docker-compose.yml      # Orquestación de los contenedores
└── README.md               # Este fichero
```