216 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| // src/apiService.ts
 | |
| import axios from 'axios';
 | |
| import type { ApiResponseRankingMunicipio, ApiResponseRankingSeccion, ApiResponseTablaDetallada, ProyeccionBancas, MunicipioSimple, TelegramaData, CatalogoItem, CategoriaResumen, ResultadoTicker, ApiResponseResultadosPorSeccion } from './types/types';
 | |
| 
 | |
| /**
 | |
|  * URL base para las llamadas a la API.
 | |
|  * - En desarrollo, apunta directamente al backend de .NET.
 | |
|  * - En producción, apunta al endpoint público de la API.
 | |
|  */
 | |
| export const API_BASE_URL = import.meta.env.DEV
 | |
|   ? 'http://localhost:5217/api'
 | |
|   : 'https://elecciones2025.eldia.com/api';
 | |
| 
 | |
| /**
 | |
|  * URL base para los activos estáticos (imágenes, etc.) de la carpeta `public`.
 | |
|  * - En desarrollo, es una ruta relativa a la raíz (servida por Vite).
 | |
|  * - En producción, es la URL absoluta del dominio donde se alojan los widgets.
 | |
|  */
 | |
| export const assetBaseUrl = import.meta.env.DEV
 | |
|   ? ''
 | |
|   : 'https://elecciones2025.eldia.com';
 | |
| 
 | |
| const apiClient = axios.create({
 | |
|   baseURL: API_BASE_URL,
 | |
|   headers: { 'Content-Type': 'application/json' },
 | |
| });
 | |
| 
 | |
| interface PartidoData {
 | |
|   id: string;
 | |
|   nombre: string;
 | |
|   nombreCorto: string | null;
 | |
|   bancasTotales: number;
 | |
|   color: string | null;
 | |
| }
 | |
| 
 | |
| interface CamaraData {
 | |
|   camaraNombre: string;
 | |
|   totalBancas: number;
 | |
|   bancasEnJuego: number;
 | |
|   partidos: PartidoData[];
 | |
|   presidenteBancada: { color: string | null } | null;
 | |
| }
 | |
| 
 | |
| export interface ComposicionData {
 | |
|   diputados: CamaraData;
 | |
|   senadores: CamaraData;
 | |
| }
 | |
| 
 | |
| export interface OcupanteBanca {
 | |
|   id: number;
 | |
|   nombreOcupante: string;
 | |
|   fotoUrl: string | null;
 | |
|   periodo: string | null;
 | |
| }
 | |
| 
 | |
| interface PartidoData {
 | |
|   id: string;
 | |
|   nombre: string;
 | |
|   nombreCorto: string | null;
 | |
|   bancasTotales: number;
 | |
|   color: string | null;
 | |
|   ocupantes: OcupanteBanca[];
 | |
| }
 | |
| 
 | |
| export interface BancadaDetalle {
 | |
|   id: number; // Este es el ID de la Bancada
 | |
|   camara: number; // 0 o 1
 | |
|   numeroBanca: number;
 | |
|   agrupacionPoliticaId: string | null;
 | |
|   ocupante: OcupanteBanca | null;
 | |
| }
 | |
| 
 | |
| export interface ConfiguracionPublica {
 | |
|   TickerResultadosCantidad?: string;
 | |
|   ConcejalesResultadosCantidad?: string;
 | |
|   // ... otras claves públicas que pueda añadir en el futuro
 | |
| }
 | |
| 
 | |
| export interface ResultadoDetalleSeccion {
 | |
|   id: string; // ID de la agrupación para la key
 | |
|   nombre: string;
 | |
|   votos: number;
 | |
|   porcentaje: number;
 | |
|   color: string | null;
 | |
| }
 | |
| 
 | |
| export const getResumenProvincial = async (): Promise<CategoriaResumen[]> => {
 | |
|   const response = await apiClient.get('/resultados/provincia/02');
 | |
|   return response.data;
 | |
| };
 | |
| 
 | |
