From 78ed90286e328169b5ef896214bb2c6e40f6e689 Mon Sep 17 00:00:00 2001 From: marsalva Date: Sat, 28 Feb 2026 20:23:06 +0000 Subject: [PATCH] Actualizar server.js --- server.js | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/server.js b/server.js index 8d8649f..f37252c 100644 --- a/server.js +++ b/server.js @@ -1979,6 +1979,52 @@ app.post("/public/assignment/:token/reject", async (req, res) => { } }); + +// ========================================== +// 📖 MOTOR DE TRAZABILIDAD (LOGS) +// ========================================== +// Creamos la tabla automáticamente si no existe +pool.query(` + CREATE TABLE IF NOT EXISTS scraped_service_logs ( + id SERIAL PRIMARY KEY, + scraped_id INT REFERENCES scraped_services(id) ON DELETE CASCADE, + user_name TEXT, + action TEXT NOT NULL, + details TEXT, + created_at TIMESTAMP DEFAULT NOW() + ); +`).catch(console.error); + +// Ruta para GUARDAR un evento en el log +app.post("/services/:id/log", authMiddleware, async (req, res) => { + try { + const { action, details } = req.body; + // Buscamos el nombre de quien hace la acción + const userQ = await pool.query("SELECT full_name FROM users WHERE id=$1", [req.user.sub]); + const userName = userQ.rows[0]?.full_name || "Sistema"; + + await pool.query( + "INSERT INTO scraped_service_logs (scraped_id, user_name, action, details) VALUES ($1, $2, $3, $4)", + [req.params.id, userName, action, details || ""] + ); + res.json({ ok: true }); + } catch(e) { + console.error("Error Log:", e); + res.status(500).json({ ok: false }); + } +}); + +// Ruta para LEER el historial de un servicio +app.get("/services/:id/logs", authMiddleware, async (req, res) => { + try { + const q = await pool.query( + "SELECT * FROM scraped_service_logs WHERE scraped_id = $1 ORDER BY created_at DESC", + [req.params.id] + ); + res.json({ ok: true, logs: q.rows }); + } catch(e) { res.status(500).json({ ok: false }); } +}); + // ========================================== // 🕒 EL RELOJ DEL SISTEMA (Ejecutar cada minuto) // ==========================================