Este repositorio es un microservicio en NestJS para manejar transacciones financieras. Usa PostgreSQL para persistencia y Kafka para la validación asíncrona (anti-fraud).
Este README describe cómo levantar el entorno, cómo usar los servicios (endpoints) y cómo comprobar el flujo de mensajes con Kafka.
- Framework: NestJS
- Persistencia: PostgreSQL (TypeORM)
- Mensajería: Kafka
- Arquitectura: monolito modular con flujo event-driven para validación anti-fraud
- Docker & Docker Compose
- Node 18+ y npm o yarn
Crear un archivo .env en la raíz con las variables de Postgres:
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=postgres
Nota: la app por defecto usa localhost:9092 como broker Kafka. Si ejecutas la app dentro de Docker, usa kafka:29092 como broker.
- Instala dependencias:
npm install
# o
yarn install- Levanta infra con Docker Compose (Postgres, Zookeeper, Kafka):
docker compose up -d- Ejecuta la aplicación en modo desarrollo:
npm run local
# o
yarn localAbre dos terminales separados y en cada uno ejecuta:
Terminal A (transaction):
cd transaction
npm install
npm run localTerminal B (anti-fraud):
cd anti-fraud
npm install
npm run localAmbos servicios deben poder conectar al broker Kafka que levantaste con docker compose up -d.
Base URL: http://localhost:3000
- Crear transacción — POST
/transaction
- Descripción: crea una transacción y publica el evento para validación anti-fraud.
- Body (JSON):
{
"accountExternalIdDebit": "5429d629-c239-45fa-8235-1a386258c536",
"accountExternalIdCredit": "d6cd54da-8ce3-4f79-abda-bd5be9b19e68",
"tranferTypeId": 1,
"value": 120
}Ejemplos curl:
curl -i -X POST http://localhost:3000/transaction \
-H "Content-Type: application/json" \
-d '{
"accountExternalIdDebit": "5429d629-c239-45fa-8235-1a386258c536",
"accountExternalIdCredit": "d6cd54da-8ce3-4f79-abda-bd5be9b19e68",
"tranferTypeId": 1,
"value": 120
}'- Listar transacciones — GET
/transaction
- Descripción: devuelve todas las transacciones guardadas (útil para debug local).
curl http://localhost:3000/transaction- Al crear una transacción se publica un evento
transaction.createdcon los datos básicos. - Un consumidor (anti-fraud) valida la transacción y emite
transaction.validatedcon{ id, status }. - La app escucha
transaction.validatedy actualiza elstatusen la base de datos.
Regla implementada en el anti-fraud (ejemplo): if value > 1000 => rejected; else approved.
- Consultar la última transacción:
select * from transaction where "accountExternalIdDebit" = {{ID}};CREATE TABLE public.transaction
(
"accountExternalIdDebit" varchar NOT NULL,
"accountExternalIdCredit" varchar NOT NULL,
"tranferTypeId" integer NOT NULL,
value numeric NOT NULL,
id uuid DEFAULT uuid_generate_v4() NOT NULL
CONSTRAINT "PK_89eadb93a89810556e1cbcd6ab9"
PRIMARY KEY,
"createdAt" timestamp DEFAULT now() NOT NULL,
"updatedAt" timestamp DEFAULT now() NOT NULL,
status integer NOT NULL
);Si usas TypeORM, la entidad del proyecto crea automáticamente la tabla al iniciar (si synchronize: true). Usa este DDL solo si quieres preparar la tabla manualmente o probar fuera del ciclo de arranque de la app.