Files
DashDescomplicar/api/routes/stack-observer.ts
T

82 lines
2.5 KiB
TypeScript

/**
* Stack Observer API Route
* GET /api/stack-observer - Get divergence data from observer.db
* Provides real-time automation liveness metrics (result_real divergences)
* @author Descomplicar® | @link descomplicar.pt | @copyright 2026
*/
import { Router } from 'express'
import type { Request, Response } from 'express'
import * as observerService from '../services/observer.js'
const router = Router()
/**
* Get divergence data
* Returns evaluations with result_real != result_nominal (automation failures/liveness violations)
*/
router.get('/', async (_req: Request, res: Response) => {
try {
const data = await observerService.getDivergences()
res.json(data)
} catch (error: unknown) {
console.error('Stack Observer API error:', error)
const message = error instanceof Error ? error.message : 'Internal server error'
res.status(500).json({ error: message })
}
})
/**
* Get single divergence by ID
* Returns full evaluation record with context
*/
router.get('/:id', async (req: Request, res: Response) => {
try {
const { id } = req.params
if (!id || typeof id !== 'string') {
res.status(400).json({ error: 'Invalid divergence ID' })
return
}
const data = await observerService.getDivergenceById(id)
if (!data) {
res.status(404).json({ error: 'Divergence not found' })
return
}
res.json(data)
} catch (error: unknown) {
console.error('Stack Observer detail error:', error)
const message = error instanceof Error ? error.message : 'Internal server error'
res.status(500).json({ error: message })
}
/**
* Get list of automations (from hermes_jobs)
* F1b: Colector ingesta jobs do Hermes
*/
router.get('/automations', async (_req: Request, res: Response) => {
try {
const data = await observerService.getAutomations()
res.json(data)
} catch (error: unknown) {
console.error('Get automations error:', error)
const message = error instanceof Error ? error.message : 'Internal server error'
res.status(500).json({ error: message })
}
})
/**
* Get list of gate events
* F1a: Colector ingesta gate_events da fila
*/
router.get('/gate-events', async (_req: Request, res: Response) => {
try {
const data = await observerService.getGateEvents()
res.json(data)
} catch (error: unknown) {
console.error('Get gate events error:', error)
const message = error instanceof Error ? error.message : 'Internal server error'
res.status(500).json({ error: message })
}
})
export default router