Actualizar server.js
This commit is contained in:
43
server.js
43
server.js
@@ -317,12 +317,12 @@ async function autoUpdateDB() {
|
|||||||
ALTER TABLE scraped_services ADD COLUMN last_chat_read_worker TIMESTAMP DEFAULT '2000-01-01';
|
ALTER TABLE scraped_services ADD COLUMN last_chat_read_worker TIMESTAMP DEFAULT '2000-01-01';
|
||||||
END IF;
|
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
|
-- 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
|
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;
|
ALTER TABLE clients ADD COLUMN portal_token TEXT UNIQUE;
|
||||||
@@ -1773,17 +1773,38 @@ async function triggerWhatsAppEvent(ownerId, serviceId, eventType) {
|
|||||||
// ==========================================
|
// ==========================================
|
||||||
// 🔐 CREDENCIALES DE PROVEEDORES
|
// 🔐 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) => {
|
app.post("/providers/credentials", authMiddleware, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const { provider, username, password } = req.body;
|
const { provider, username, password, auto_dispatch } = req.body;
|
||||||
const passwordSafe = Buffer.from(password).toString('base64');
|
const passwordSafe = password ? Buffer.from(password).toString('base64') : null;
|
||||||
|
|
||||||
|
// Convertimos a booleano por seguridad
|
||||||
|
const autoDispatchBool = auto_dispatch === true;
|
||||||
|
|
||||||
await pool.query(`
|
await pool.query(`
|
||||||
INSERT INTO provider_credentials (owner_id, provider, username, password_hash)
|
INSERT INTO provider_credentials (owner_id, provider, username, password_hash, auto_dispatch)
|
||||||
VALUES ($1, $2, $3, $4)
|
VALUES ($1, $2, $3, $4, $5)
|
||||||
ON CONFLICT (owner_id, provider) DO UPDATE SET username = EXCLUDED.username, password_hash = EXCLUDED.password_hash, status = 'active'
|
ON CONFLICT (owner_id, provider) DO UPDATE SET
|
||||||
`, [req.user.accountId, provider, username, passwordSafe]);
|
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 });
|
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 });
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// ==========================================
|
// ==========================================
|
||||||
|
|||||||
Reference in New Issue
Block a user