From 09305a8b6c8db59e68ca9b921fd114ea7ff24410 Mon Sep 17 00:00:00 2001 From: marsalva Date: Mon, 23 Mar 2026 22:10:23 +0000 Subject: [PATCH] Actualizar server.js --- server.js | 37 ++++++++++++++----------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/server.js b/server.js index 4633342..5c3dc07 100644 --- a/server.js +++ b/server.js @@ -2825,53 +2825,44 @@ app.get("/config/company", authMiddleware, async (req, res) => { app.post("/config/company", authMiddleware, async (req, res) => { const client = await pool.connect(); try { - // 1. Recogemos el nuevo objeto billing_settings const { slug, company_name, company_logo, portal_settings, app_settings, billing_settings } = req.body; + // 1. Manejo del Slug (Enlace) let cleanSlug = null; if (slug) { 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]); - 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 - await client.query(` - 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 $$; - `); + // 2. Asegurar que existe la columna de facturación + await client.query(`ALTER TABLE users ADD COLUMN IF NOT EXISTS billing_settings JSONB DEFAULT '{}'`); - // 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(` UPDATE users SET company_slug = COALESCE($1, company_slug), full_name = COALESCE($2, full_name), company_logo = COALESCE($3, company_logo), - portal_settings = COALESCE($4, portal_settings), - app_settings = COALESCE($5, app_settings), - billing_settings = COALESCE($6, billing_settings) + portal_settings = COALESCE(portal_settings, '{}'::jsonb) || COALESCE($4, '{}'::jsonb), + app_settings = COALESCE(app_settings, '{}'::jsonb) || COALESCE($5, '{}'::jsonb), + billing_settings = COALESCE(billing_settings, '{}'::jsonb) || COALESCE($6, '{}'::jsonb) WHERE id = $7 `, [ cleanSlug, company_name ?? null, company_logo ?? null, - portal_settings ?? null, - app_settings ?? null, - billing_settings ?? null, + portal_settings ? JSON.stringify(portal_settings) : null, + app_settings ? JSON.stringify(app_settings) : null, + billing_settings ? JSON.stringify(billing_settings) : null, req.user.accountId ]); res.json({ ok: true }); } catch (e) { - console.error("Error en config/company:", e); - res.status(500).json({ ok: false, error: "Error interno" }); - } finally { - client.release(); - } + console.error("❌ Error guardando config:", e); + res.status(500).json({ ok: false }); + } finally { client.release(); } }); app.get("/config/company", authMiddleware, async (req, res) => {