Actualizar server.js

This commit is contained in:
2026-05-17 21:03:28 +00:00
parent fc9945ad32
commit 2583b5b69c

View File

@@ -3784,20 +3784,13 @@ app.put("/admin/users/:id", authMiddleware, async (req, res) => { const client =
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 }); } });
// ========================================== // ==========================================
// 🏢 CONFIGURACIÓN EMPRESA (COLORES, LOGO, PORTAL) // 🏢 CONFIGURACIÓN EMPRESA (COLORES, LOGO, PUBLICIDAD, PORTAL)
// ========================================== // ==========================================
app.get("/config/company", authMiddleware, async (req, res) => {
try {
// 🔎 AÑADIMOS 'billing_settings' A LA CONSULTA
const q = await pool.query("SELECT company_slug, full_name, plan_tier, company_logo, portal_settings, app_settings, billing_settings FROM users WHERE id=$1", [req.user.accountId]);
res.json({ ok: true, config: q.rows[0] || {} });
} catch (e) { res.status(500).json({ ok: false }); }
});
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 {
const { slug, company_name, company_logo, portal_settings, app_settings, billing_settings } = req.body; const { slug, company_name, company_logo, company_ad, portal_settings, app_settings, billing_settings } = req.body;
// 1. Manejo del Slug (Enlace) // 1. Manejo del Slug (Enlace)
let cleanSlug = null; let cleanSlug = null;
@@ -3807,8 +3800,9 @@ app.post("/config/company", authMiddleware, async (req, res) => {
if (check.rowCount > 0) return res.status(400).json({ ok: false, error: "Enlace en uso" }); if (check.rowCount > 0) return res.status(400).json({ ok: false, error: "Enlace en uso" });
} }
// 2. Asegurar que existe la columna de facturación // 2. Asegurar que existe la columna de facturación y publicidad
await client.query(`ALTER TABLE users ADD COLUMN IF NOT EXISTS billing_settings JSONB DEFAULT '{}'`); await client.query(`ALTER TABLE users ADD COLUMN IF NOT EXISTS billing_settings JSONB DEFAULT '{}'`);
await client.query(`ALTER TABLE users ADD COLUMN IF NOT EXISTS company_ad TEXT`);
// 3. UPDATE Inteligente: Solo cambia lo que le enviamos, el resto lo deja como está // 3. UPDATE Inteligente: Solo cambia lo que le enviamos, el resto lo deja como está
await client.query(` await client.query(`
@@ -3816,14 +3810,16 @@ app.post("/config/company", authMiddleware, async (req, res) => {
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(portal_settings, '{}'::jsonb) || COALESCE($4, '{}'::jsonb), company_ad = COALESCE($4, company_ad),
app_settings = COALESCE(app_settings, '{}'::jsonb) || COALESCE($5, '{}'::jsonb), portal_settings = COALESCE(portal_settings, '{}'::jsonb) || COALESCE($5, '{}'::jsonb),
billing_settings = COALESCE(billing_settings, '{}'::jsonb) || COALESCE($6, '{}'::jsonb) app_settings = COALESCE(app_settings, '{}'::jsonb) || COALESCE($6, '{}'::jsonb),
WHERE id = $7 billing_settings = COALESCE(billing_settings, '{}'::jsonb) || COALESCE($7, '{}'::jsonb)
WHERE id = $8
`, [ `, [
cleanSlug, cleanSlug,
company_name ?? null, company_name ?? null,
company_logo ?? null, company_logo ?? null,
company_ad ?? null,
portal_settings ? JSON.stringify(portal_settings) : null, portal_settings ? JSON.stringify(portal_settings) : null,
app_settings ? JSON.stringify(app_settings) : null, app_settings ? JSON.stringify(app_settings) : null,
billing_settings ? JSON.stringify(billing_settings) : null, billing_settings ? JSON.stringify(billing_settings) : null,
@@ -3839,11 +3835,9 @@ app.post("/config/company", authMiddleware, async (req, res) => {
app.get("/config/company", authMiddleware, async (req, res) => { app.get("/config/company", authMiddleware, async (req, res) => {
try { try {
// 4. Modificamos también el GET para que devuelva los datos de facturación al Frontend const q = await pool.query("SELECT company_slug, full_name, plan_tier, company_logo, company_ad, portal_settings, app_settings, billing_settings FROM users WHERE id=$1", [req.user.accountId]);
const q = await pool.query("SELECT company_slug, full_name, plan_tier, company_logo, portal_settings, app_settings, billing_settings FROM users WHERE id=$1", [req.user.accountId]);
res.json({ ok: true, config: q.rows[0] || {} }); res.json({ ok: true, config: q.rows[0] || {} });
} catch (e) { } catch (e) {
// Si falla porque la columna aún no se ha creado (el usuario nunca ha guardado), devolvemos el resto normal
try { try {
const fallback = await pool.query("SELECT company_slug, full_name, plan_tier, company_logo, portal_settings, app_settings FROM users WHERE id=$1", [req.user.accountId]); const fallback = await pool.query("SELECT company_slug, full_name, plan_tier, company_logo, portal_settings, app_settings FROM users WHERE id=$1", [req.user.accountId]);
res.json({ ok: true, config: fallback.rows[0] || {} }); res.json({ ok: true, config: fallback.rows[0] || {} });