Actualizar server.js
This commit is contained in:
58
server.js
58
server.js
@@ -29,7 +29,7 @@ const pool = new Pool({
|
|||||||
});
|
});
|
||||||
|
|
||||||
// ==========================================
|
// ==========================================
|
||||||
// 🧠 AUTO-ACTUALIZACIÓN DB (REPARADOR POTENTE)
|
// 🧠 AUTO-ACTUALIZACIÓN DB (REPARADOR FINAL)
|
||||||
// ==========================================
|
// ==========================================
|
||||||
async function autoUpdateDB() {
|
async function autoUpdateDB() {
|
||||||
const client = await pool.connect();
|
const client = await pool.connect();
|
||||||
@@ -143,30 +143,41 @@ async function autoUpdateDB() {
|
|||||||
);
|
);
|
||||||
`);
|
`);
|
||||||
|
|
||||||
// 2. PARCHE DE REPARACIÓN (AQUÍ ES DONDE SE ARREGLA TU ERROR)
|
// 2. PARCHE DE REPARACIÓN (SOLUCIÓN ERRORES COLUMNAS)
|
||||||
// Este bloque verifica columna por columna. Si falta alguna en tu tabla vieja, la añade.
|
|
||||||
await client.query(`
|
await client.query(`
|
||||||
DO $$
|
DO $$
|
||||||
BEGIN
|
BEGIN
|
||||||
-- 1. Client ID
|
-- REPARACIÓN DE COLUMNAS FALTANTES EN SERVICES
|
||||||
|
|
||||||
|
-- Email (El error actual)
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='email') THEN
|
||||||
|
ALTER TABLE services ADD COLUMN email TEXT;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Address y Description (Por seguridad)
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='address') THEN
|
||||||
|
ALTER TABLE services ADD COLUMN address TEXT;
|
||||||
|
END IF;
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='description') THEN
|
||||||
|
ALTER TABLE services ADD COLUMN description TEXT;
|
||||||
|
END IF;
|
||||||
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='title') THEN
|
||||||
|
ALTER TABLE services ADD COLUMN title TEXT;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Resto de columnas (IDs, Fechas, Contacto)
|
||||||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='client_id') THEN
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='client_id') THEN
|
||||||
ALTER TABLE services ADD COLUMN client_id INT REFERENCES clients(id) ON DELETE SET NULL;
|
ALTER TABLE services ADD COLUMN client_id INT REFERENCES clients(id) ON DELETE SET NULL;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
-- 2. Status ID
|
|
||||||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='status_id') THEN
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='status_id') THEN
|
||||||
ALTER TABLE services ADD COLUMN status_id INT REFERENCES service_statuses(id) ON DELETE SET NULL;
|
ALTER TABLE services ADD COLUMN status_id INT REFERENCES service_statuses(id) ON DELETE SET NULL;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
-- 3. Contact Info
|
|
||||||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='contact_phone') THEN
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='contact_phone') THEN
|
||||||
ALTER TABLE services ADD COLUMN contact_phone TEXT;
|
ALTER TABLE services ADD COLUMN contact_phone TEXT;
|
||||||
END IF;
|
END IF;
|
||||||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='contact_name') THEN
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='contact_name') THEN
|
||||||
ALTER TABLE services ADD COLUMN contact_name TEXT;
|
ALTER TABLE services ADD COLUMN contact_name TEXT;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
-- 4. Fechas y Tiempos
|
|
||||||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='scheduled_date') THEN
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='scheduled_date') THEN
|
||||||
ALTER TABLE services ADD COLUMN scheduled_date DATE DEFAULT CURRENT_DATE;
|
ALTER TABLE services ADD COLUMN scheduled_date DATE DEFAULT CURRENT_DATE;
|
||||||
END IF;
|
END IF;
|
||||||
@@ -176,8 +187,6 @@ async function autoUpdateDB() {
|
|||||||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='duration_minutes') THEN
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='duration_minutes') THEN
|
||||||
ALTER TABLE services ADD COLUMN duration_minutes INT DEFAULT 30;
|
ALTER TABLE services ADD COLUMN duration_minutes INT DEFAULT 30;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
-- 5. Compañía
|
|
||||||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='company_id') THEN
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='company_id') THEN
|
||||||
ALTER TABLE services ADD COLUMN company_id INT REFERENCES companies(id) ON DELETE SET NULL;
|
ALTER TABLE services ADD COLUMN company_id INT REFERENCES companies(id) ON DELETE SET NULL;
|
||||||
END IF;
|
END IF;
|
||||||
@@ -187,8 +196,6 @@ async function autoUpdateDB() {
|
|||||||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='company_ref') THEN
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='company_ref') THEN
|
||||||
ALTER TABLE services ADD COLUMN company_ref TEXT;
|
ALTER TABLE services ADD COLUMN company_ref TEXT;
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
-- 6. Notas y otros
|
|
||||||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='internal_notes') THEN
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='services' AND column_name='internal_notes') THEN
|
||||||
ALTER TABLE services ADD COLUMN internal_notes TEXT;
|
ALTER TABLE services ADD COLUMN internal_notes TEXT;
|
||||||
END IF;
|
END IF;
|
||||||
@@ -205,7 +212,7 @@ async function autoUpdateDB() {
|
|||||||
END $$;
|
END $$;
|
||||||
`);
|
`);
|
||||||
|
|
||||||
console.log("✅ DB Sincronizada y Reparada.");
|
console.log("✅ DB Sincronizada y Reparada (Email incluido).");
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("❌ Error DB:", e);
|
console.error("❌ Error DB:", e);
|
||||||
} finally {
|
} finally {
|
||||||
@@ -377,7 +384,26 @@ app.post("/admin/users", authMiddleware, async (req, res) => {
|
|||||||
await client.query('COMMIT'); res.json({ ok: true });
|
await client.query('COMMIT'); res.json({ ok: true });
|
||||||
} catch (e) { await client.query('ROLLBACK'); res.status(500).json({ ok: false }); } finally { client.release(); }
|
} catch (e) { await client.query('ROLLBACK'); res.status(500).json({ ok: false }); } finally { client.release(); }
|
||||||
});
|
});
|
||||||
app.put("/admin/users/:id", authMiddleware, async (req, res) => { /* Update user logic... */ res.json({ok:true}); }); // Simplificado para brevedad, mantener el original si lo necesitas completo
|
app.put("/admin/users/:id", authMiddleware, async (req, res) => {
|
||||||
|
const client = await pool.connect();
|
||||||
|
try {
|
||||||
|
const userId = req.params.id;
|
||||||
|
const { fullName, email, phone, role, guilds, password } = req.body;
|
||||||
|
const p = normalizePhone(phone);
|
||||||
|
await client.query('BEGIN');
|
||||||
|
if(password) {
|
||||||
|
const hash = await bcrypt.hash(password, 10);
|
||||||
|
await client.query("UPDATE users SET full_name=$1, email=$2, phone=$3, role=$4, password_hash=$5 WHERE id=$6", [fullName, email, p, role, hash, userId]);
|
||||||
|
} else {
|
||||||
|
await client.query("UPDATE users SET full_name=$1, email=$2, phone=$3, role=$4 WHERE id=$5", [fullName, email, p, role, userId]);
|
||||||
|
}
|
||||||
|
if (guilds && Array.isArray(guilds)) {
|
||||||
|
await client.query("DELETE FROM user_guilds WHERE user_id=$1", [userId]);
|
||||||
|
for (const gid of guilds) await client.query("INSERT INTO user_guilds (user_id, guild_id) VALUES ($1, $2)", [userId, gid]);
|
||||||
|
}
|
||||||
|
await client.query('COMMIT'); res.json({ ok: true });
|
||||||
|
} catch (e) { await client.query('ROLLBACK'); res.status(500).json({ ok: false }); } finally { client.release(); }
|
||||||
|
});
|
||||||
app.delete("/admin/users/:id", authMiddleware, async (req, res) => { try { await pool.query("DELETE FROM users WHERE id=$1 AND owner_id=$2", [req.params.id, req.user.accountId]); res.json({ ok: true }); } catch (e) { res.status(500).json({ ok: false }); } });
|
app.delete("/admin/users/:id", authMiddleware, async (req, res) => { try { await pool.query("DELETE FROM users WHERE id=$1 AND owner_id=$2", [req.params.id, req.user.accountId]); res.json({ ok: true }); } catch (e) { res.status(500).json({ ok: false }); } });
|
||||||
|
|
||||||
const port = process.env.PORT || 3000;
|
const port = process.env.PORT || 3000;
|
||||||
|
|||||||
Reference in New Issue
Block a user