Actualizar server.js

This commit is contained in:
2026-03-23 22:10:23 +00:00
parent 110a92cf0b
commit 09305a8b6c

View File

@@ -2825,53 +2825,44 @@ app.get("/config/company", authMiddleware, async (req, res) => {
app.post("/config/company", authMiddleware, async (req, res) => { app.post("/config/company", authMiddleware, async (req, res) => {
const client = await pool.connect(); const client = await pool.connect();
try { try {
// 1. Recogemos el nuevo objeto billing_settings
const { slug, company_name, company_logo, portal_settings, app_settings, billing_settings } = req.body; const { slug, company_name, company_logo, portal_settings, app_settings, billing_settings } = req.body;
// 1. Manejo del Slug (Enlace)
let cleanSlug = null; let cleanSlug = null;
if (slug) { if (slug) {
cleanSlug = slug.toLowerCase().replace(/[^a-z0-9-]/g, ""); cleanSlug = slug.toLowerCase().replace(/[^a-z0-9-]/g, "");
if (cleanSlug !== slug) return res.status(400).json({ ok: false, error: "El enlace solo puede contener letras minúsculas, números y guiones" });
const check = await client.query("SELECT id FROM users WHERE company_slug=$1 AND id != $2", [cleanSlug, req.user.accountId]); const check = await client.query("SELECT id FROM users WHERE company_slug=$1 AND id != $2", [cleanSlug, req.user.accountId]);
if (check.rowCount > 0) return res.status(400).json({ ok: false, error: "Ese enlace ya está en uso por otra empresa" }); if (check.rowCount > 0) return res.status(400).json({ ok: false, error: "Enlace en uso" });
} }
// 2. Magia Blanca: Creamos la columna billing_settings "al vuelo" si no existía // 2. Asegurar que existe la columna de facturación
await client.query(` await client.query(`ALTER TABLE users ADD COLUMN IF NOT EXISTS billing_settings JSONB DEFAULT '{}'`);
DO $$ BEGIN
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='users' AND column_name='billing_settings') THEN
ALTER TABLE users ADD COLUMN billing_settings JSONB DEFAULT '{}';
END IF;
END $$;
`);
// 3. Guardamos todo (Añadiendo ?? null para evitar que explote la base de datos) // 3. UPDATE Inteligente: Solo cambia lo que le enviamos, el resto lo deja como está
await client.query(` await client.query(`
UPDATE users UPDATE users
SET company_slug = COALESCE($1, company_slug), SET company_slug = COALESCE($1, company_slug),
full_name = COALESCE($2, full_name), full_name = COALESCE($2, full_name),
company_logo = COALESCE($3, company_logo), company_logo = COALESCE($3, company_logo),
portal_settings = COALESCE($4, portal_settings), portal_settings = COALESCE(portal_settings, '{}'::jsonb) || COALESCE($4, '{}'::jsonb),
app_settings = COALESCE($5, app_settings), app_settings = COALESCE(app_settings, '{}'::jsonb) || COALESCE($5, '{}'::jsonb),
billing_settings = COALESCE($6, billing_settings) billing_settings = COALESCE(billing_settings, '{}'::jsonb) || COALESCE($6, '{}'::jsonb)
WHERE id = $7 WHERE id = $7
`, [ `, [
cleanSlug, cleanSlug,
company_name ?? null, company_name ?? null,
company_logo ?? null, company_logo ?? null,
portal_settings ?? null, portal_settings ? JSON.stringify(portal_settings) : null,
app_settings ?? null, app_settings ? JSON.stringify(app_settings) : null,
billing_settings ?? null, billing_settings ? JSON.stringify(billing_settings) : null,
req.user.accountId req.user.accountId
]); ]);
res.json({ ok: true }); res.json({ ok: true });
} catch (e) { } catch (e) {
console.error("Error en config/company:", e); console.error("Error guardando config:", e);
res.status(500).json({ ok: false, error: "Error interno" }); res.status(500).json({ ok: false });
} finally { } finally { client.release(); }
client.release();
}
}); });
app.get("/config/company", authMiddleware, async (req, res) => { app.get("/config/company", authMiddleware, async (req, res) => {