/** * ¿Se pueden BORRAR citas y servicios? Sin crear nada. * * Se pregunta antes de escribir, no después: si el borrado no existe o el token * no lo tiene, cualquier prueba de escritura dejaría basura permanente en el CRM * de un cliente real. Se manda un DELETE contra un id inventado y se mira el * error: * * 401 «not authorized for this scope» → no hay permiso de borrado * 404 / 422 → el permiso está; solo falta el id real * * node scripts/run-tsx.mjs platform/scripts/crm-spike-borrado.ts */ import { requireEnv, loadEnv } from "../lib/env.ts"; loadEnv(); const BASE = process.env.CRM_BASE_URL || "https://services.leadconnectorhq.com"; const TOKEN = requireEnv("CRM_TOKEN"); async function sonda(method: string, path: string, version: string) { const res = await fetch(`${BASE}${path}`, { method, headers: { authorization: `Bearer ${TOKEN}`, version, accept: "application/json", }, }); const texto = (await res.text()).slice(0, 260); const sinPermiso = res.status === 401; console.log(`\n── ${method} ${path}`); console.log( ` ${sinPermiso ? "✖ SIN PERMISO DE BORRADO" : "✔ EL BORRADO EXISTE (falla por el id, no por el token)"}` ); console.log(` ${res.status} · ${texto}`); return !sinPermiso; } const ID_FALSO = "idQueNoExisteJamas123"; const cita = await sonda("DELETE", `/calendars/events/${ID_FALSO}`, "v3"); const servicio = await sonda("DELETE", `/calendars/services/catalog/${ID_FALSO}`, "v3"); console.log( `\n────────────\ncitas: ${cita ? "se pueden borrar" : "NO se pueden borrar"} · ` + `servicios: ${servicio ? "se pueden borrar" : "NO se pueden borrar"}` ); if (!cita || !servicio) { console.log( "\nNo se debe ejercer la escritura de lo que no se pueda deshacer en la\n" + "subcuenta de un cliente real." ); }