Backend NestJS + Prisma, dueno de la configuracion del worker (databases, scenarios, scenario_destinations, value_mappings) y lectura de webhook_events / replication_attempts. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
3.3 KiB
sap-intercompany-api
Backend HTTP (NestJS) dueño de toda la configuración de
sap-intercompany-worker — bases de datos,
escenarios, destinos, mapeos de valor — y del log de replicación
(webhook_events + replication_attempts), sobre la misma Postgres.
Reemplaza a las rutas /replication/* que tenía sap-webhook-api.
sap-intercompany-worker no expone HTTP a propósito (sigue siendo un
script plano por cron); esta API es la única superficie HTTP para
administrar su configuración, pensada para ser consumida por
sap-intercompany-viewer (frontend, aún no implementado).
Qué NO hace
- No corre migraciones.
prisma/schema.prismaes una copia de la del worker (mismoDATABASE_URL); acá solo se correprisma generatepara tener un cliente tipado. El worker sigue siendo el dueño del schema. - No genera la lógica de
filter/transformde un escenario.POST /scenarioscrea la fila en Postgres y, si no existe, escribe el scaffold de 3 secciones ensap-intercompany-worker/src/scenarios/<slug>.ts(mismo scaffold que generascenario:adddel CLI del worker) — el cuerpo real defilter/transformsiempre se edita a mano, en el editor del usuario.
Endpoints
GET/POST /databases,GET /databases/:code,PATCH /databases/:code(incluye desactivar con{"active": false}). Las respuestas nunca incluyenpassword.GET /scenarios,GET /scenarios/:code,POST /scenarios,PATCH /scenarios/:code,POST /scenarios/:code/rename.GET /scenarios/:code/source— código fuente crudo del.ts(solo lectura; requiereWORKER_ROOT_PATH).GET/POST /scenarios/:code/destinations,DELETE /scenarios/:code/destinations/:databaseCode.GET/POST /scenarios/:code/mappings(GETacepta?fieldName=).GET /events(filtrosfrom,to,businessObject,scenarioCode,status),GET /events/:id(incluyereplication_attempts).POST /events/:id/reprocess— pone el evento enstatus='pending'de nuevo; el worker lo va a reprocesar contra todos los escenarios y destinos aplicables en su próximo ciclo, no solo el que falló.
POST /databases y POST /scenarios fallan con 409 si el code ya
existe (a diferencia del CLI del worker, que hace upsert) — para
actualizar un existente se usa PATCH.
Quick start
npm install
cp .env.example .env # completar DATABASE_URL (la misma del worker) y WORKER_ROOT_PATH
npx prisma generate # cliente tipado propio; NUNCA correr `prisma migrate` acá
npm start # http://localhost:3001
Stack
- NestJS (mismo framework/estilo que
sap-webhook-api), corrido contsxen vez denest build— mismo enfoque ESM + TypeScript nativo que ya usasap-intercompany-worker, para poder importar directo el cliente Prisma generado (prisma-client, salida.ts) sin fricción de compilación. - Prisma 7 +
@prisma/adapter-pg, contra la Postgres compartida con el worker.
Nota de implementación: la inyección de dependencias de Nest usa
@Inject(Token) explícito en cada constructor (en vez de depender solo del
tipo declarado) porque bajo tsx/esbuild la emisión de
design:paramtypes (emitDecoratorMetadata) no es confiable — sin esto,
Nest instancia los controllers/servicios sin fallar pero con las
dependencias en undefined.