import { getDb } from '../../utils/db' export default defineEventHandler(async (event) => { const db = getDb() const query = getQuery(event) const type = query.type as string || 'short-term' const period = query.period as string || '24h' // 기간/간격 계산 let intervalClause = '' let groupFormat = '' if (period === '1h') { intervalClause = `'-1 hours'` groupFormat = '%Y-%m-%d %H:%M' // 분 단위 } else if (period === '6h') { intervalClause = `'-6 hours'` groupFormat = '%Y-%m-%d %H:00' // 시간 단위 } else if (period === '12h') { intervalClause = `'-12 hours'` groupFormat = '%Y-%m-%d %H:00' } else if (period === '24h') { intervalClause = `'-24 hours'` groupFormat = '%Y-%m-%d %H:00' } else if (period === '7d') { intervalClause = `'-7 days'` groupFormat = '%Y-%m-%d' // 일 단위 } else if (period === '30d') { intervalClause = `'-30 days'` groupFormat = '%Y-%m-%d' } else { intervalClause = `'-24 hours'` groupFormat = '%Y-%m-%d %H:00' } // 시간대별 집계 const rows = db.prepare(` SELECT strftime('${groupFormat}', detected_at) as time_slot, SUM(CASE WHEN level = 'warning' THEN 1 ELSE 0 END) as warning, SUM(CASE WHEN level = 'danger' THEN 1 ELSE 0 END) as danger FROM anomaly_logs WHERE detect_type = ? AND detected_at >= datetime('now', ${intervalClause}, 'localtime') GROUP BY time_slot ORDER BY time_slot ASC `).all(type) as any[] // 시간 포맷 변환 const data = rows.map(r => ({ time: formatTimeLabel(r.time_slot, period), warning: r.warning, danger: r.danger })) return { data, type, period, timestamp: new Date().toISOString() } }) function formatTimeLabel(timeSlot: string, period: string): string { if (!timeSlot) return '' if (period === '7d' || period === '30d') { // 일 단위: MM/DD const parts = timeSlot.split('-') return `${parts[1]}/${parts[2]}` } else { // 시간 단위: HH:MM const parts = timeSlot.split(' ') if (parts.length === 2) { return parts[1].substring(0, 5) } return timeSlot.substring(11, 16) } }