Files
ln-bi/src/server/routes/asset-faults/index.ts
T
2026-10-16 12:38:52 +08:00

104 lines
5.1 KiB
TypeScript

import { Hono } from 'hono';
import { dashboardAnalysis, faultDashboard, filterDashboardRows, parseDashboardQuery } from './dashboard.js';
import { FAULT_OVERVIEW_METRICS, type FaultOverviewMetric } from '../../../shared/assets/faults.js';
import type { AuthUser } from '../../auth/types.js';
import { analyzeFaults, faultOverview, faultAnalysis, parseFaultQuery, visibleFaults } from './model.js';
import { faultWeeklyReport, faultWeeklyAnalysis, parseFaultWeeklyQuery } from './weekly-report.js';
import { loadFaults } from './repository.js';
import { faultTrend, faultTrendAnalysis, parseFaultTrendQuery } from './trend.js';
export function createFaultRouter(load = loadFaults) {
const app = new Hono<{ Variables: { user: AuthUser } }>();
for (const path of ['/dashboard', '/dashboard-analysis'] as const) {
app.get(path, async c => {
const user = c.get('user');
if (!user) return c.json({ error: 'Unauthorized' }, 401);
const params = c.req.query();
try { parseDashboardQuery(params); } catch(error) { return c.json({error:(error as Error).message},400); }
try {
const data = await load(); const rows = visibleFaults(data.rows,user); c.header('Cache-Control','no-store');
return c.json(path === '/dashboard' ? faultDashboard(rows,params,data.updatedAt) : dashboardAnalysis(rows,params,data.updatedAt));
} catch { return c.json({error:'故障分析暂时不可用,请稍后重试'},503); }
});
}
for (const path of ['/trend', '/trend-analysis'] as const) {
app.get(path, async c => {
const user = c.get('user');
if (!user) return c.json({ error: 'Unauthorized' }, 401);
let query;
try { query = parseFaultTrendQuery(c.req.query()); }
catch (error) { return c.json({ error: (error as Error).message }, 400); }
try {
const data = await load();
const rows = filterDashboardRows(visibleFaults(data.rows, user), c.req.query());
c.header('Cache-Control', 'no-store');
return c.json(path === '/trend' ? faultTrend(rows, query, data.updatedAt) : faultTrendAnalysis(rows, query, data.updatedAt));
} catch (error) {
console.error('Fault trend failed:', error instanceof Error ? error.message : 'unknown');
return c.json({ error: '故障趋势暂时不可用,请稍后重试' }, 503);
}
});
}
for (const path of ['/weekly-report', '/weekly-report-analysis'] as const) {
app.get(path, async c => {
const user = c.get('user');
if (!user) return c.json({ error: 'Unauthorized' }, 401);
let query;
try { query = parseFaultWeeklyQuery(c.req.query()); }
catch (error) { return c.json({ error: (error as Error).message }, 400); }
try {
const data = await load();
const rows = filterDashboardRows(visibleFaults(data.rows, user), c.req.query());
c.header('Cache-Control', 'no-store');
return c.json(path === '/weekly-report' ? faultWeeklyReport(rows, query, data.updatedAt) : faultWeeklyAnalysis(rows, query, data.updatedAt));
} catch (error) {
console.error('Fault weekly report failed:', error instanceof Error ? error.message : 'unknown');
return c.json({ error: '故障运维周报暂时不可用,请稍后重试' }, 503);
}
});
}
app.get('/overview', async c => {
const user = c.get('user');
if (!user) return c.json({ error: 'Unauthorized' }, 401);
try {
const data = await load();
c.header('Cache-Control', 'no-store');
return c.json(faultOverview(visibleFaults(data.rows, user), data.updatedAt));
} catch (error) {
console.error('Fault overview failed:', error instanceof Error ? error.message : 'unknown');
return c.json({ error: '故障数据暂时不可用,请稍后重试' }, 503);
}
});
app.get('/analysis', async c => {
const user = c.get('user');
if (!user) return c.json({ error: 'Unauthorized' }, 401);
const metric = c.req.query('metric') || '';
if (!Object.hasOwn(FAULT_OVERVIEW_METRICS, metric)) return c.json({ error: '无效统计指标' }, 400);
try {
const data = await load();
c.header('Cache-Control', 'no-store');
return c.json(faultAnalysis(visibleFaults(data.rows, user), metric as FaultOverviewMetric, data.updatedAt));
} catch (error) {
console.error('Fault analysis failed:', error instanceof Error ? error.message : 'unknown');
return c.json({ error: '故障数据暂时不可用,请稍后重试' }, 503);
}
});
app.get('/', async c => {
const user = c.get('user');
if (!user) return c.json({ error: 'Unauthorized' }, 401);
let query;
try { query = parseFaultQuery(c.req.query()); }
catch (error) { return c.json({ error: (error as Error).message }, 400); }
try {
const data = await load();
c.header('Cache-Control', 'no-store');
return c.json(analyzeFaults(visibleFaults(data.rows, user, query.subject), query, data.updatedAt));
} catch (error) {
console.error('Fault BI query failed:', error instanceof Error ? error.message : 'unknown');
return c.json({ error: '故障数据暂时不可用,请稍后重试' }, 503);
}
});
return app;
}
export default createFaultRouter();