autosnippet
Version:
Extract code patterns into a knowledge base for AI coding assistants
105 lines (104 loc) • 4.29 kB
JavaScript
/**
* Signal & Report API 路由
*
* 端点:
* GET /api/v1/signals/trace — 查询信号留痕
* GET /api/v1/signals/stats — 信号统计
* GET /api/v1/signals/reports — 查询管道报告
*/
import express from 'express';
import { getServiceContainer } from '../../injection/ServiceContainer.js';
const router = express.Router();
/**
* GET /api/v1/signals/trace
* 查询信号留痕(支持 type / source / target / from / to / limit / offset)
*/
router.get('/trace', async (req, res) => {
try {
const container = getServiceContainer();
const traceWriter = container.get('signalTraceWriter');
if (!traceWriter) {
res.status(503).json({
success: false,
error: { code: 'SERVICE_UNAVAILABLE', message: 'SignalTraceWriter not available' },
});
return;
}
const typeParam = req.query.type;
const type = typeof typeParam === 'string' ? typeParam.split(',').filter(Boolean) : undefined;
const source = typeof req.query.source === 'string' ? req.query.source : undefined;
const target = typeof req.query.target === 'string' ? req.query.target : undefined;
const from = req.query.from ? Number(req.query.from) : undefined;
const to = req.query.to ? Number(req.query.to) : undefined;
const limit = req.query.limit ? Math.min(Number(req.query.limit), 200) : undefined;
const offset = req.query.offset ? Number(req.query.offset) : undefined;
const result = await traceWriter.query({ type, source, target, from, to, limit, offset });
res.json({ success: true, data: result });
}
catch (err) {
res.status(500).json({
success: false,
error: { code: 'INTERNAL_ERROR', message: err instanceof Error ? err.message : String(err) },
});
}
});
/**
* GET /api/v1/signals/stats
* 信号统计(可选 from / to 时间范围)
*/
router.get('/stats', async (req, res) => {
try {
const container = getServiceContainer();
const traceWriter = container.get('signalTraceWriter');
if (!traceWriter) {
res.status(503).json({
success: false,
error: { code: 'SERVICE_UNAVAILABLE', message: 'SignalTraceWriter not available' },
});
return;
}
const from = req.query.from ? Number(req.query.from) : undefined;
const to = req.query.to ? Number(req.query.to) : undefined;
const stats = await traceWriter.stats({ from, to });
res.json({ success: true, data: stats });
}
catch (err) {
res.status(500).json({
success: false,
error: { code: 'INTERNAL_ERROR', message: err instanceof Error ? err.message : String(err) },
});
}
});
/**
* GET /api/v1/signals/reports
* 查询管道报告(支持 category / type / from / to / limit / offset)
*/
router.get('/reports', async (req, res) => {
try {
const container = getServiceContainer();
const reportStore = container.get('reportStore');
if (!reportStore) {
res.status(503).json({
success: false,
error: { code: 'SERVICE_UNAVAILABLE', message: 'ReportStore not available' },
});
return;
}
const catParam = req.query.category;
const category = typeof catParam === 'string' ? catParam.split(',').filter(Boolean) : undefined;
const type = typeof req.query.type === 'string' ? req.query.type : undefined;
const from = req.query.from ? Number(req.query.from) : undefined;
const to = req.query.to ? Number(req.query.to) : undefined;
const limit = req.query.limit ? Math.min(Number(req.query.limit), 200) : undefined;
const offset = req.query.offset ? Number(req.query.offset) : undefined;
const result = await reportStore.query({ category, type, from, to, limit, offset });
res.json({ success: true, data: result });
}
catch (err) {
res.status(500).json({
success: false,
error: { code: 'INTERNAL_ERROR', message: err instanceof Error ? err.message : String(err) },
});
}
});
export default router;