| export const getBancasPorSeccion = async (seccionId: string, camara: 'diputados' | 'senadores'): Promise<ProyeccionBancas> => {
 | |
|     const { data } = await apiClient.get(`/resultados/bancas-por-seccion/${seccionId}/${camara}`);
 | |
|     return data;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Obtiene la lista de Secciones Electorales desde la API.
 | |
|  */
 | |
| export const getSeccionesElectorales = async (categoriaId?: number): Promise<MunicipioSimple[]> => {
 | |
|   let url = '/catalogos/secciones-electorales';
 | |
|   // Si se proporciona una categoría, la añadimos a la URL
 | |
|   if (categoriaId) {
 | |
|     url += `?categoriaId=${categoriaId}`;
 | |
|   }
 | |
|   const response = await apiClient.get(url);
 | |
|   return response.data;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Obtiene los datos completos de un telegrama por su ID de mesa.
 | |
|  */
 | |
| export const getTelegramaPorId = async (mesaId: string): Promise<TelegramaData> => {
 | |
|   const response = await apiClient.get(`/telegramas/${mesaId}`);
 | |
|   return response.data;
 | |
| };
 | |
| 
 | |
| export const getSecciones = async (): Promise<CatalogoItem[]> => {
 | |
|   const response = await apiClient.get('/catalogos/secciones');
 | |
|   return response.data;
 | |
| };
 | |
| 
 | |
| export const getMunicipiosPorSeccion = async (seccionId: string): Promise<CatalogoItem[]> => {
 | |
|   const response = await apiClient.get(`/catalogos/municipios/${seccionId}`);
 | |
|   return response.data;
 | |
| };
 | |
| 
 | |
| export const getCircuitosPorMunicipio = async (municipioId: string): Promise<CatalogoItem[]> => {
 | |
|   const response = await apiClient.get(`/catalogos/circuitos/${municipioId}`);
 | |
|   return response.data;
 | |
| };
 | |
| 
 | |
| export const getEstablecimientosPorCircuito = async (circuitoId: string): Promise<CatalogoItem[]> => {
 | |
|   const response = await apiClient.get(`/catalogos/establecimientos/${circuitoId}`);
 | |
|   return response.data;
 | |
| };
 | |
| 
 | |
| export const getMesasPorEstablecimiento = async (establecimientoId: string): Promise<CatalogoItem[]> => {
 | |
|   const response = await apiClient.get(`/catalogos/mesas/${establecimientoId}`);
 | |
|   return response.data;
 | |
| };
 | |
| 
 | |
| export const getComposicionCongreso = async (): Promise<ComposicionData> => {
 | |
|   const response = await apiClient.get('/resultados/composicion-congreso');
 | |
|   return response.data;
 | |
| };
 | |
| 
 | |
| export const getBancadasDetalle = async (): Promise<BancadaDetalle[]> => {
 | |
|   const response = await apiClient.get('/resultados/bancadas-detalle');
 | |
|   return response.data;
 | |
| };
 | |
| 
 | |
| export const getConfiguracionPublica = async (): Promise<ConfiguracionPublica> => {
 | |
|   const response = await apiClient.get('/resultados/configuracion-publica');
 | |
|   return response.data;
 | |
| };
 | |
| 
 | |
| export const getResultadosPorSeccion = async (seccionId: string, categoriaId: number): Promise<ApiResponseResultadosPorSeccion> => {
 | |
|   const response = await apiClient.get(`/resultados/seccion-resultados/${seccionId}?categoriaId=${categoriaId}`);
 | |
|   return response.data;
 | |
| };
 | |
| 
 | |
| export const getDetalleSeccion = async (seccionId: string, categoriaId: number): Promise<ResultadoDetalleSeccion[]> => {
 | |
|   const response = await apiClient.get(`/resultados/seccion/${seccionId}?categoriaId=${categoriaId}`);
 | |
|   return response.data;
 | |
| };
 | |
| 
 | |
| export const getResultadosPorMunicipioYCategoria = async (municipioId: string, categoriaId: number): Promise<ResultadoTicker[]> => {
 | |
|   const response = await apiClient.get(`/resultados/partido/${municipioId}?categoriaId=${categoriaId}`);
 | |
|   return response.data.resultados;
 | |
| };
 | |
| 
 | |
| export const getResultadosPorMunicipio = async (municipioId: string, categoriaId: number): Promise<ResultadoTicker[]> => {
 | |
|   const response = await apiClient.get(`/resultados/partido/${municipioId}?categoriaId=${categoriaId}`);
 | |
|   // La respuesta es un objeto, nosotros extraemos el array de resultados
 | |
|   return response.data.resultados;
 | |
| };
 | |
| 
 | |
| export const getMunicipios = async (categoriaId?: number): Promise<MunicipioSimple[]> => {
 | |
|   let url = '/catalogos/municipios';
 | |
|   if (categoriaId) {
 | |
|     url += `?categoriaId=${categoriaId}`;
 | |
|   }
 | |
|   const response = await apiClient.get(url);
 | |
| 
 | |
|   // --- CORRECCIÓN ---
 | |
|   // La API devuelve un array de objetos con las propiedades { id, nombre }.
 | |
|   // Ya no es necesario mapear. Simplemente devolvemos los datos como vienen.
 | |
|   return response.data;
 | |
| };
 | |
| 
 | |
| export const getSeccionesElectoralesConCargos = async (): Promise<MunicipioSimple[]> => {
 | |
|   // Hacemos la petición al nuevo endpoint del backend
 | |
|   const { data } = await apiClient.get<MunicipioSimple[]>('/resultados/secciones-electorales-con-cargos');
 | |
|   return data;
 | |
| };
 | |
| 
 | |
| export const getResultadosTablaDetallada = async (seccionId: string): Promise<ApiResponseTablaDetallada> => {
 | |
|   const { data } = await apiClient.get(`/resultados/tabla-ranking-seccion/${seccionId}`);
 | |
|   return data;
 | |
| };
 | |
| 
 | |
| export const getRankingResultadosPorSeccion = async (seccionId: string): Promise<ApiResponseRankingSeccion> => {
 | |
|   const { data } = await apiClient.get(`/resultados/ranking-por-seccion/${seccionId}`);
 | |
|   return data;
 | |
| };
 | |
| 
 | |
| export const getRankingMunicipiosPorSeccion = async (seccionId: string): Promise<ApiResponseRankingMunicipio> => {
 | |
|   const { data } = await apiClient.get(`/resultados/ranking-municipios-por-seccion/${seccionId}`);
 | |
|   return data;
 | |
| };
 | |
| 
 | |
| export const getEstablecimientosPorMunicipio = async (municipioId: string): Promise<CatalogoItem[]> => {
 | |
|   const response = await apiClient.get(`/catalogos/establecimientos-por-municipio/${municipioId}`);
 | |
|   return response.data;
 | |
| }; |