Docker 파일
This commit is contained in:
@@ -1,57 +1,59 @@
|
||||
import { getDb } from '../../utils/db'
|
||||
import { query } from '../../utils/db'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const db = getDb()
|
||||
const query = getQuery(event)
|
||||
const queryParams = getQuery(event)
|
||||
|
||||
const type = query.type as string || 'short-term'
|
||||
const period = query.period as string || '24h'
|
||||
const type = queryParams.type as string || 'short-term'
|
||||
const period = queryParams.period as string || '24h'
|
||||
|
||||
// 기간/간격 계산
|
||||
let intervalClause = ''
|
||||
let groupFormat = ''
|
||||
let interval = '24 hours'
|
||||
let groupFormat = 'YYYY-MM-DD HH24:00'
|
||||
|
||||
if (period === '1h') {
|
||||
intervalClause = `'-1 hours'`
|
||||
groupFormat = '%Y-%m-%d %H:%M' // 분 단위
|
||||
interval = '1 hour'
|
||||
groupFormat = 'YYYY-MM-DD HH24:MI'
|
||||
} else if (period === '6h') {
|
||||
intervalClause = `'-6 hours'`
|
||||
groupFormat = '%Y-%m-%d %H:00' // 시간 단위
|
||||
interval = '6 hours'
|
||||
groupFormat = 'YYYY-MM-DD HH24:00'
|
||||
} else if (period === '12h') {
|
||||
intervalClause = `'-12 hours'`
|
||||
groupFormat = '%Y-%m-%d %H:00'
|
||||
interval = '12 hours'
|
||||
groupFormat = 'YYYY-MM-DD HH24:00'
|
||||
} else if (period === '24h') {
|
||||
intervalClause = `'-24 hours'`
|
||||
groupFormat = '%Y-%m-%d %H:00'
|
||||
interval = '24 hours'
|
||||
groupFormat = 'YYYY-MM-DD HH24:00'
|
||||
} else if (period === '7d') {
|
||||
intervalClause = `'-7 days'`
|
||||
groupFormat = '%Y-%m-%d' // 일 단위
|
||||
interval = '7 days'
|
||||
groupFormat = 'YYYY-MM-DD'
|
||||
} else if (period === '30d') {
|
||||
intervalClause = `'-30 days'`
|
||||
groupFormat = '%Y-%m-%d'
|
||||
} else {
|
||||
intervalClause = `'-24 hours'`
|
||||
groupFormat = '%Y-%m-%d %H:00'
|
||||
interval = '30 days'
|
||||
groupFormat = 'YYYY-MM-DD'
|
||||
}
|
||||
|
||||
// 시간대별 집계
|
||||
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[]
|
||||
// 시간대별 집계 (anomaly_logs 테이블이 없으면 빈 배열 반환)
|
||||
let rows: any[] = []
|
||||
try {
|
||||
rows = await query<any>(`
|
||||
SELECT
|
||||
to_char(detected_at, '${groupFormat}') 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 = $1
|
||||
AND detected_at >= NOW() - INTERVAL '${interval}'
|
||||
GROUP BY time_slot
|
||||
ORDER BY time_slot ASC
|
||||
`, [type])
|
||||
} catch (e) {
|
||||
// 테이블이 없으면 빈 배열
|
||||
rows = []
|
||||
}
|
||||
|
||||
// 시간 포맷 변환
|
||||
const data = rows.map(r => ({
|
||||
time: formatTimeLabel(r.time_slot, period),
|
||||
warning: r.warning,
|
||||
danger: r.danger
|
||||
warning: Number(r.warning),
|
||||
danger: Number(r.danger)
|
||||
}))
|
||||
|
||||
return {
|
||||
@@ -66,11 +68,9 @@ 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)
|
||||
|
||||
Reference in New Issue
Block a user