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();