// FLUJOS_APP.js ubicado en /var/www/flujos/FLUJOS/BACK_BACK/ require('dotenv').config(); // Cargar variables de entorno desde .env const express = require('express'); const path = require('path'); const bodyParser = require('body-parser'); const helmet = require('helmet'); const { MongoClient } = require('mongodb'); const app = express(); const port = process.env.PORT || 3000; // Configurar Helmet con CSP personalizado app.use( helmet.contentSecurityPolicy({ directives: { defaultSrc: ["'self'"], scriptSrc: [ "'self'", "'unsafe-inline'", 'https://unpkg.com', 'https://cdnjs.cloudflare.com', 'https://fonts.googleapis.com', 'https://fonts.gstatic.com', ], styleSrc: ["'self'", "'unsafe-inline'", 'https://fonts.googleapis.com'], imgSrc: ["'self'", 'data:'], connectSrc: ["'self'", 'ws://localhost:3000'], fontSrc: ["'self'", 'https://fonts.gstatic.com'], }, }) ); app.use(bodyParser.json()); // Configurar el directorio de archivos estáticos app.use(express.static(path.join(__dirname, '../VISUALIZACION/public'))); // Ruta para la página principal app.get('/', (req, res) => { res.sendFile(path.join(__dirname, '../VISUALIZACION/public/climate.html')); }); // Conexión a MongoDB usando variables de entorno const mongoUrl = process.env.MONGO_URL || 'mongodb://localhost:27017'; const dbName = process.env.DB_NAME || 'FLUJOS_DATOS'; const mongoClient = new MongoClient(mongoUrl, { useNewUrlParser: true, useUnifiedTopology: true }); // Endpoint para obtener datos de climate app.get('/api/climate-data', async (req, res) => { try { // Conectar a MongoDB await mongoClient.connect(); const db = mongoClient.db(dbName); // Acceder a las colecciones necesarias const noticiasCollection = db.collection('noticias'); const comparacionesCollection = db.collection('comparaciones'); // Obtener los parámetros de consulta del cliente (si los hay) const { subtematica, palabraClave, fechaInicio, fechaFin } = req.query; // Construir la consulta para obtener los nodos (noticias) const nodesQuery = { tema: 'cambio climático' }; if (subtematica) nodesQuery.subtema = subtematica; if (palabraClave) nodesQuery.contenido = { $regex: palabraClave, $options: 'i' }; if (fechaInicio && fechaFin) { nodesQuery.fecha = { $gte: new Date(fechaInicio), $lte: new Date(fechaFin) }; } // Ejecutar la consulta y obtener los resultados const nodesCursor = noticiasCollection.find(nodesQuery).limit(50); // Puedes ajustar el límite según tus necesidades const nodes = await nodesCursor.toArray(); // Construir la consulta para obtener los enlaces (comparaciones) const linksQuery = { porcentaje_similitud: { $gte: 5 } }; // Ajusta el valor según necesites const linksCursor = comparacionesCollection.find(linksQuery); const links = await linksCursor.toArray(); // Formatear los datos para enviarlos al cliente const formattedNodes = nodes.map(result => ({ id: result.archivo, group: result.tipo, tema: result.tema, content: result.contenido, fecha: result.fecha, })); const formattedLinks = links.map(result => ({ source: result.noticia1, target: result.noticia2, value: result.porcentaje_similitud, })); // Enviar los datos al cliente en formato JSON res.json({ nodes: formattedNodes, links: formattedLinks }); } catch (error) { console.error('Error al obtener datos:', error); res.status(500).json({ error: 'Error al obtener datos' }); } finally { // Cerrar la conexión a la base de datos await mongoClient.close(); } }); // Iniciar el servidor app.listen(port, () => { console.log(`La aplicación está escuchando en http://localhost:${port}`); });