Actualizar server.js

This commit is contained in:
2026-02-08 14:25:54 +00:00
parent c09855129e
commit 03d84513f2

View File

@@ -29,7 +29,7 @@ const pool = new Pool({
});
// ==========================================
// 🧠 AUTO-ACTUALIZACIÓN DB (REPARADOR POTENTE)
// 🧠 AUTO-ACTUALIZACIÓN DB (REPARADOR FINAL)
// ==========================================
async function autoUpdateDB() {
const client = await pool.connect();
@@ -143,30 +143,41 @@ async function autoUpdateDB() {
);
`);
// 2. PARCHE DE REPARACIÓN (AQUÍ ES DONDE SE ARREGLA TU ERROR)
// Este bloque verifica columna por columna. Si falta alguna en tu tabla vieja, la añade.
// 2. PARCHE DE REPARACIÓN (SOLUCIÓN ERRORES COLUMNAS)
await client.query(`
DO $$
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
ALTER TABLE services ADD COLUMN client_id INT REFERENCES clients(id) ON DELETE SET NULL;
END IF;
-- 2. Status ID
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;
END IF;
-- 3. Contact Info
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;
END IF;
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;
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
ALTER TABLE services ADD COLUMN scheduled_date DATE DEFAULT CURRENT_DATE;
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
ALTER TABLE services ADD COLUMN duration_minutes INT DEFAULT 30;
END IF;
-- 5. Compañía
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;
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
ALTER TABLE services ADD COLUMN company_ref TEXT;
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
ALTER TABLE services ADD COLUMN internal_notes TEXT;
END IF;
@@ -205,7 +212,7 @@ async function autoUpdateDB() {
END $$;
`);
console.log("✅ DB Sincronizada y Reparada.");
console.log("✅ DB Sincronizada y Reparada (Email incluido).");
} catch (e) {
console.error("❌ Error DB:", e);
} finally {
@@ -377,7 +384,26 @@ app.post("/admin/users", authMiddleware, async (req, res) => {
await client.query('COMMIT'); res.json({ ok: true });
} 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 }); } });
const port = process.env.PORT || 3000;