104 lines
5.1 KiB
TypeScript
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();
|