diff --git a/Elecciones-Web/frontend/public/bootstrap.js b/Elecciones-Web/frontend/public/bootstrap.js index 73609b1..3fbbc41 100644 --- a/Elecciones-Web/frontend/public/bootstrap.js +++ b/Elecciones-Web/frontend/public/bootstrap.js @@ -1,8 +1,9 @@ -// public/bootstrap.js (function() { - // --- CONFIGURACIÓN --- - // Cambie esto por el dominio final en producción - const WIDGETS_HOST = 'https://elecciones2025.eldia.com'; + // --- LÓGICA DE DETECCIÓN AUTOMÁTICA DE LA RUTA BASE --- + // document.currentScript.src nos da la URL completa del propio script bootstrap.js + const scriptUrl = new URL(document.currentScript.src); + // La ruta base es el origen (ej. 'https://elecciones2025.eldia.com') + const WIDGETS_HOST = scriptUrl.origin; // --- FUNCIONES AUXILIARES (sin cambios) --- function loadScript(src) { @@ -26,21 +27,23 @@ // --- LÓGICA PRINCIPAL --- async function initWidgets() { try { - // 1. Obtener el manifest.json + // 1. Obtener el manifest.json desde la ruta base detectada const response = await fetch(`${WIDGETS_HOST}/manifest.json`); - if (!response.ok) throw new Error('No se pudo cargar el manifest.'); + if (!response.ok) { + throw new Error('No se pudo cargar el manifest de los widgets. (404 Not Found)'); + } const manifest = await response.json(); - // 2. Encontrar el punto de entrada principal (nuestro main.tsx) - // En modo 'lib', la entrada es el propio archivo de entrada. - const entryKey = 'src/main.tsx'; - const entry = manifest[entryKey]; - - if (!entry) throw new Error('No se encontró el punto de entrada en el manifest.'); + // 2. Encontrar el punto de entrada principal + const entryKey = Object.keys(manifest).find(key => manifest[key].isEntry); + if (!entryKey) { + throw new Error('No se encontró el punto de entrada en el manifest.'); + } + const entry = manifest[entryKey]; const jsUrl = `${WIDGETS_HOST}/${entry.file}`; - // 3. Cargar el CSS asociado, si existe + // 3. Cargar el CSS if (entry.css && entry.css.length > 0) { entry.css.forEach(cssFile => { const cssUrl = `${WIDGETS_HOST}/${cssFile}`; @@ -48,14 +51,13 @@ }); } - // 4. Cargar el script principal de la librería + // 4. Cargar el JS principal await loadScript(jsUrl); - - // 5. Esperar a que la página esté completamente cargada - // y luego llamar a la función de renderizado. + + // 5. El addEventListener ya no es necesario aquí, el consumidor lo añade. + // Si quiere que sea totalmente automático, puede añadirlo: window.addEventListener('load', function () { if (window.EleccionesWidgets && typeof window.EleccionesWidgets.render === 'function') { - console.log('Elecciones Widgets listos. Renderizando...'); window.EleccionesWidgets.render(); } }); @@ -65,7 +67,6 @@ } } - // Iniciar el proceso initWidgets(); })(); \ No newline at end of file diff --git a/proxy/nginx.conf b/proxy/nginx.conf index 907acbb..6ebbfef 100644 --- a/proxy/nginx.conf +++ b/proxy/nginx.conf @@ -1,5 +1,17 @@ # ./proxy/nginx.conf +# --- MAPA DE ORÍGENES PERMITIDOS --- +# Este bloque debe estar fuera de los bloques 'server'. +# Comprueba la cabecera 'Origin' de la petición ($http_origin) y, si coincide, +# establece la variable $cors_origin con ese valor. Si no, queda vacía. +map $http_origin $cors_origin { + default ''; + 'https://www.eldia.com' $http_origin; + 'https://extras.eldia.com' $http_origin; + 'http://localhost:5173' $http_origin; # Para desarrollo local + # Añada aquí cualquier otro dominio de desarrollo si es necesario +} + # --- Upstreams (Definiciones de nuestros servicios) --- upstream backend_api { server elecciones-api:8080; @@ -26,13 +38,12 @@ server { # --- RUTA PARA EL FRONTEND PÚBLICO --- location / { - # ¡CRUCIAL! Permite que los widgets se incrusten en otros sitios. - # Esto es más seguro que un '*' genérico. - add_header 'Access-Control-Allow-Origin' 'https://www.eldia.com, https://extras.eldia.com, http://localhost:5173' always; - + # Añadimos la cabecera usando la variable que definimos en el mapa. + add_header 'Access-Control-Allow-Origin' $cors_origin always; + add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always; + if ($request_method = 'OPTIONS') { - add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS'; - add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; return 204; }