shared/lib/db/alert-schema.ts

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')