feat(modo-local): fallback completo sin Monday + cola de sincronización
- Circuit breaker saludMonday (3 fallos → modo local; ping cada 60s)
- Endpoint GET /api/sistema/estado {mondayOk, pendientesSync}
- LeadCaptura extendida (board, etapa, origen, motivo, pendienteSync)
- Tablas Unidad (espejo inventario, 288 seed) + SyncPendiente
- crmLocal: crearLead, afluencia, cambio etapa, descarte, conversión, apartar
- Ruteo en controllers: fallback local ante 502 o Monday caído
- Mi día local: resumen completo desde SQLite + unión con Monday
- Fallbacks: unidades, contactos, reportes, prefill, buscador
- Sync worker cada 2min + handlers 15 tipos (con DependenciaPendienteError)
- Gate automatizaciones: skip si !mondayOk
- Banner 'Modo local' en 5 apps + badge pendiente en mi-dia
- 597 API tests + 263 front tests verdes
Env MODO_LOCAL_FORZADO=true para testing sin Monday.
This commit is contained in:
15
api-gateway/src/controllers/sistema.controller.ts
Normal file
15
api-gateway/src/controllers/sistema.controller.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import type { Request, Response } from 'express'
|
||||
import { prisma } from '../services/prisma.js'
|
||||
import { saludMonday } from '../services/salud-monday.service.js'
|
||||
|
||||
/**
|
||||
* GET /api/sistema/estado — salud del modo local para el banner del front:
|
||||
* `mondayOk` (false = operar en modo local) y `pendientesSync` (registros de
|
||||
* la cola SyncPendiente esperando réplica a Monday, incluidos los en ERROR).
|
||||
*/
|
||||
export async function estadoSistema(_req: Request, res: Response): Promise<void> {
|
||||
const pendientesSync = await prisma.syncPendiente.count({
|
||||
where: { estado: { in: ['PENDIENTE', 'ERROR'] } },
|
||||
})
|
||||
res.json({ mondayOk: saludMonday.estaDisponible(), pendientesSync })
|
||||
}
|
||||
Reference in New Issue
Block a user