| /** | |
| * Rutas REST de estadisticas globales (publicas). | |
| * | |
| * Endpoint (montado en /api/v1/stats): | |
| * GET / → estadisticas agregadas del sistema. | |
| * | |
| * Datos expuestos: | |
| * - marketsCount : total de mercados activos. | |
| * - volume24h : suma de volumen de mercados activos. | |
| * - signalsCount : total de senales IA generadas. | |
| * - alertsToday : alertas enviadas en las ultimas 24h. | |
| */ | |
| import { Router } from 'express'; | |
| import { prisma } from '../utils/prisma.js'; | |
| import { ok } from '../utils/apiResponse.js'; | |
| const router = Router(); | |
| router.get('/', async (_req, res) => { | |
| const [marketsCount, signalsCount, alertsToday] = await Promise.all([ | |
| prisma.market.count({ where: { status: 'active' } }), | |
| prisma.aISignal.count(), | |
| prisma.alert.count({ | |
| where: { sentAt: { gte: new Date(Date.now() - 24 * 60 * 60 * 1000) } }, | |
| }), | |
| ]); | |
| const volumeAgg = await prisma.market.aggregate({ | |
| where: { status: 'active' }, | |
| _sum: { volumeEur: true }, | |
| }); | |
| ok(res, { | |
| marketsCount, | |
| volume24h: volumeAgg._sum.volumeEur || 0, | |
| signalsCount, | |
| alertsToday, | |
| }); | |
| }); | |
| export default router; | |