Visión general
Oxitesa son tres aplicaciones y una base de datos. Todo lo que pasa en el negocio termina en MySQL, y buena parte de la lógica transaccional vive ahí adentro en forma de stored procedures.
Piezas
Nginx hace de reverse proxy delante de todo: sirve la consola web como estático y proxea /api al
container node-app.
Un entry point, muchos roles
src/index.ts es la API y todos los workers a la vez. Lo que corre lo decide la variable de
entorno EXECUTION_MODE, y en docker-compose.yml hay un container por rol. El detalle está en
Workers y colas.
Ciclo de vida de un request
Las cuatro cosas que hay que saber de ese diagrama:
- La autenticación es local. El backend verifica el JWT de Clerk contra la firma y el
template_name; no llama a la API de Clerk. Ver Autenticación. - Todo endpoint devuelve
CustomResponse. Nunca data cruda. - Un error de negocio viaja como HTTP 200 con
success: false, no como 4xx. Los 400 quedan para errores declass-validatory los 500 para excepciones no manejadas. - Los controllers se registran explícitamente en una lista. Si no lo agregás ahí, tu endpoint no existe (y no hay ningún error que te avise).
Multi-esquema
MySQL, con cinco esquemas que representan cinco áreas del negocio:
| Esquema | Qué guarda |
|---|---|
configuration | Catálogos maestros e identidad: usuarios, roles, productos, elementos, convenios, estados, vehículos, reportes |
customer | Pacientes y sus datos |
finances | El núcleo operativo: autorizaciones, remitos, hojas de ruta, almacenes, empleados, facturación e inventario |
callcenter | Registro de contactos con el paciente y motor de encuestas |
logs | Auditoría, logs del bot PAMI, logs del mobile, mensajes de WhatsApp |
Detalle en Modelo de datos.
Qué pasa en cada repo
oxitesa-backend— capas controller → service → TypeORM, con módulos de feature autocontenidos para lo nuevo. Ver Backend y Módulos de feature.oxitesa-front— Angular standalone, signals, todo listado paginado server-side. Ver Estructura del front.oxitec-mobile-app— offline-first: la app funciona entera sin señal y sincroniza después. Ver Offline-first.
Credenciales de PAMI, claves de Clerk, tokens de WhatsApp, credenciales de base de datos y de R2 son variables de entorno de cada ambiente. En estos docs solo aparecen nombres de variables, nunca valores.