/** * Mueve la credencial de `platform/.env` a la base, cifrada, para un negocio * que ya estaba vinculado. * * Es de un solo uso por negocio: después, las credenciales se ponen desde la * consola de administración (`PUT /api/admin/businesses/:id/crm`). * * node scripts/run-tsx.mjs platform/scripts/crm-migrar-credencial.ts */ import { pool } from "../db/pool.ts"; import { crmRequest } from "../crm/client.ts"; import { ctxDe, ctxDesdeEnv, guardarCredencial } from "../crm/ctx.ts"; const businessId = Number(process.argv[2]); if (!Number.isFinite(businessId)) { console.error("Uso: node scripts/run-tsx.mjs platform/scripts/crm-migrar-credencial.ts "); process.exit(1); } const desdeEnv = ctxDesdeEnv(businessId); const { rows } = await pool.query(`SELECT id, name FROM businesses WHERE id = $1`, [businessId]); if (!rows[0]) { console.error(`No existe el negocio ${businessId}`); process.exit(1); } console.log(`Negocio ${businessId}: ${rows[0].name}`); // Se comprueba la credencial ANTES de guardarla, igual que hace la consola. const loc = await crmRequest("GET", `/locations/${desdeEnv.locationId}`, { token: desdeEnv.token, }); const nombre = loc?.location?.name ?? null; if (loc?.location?.id && loc.location.id !== desdeEnv.locationId) { console.error("El token pertenece a otra subcuenta distinta de CRM_LOCATION_ID"); process.exit(1); } console.log(`Subcuenta verificada: ${nombre} (${desdeEnv.locationId})`); await guardarCredencial(businessId, desdeEnv.locationId, desdeEnv.token, nombre ?? undefined); // No se acepta el guardado como prueba: se relee de la base, se descifra y se // USA contra el CRM. Es la única forma de saber que el ciclo entero funciona. const ctx = await ctxDe(businessId); const rel = await crmRequest("GET", `/locations/${ctx.locationId}`, { token: ctx.token }); if (rel?.location?.id === desdeEnv.locationId) { const { rows: f } = await pool.query( `SELECT token_fingerprint, label FROM crm_connections WHERE business_id = $1`, [businessId] ); console.log( `\n✔ Credencial cifrada, releída de la base y verificada contra el CRM.` + `\n etiqueta: ${f[0].label}` + `\n huella : …${f[0].token_fingerprint}` + `\n\nYa puedes quitar CRM_TOKEN de platform/.env para este negocio.` ); } else { console.error("✖ La relectura no coincide: la credencial guardada no sirve"); process.exit(1); } await pool.end();