From f602bb0bb9fb0f987ffdfd70f2daa3240e37813d Mon Sep 17 00:00:00 2001 From: marsalva Date: Sat, 14 Mar 2026 17:52:33 +0000 Subject: [PATCH] Actualizar server.js --- server.js | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/server.js b/server.js index 6ccde91..c13595e 100644 --- a/server.js +++ b/server.js @@ -317,12 +317,12 @@ async function autoUpdateDB() { ALTER TABLE scraped_services ADD COLUMN last_chat_read_worker TIMESTAMP DEFAULT '2000-01-01'; END IF; - -- AÑADIDO: Token mágico para el Portal del Cliente + -- AÑADIDO: Control de envíos automáticos de urgencias por proveedor + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='provider_credentials' AND column_name='auto_dispatch') THEN + ALTER TABLE provider_credentials ADD COLUMN auto_dispatch BOOLEAN DEFAULT FALSE; + END IF; - - -- AÑADIDO: Token mágico para el Portal del Cliente - -- AÑADIDO: Token mágico para el Portal del Cliente IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='clients' AND column_name='portal_token') THEN ALTER TABLE clients ADD COLUMN portal_token TEXT UNIQUE; @@ -1773,17 +1773,38 @@ async function triggerWhatsAppEvent(ownerId, serviceId, eventType) { // ========================================== // 🔐 CREDENCIALES DE PROVEEDORES // ========================================== +app.get("/providers/credentials", authMiddleware, async (req, res) => { + try { + const q = await pool.query("SELECT provider, username, last_sync, status, auto_dispatch FROM provider_credentials WHERE owner_id=$1", [req.user.accountId]); + res.json({ ok: true, credentials: q.rows }); + } catch (e) { + res.status(500).json({ ok: false }); + } +}); + app.post("/providers/credentials", authMiddleware, async (req, res) => { try { - const { provider, username, password } = req.body; - const passwordSafe = Buffer.from(password).toString('base64'); + const { provider, username, password, auto_dispatch } = req.body; + const passwordSafe = password ? Buffer.from(password).toString('base64') : null; + + // Convertimos a booleano por seguridad + const autoDispatchBool = auto_dispatch === true; + await pool.query(` - INSERT INTO provider_credentials (owner_id, provider, username, password_hash) - VALUES ($1, $2, $3, $4) - ON CONFLICT (owner_id, provider) DO UPDATE SET username = EXCLUDED.username, password_hash = EXCLUDED.password_hash, status = 'active' - `, [req.user.accountId, provider, username, passwordSafe]); + INSERT INTO provider_credentials (owner_id, provider, username, password_hash, auto_dispatch) + VALUES ($1, $2, $3, $4, $5) + ON CONFLICT (owner_id, provider) DO UPDATE SET + username = EXCLUDED.username, + password_hash = COALESCE($4, provider_credentials.password_hash), + auto_dispatch = EXCLUDED.auto_dispatch, + status = 'active' + `, [req.user.accountId, provider, username, passwordSafe, autoDispatchBool]); + res.json({ ok: true }); - } catch (e) { res.status(500).json({ ok: false }); } + } catch (e) { + console.error("Error guardando credenciales:", e); + res.status(500).json({ ok: false }); + } }); // ==========================================