100 lines
3.2 KiB
TypeScript
100 lines
3.2 KiB
TypeScript
// shared/lib/db/alert-schema.ts — 数据库表结构常量
|
|
// 供 monitor-ai 及未来其他项目引用
|
|
|
|
export const SERVICES_TABLE_SQL = `
|
|
CREATE TABLE IF NOT EXISTS services (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
category TEXT NOT NULL DEFAULT 'endpoint',
|
|
alert_level TEXT NOT NULL DEFAULT 'warning',
|
|
checks TEXT NOT NULL DEFAULT '[]',
|
|
check_interval INTEGER DEFAULT 30,
|
|
check_timeout INTEGER DEFAULT 10,
|
|
enabled INTEGER DEFAULT 1,
|
|
current_status TEXT DEFAULT 'unknown',
|
|
status_since TEXT,
|
|
display_order INTEGER DEFAULT 0,
|
|
created_at TEXT DEFAULT (datetime('now', '+8 hours')),
|
|
updated_at TEXT DEFAULT (datetime('now', '+8 hours'))
|
|
);
|
|
`
|
|
|
|
export const ALERT_CHANNELS_TABLE_SQL = `
|
|
CREATE TABLE IF NOT EXISTS alert_channels (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
channel_type TEXT DEFAULT 'wechat',
|
|
webhook_url TEXT NOT NULL,
|
|
enabled INTEGER DEFAULT 1,
|
|
level_critical INTEGER DEFAULT 1,
|
|
level_warning INTEGER DEFAULT 1,
|
|
level_info INTEGER DEFAULT 0,
|
|
quiet_enabled INTEGER DEFAULT 0,
|
|
quiet_start TEXT DEFAULT '23:00',
|
|
quiet_end TEXT DEFAULT '07:00',
|
|
quiet_bypass_critical INTEGER DEFAULT 1,
|
|
cooldown_minutes INTEGER DEFAULT 5,
|
|
created_at TEXT DEFAULT (datetime('now', '+8 hours')),
|
|
updated_at TEXT DEFAULT (datetime('now', '+8 hours'))
|
|
);
|
|
`
|
|
|
|
export const ALERT_SETTINGS_TABLE_SQL = `
|
|
CREATE TABLE IF NOT EXISTS alert_settings (
|
|
key TEXT PRIMARY KEY,
|
|
value TEXT NOT NULL,
|
|
description TEXT,
|
|
updated_at TEXT DEFAULT (datetime('now', '+8 hours'))
|
|
);
|
|
`
|
|
|
|
export const STATUS_HISTORY_TABLE_SQL = `
|
|
CREATE TABLE IF NOT EXISTS status_history (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
service_id INTEGER NOT NULL REFERENCES services(id),
|
|
from_status TEXT NOT NULL,
|
|
to_status TEXT NOT NULL,
|
|
started_at TEXT NOT NULL,
|
|
ended_at TEXT,
|
|
duration_seconds INTEGER,
|
|
error_message TEXT,
|
|
failed_checks TEXT,
|
|
truncated_by_restart INTEGER DEFAULT 0,
|
|
created_at TEXT DEFAULT (datetime('now', '+8 hours'))
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_status_history_service ON status_history(service_id, started_at);
|
|
CREATE INDEX IF NOT EXISTS idx_status_history_open ON status_history(ended_at) WHERE ended_at IS NULL;
|
|
`
|
|
|
|
export const ALERT_HISTORY_TABLE_SQL = `
|
|
CREATE TABLE IF NOT EXISTS alert_history (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
channel_id INTEGER REFERENCES alert_channels(id),
|
|
service_id INTEGER REFERENCES services(id),
|
|
status_event_id INTEGER REFERENCES status_history(id),
|
|
alert_type TEXT NOT NULL DEFAULT 'alert',
|
|
level TEXT NOT NULL,
|
|
title TEXT NOT NULL,
|
|
content TEXT NOT NULL,
|
|
sent_at TEXT NOT NULL,
|
|
success INTEGER DEFAULT 0,
|
|
response_code INTEGER,
|
|
response_body TEXT,
|
|
created_at TEXT DEFAULT (datetime('now', '+8 hours'))
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_alert_history_time ON alert_history(sent_at);
|
|
CREATE INDEX IF NOT EXISTS idx_alert_history_channel ON alert_history(channel_id, sent_at);
|
|
CREATE INDEX IF NOT EXISTS idx_alert_history_service ON alert_history(service_id, sent_at);
|
|
CREATE INDEX IF NOT EXISTS idx_alert_history_event ON alert_history(status_event_id);
|
|
`
|
|
|
|
export const ALL_TABLES_SQL = [
|
|
SERVICES_TABLE_SQL,
|
|
ALERT_CHANNELS_TABLE_SQL,
|
|
ALERT_SETTINGS_TABLE_SQL,
|
|
STATUS_HISTORY_TABLE_SQL,
|
|
ALERT_HISTORY_TABLE_SQL,
|
|
].join('\n')
|