Mono-tenant: resolver id una vez al boot, eliminar lookups por turno
El sistema nunca fue realmente multi-tenant en la práctica. El esquema
DB conserva las columnas tenant_id (queda lista para escalar más adelante
sin migración), pero la app ahora resuelve el tenant una sola vez al
arranque y todas las capas leen de un único punto.
- src/modules/shared/tenant.js: nuevo módulo. setTenant() en boot,
getTenantId() lo lee desde cualquier lado.
- index.js: ensureTenant() → setTenant({ id, key }). Sin cambios externos.
- pipeline.resolveTenantId(): pasa de hacer 1-2 queries a DB por turno
a un return sincrónico del id cacheado. Mantiene firma async para no
romper callers.
- intake handlers (sim.js, evolution.js): usan getTenantId() directo,
sin parsing de tenant_key del chat_id ni lookup por canal.
- wooWebhooks: ya no requiere ?tenant_key=... en la query string.
El webhook va al único tenant configurado.
- repo.js: eliminados getTenantByKey() y getTenantIdByChannel() (no más
callers).
Plumbing del parámetro tenantId en signatures de handlers/repos/machine
queda intacto — bajar eso es ruido de alto riesgo y no aporta hoy.
188 tests pasando.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
17
index.js
17
index.js
@@ -1,10 +1,10 @@
|
||||
import "dotenv/config";
|
||||
import { ensureTenant } from "./src/modules/2-identity/db/repo.js";
|
||||
import { setTenant } from "./src/modules/shared/tenant.js";
|
||||
import { createApp } from "./src/app.js";
|
||||
|
||||
async function configureUndiciDispatcher() {
|
||||
// Node 18+ usa undici debajo de fetch. Esto suele arreglar timeouts “fantasma” por keep-alive/pooling.
|
||||
// Nota: si el módulo `undici` no está disponible, no rompemos el arranque (solo logueamos warning).
|
||||
// Node 18+ usa undici debajo de fetch. Esto suele arreglar timeouts "fantasma" por keep-alive/pooling.
|
||||
try {
|
||||
const { setGlobalDispatcher, Agent } = await import("undici");
|
||||
setGlobalDispatcher(
|
||||
@@ -21,21 +21,14 @@ async function configureUndiciDispatcher() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* --- Tenant ---
|
||||
*/
|
||||
const TENANT_KEY = process.env.TENANT_KEY || "piaf";
|
||||
let TENANT_ID = null;
|
||||
|
||||
/**
|
||||
* --- Boot ---
|
||||
*/
|
||||
const port = process.env.PORT || 3000;
|
||||
|
||||
(async function boot() {
|
||||
await configureUndiciDispatcher();
|
||||
TENANT_ID = await ensureTenant({ key: TENANT_KEY, name: TENANT_KEY.toUpperCase() });
|
||||
const app = createApp({ tenantId: TENANT_ID });
|
||||
const tenantId = await ensureTenant({ key: TENANT_KEY, name: TENANT_KEY.toUpperCase() });
|
||||
setTenant({ id: tenantId, key: TENANT_KEY });
|
||||
const app = createApp({ tenantId });
|
||||
app.listen(port, () => console.log(`UI: http://localhost:${port} (tenant=${TENANT_KEY})`));
|
||||
})().catch((err) => {
|
||||
console.error("Boot failed:", err);
|
||||
|
||||
Reference in New Issue
Block a user