2026-02-08 03:03:53 -05:00
|
|
|
import sqlite3 from 'sqlite3';
|
|
|
|
|
import { open, Database } from 'sqlite';
|
|
|
|
|
|
|
|
|
|
let db: Database | null = null;
|
|
|
|
|
|
|
|
|
|
export async function getDb() {
|
2026-02-08 03:20:36 -05:00
|
|
|
if (db) return db;
|
2026-02-08 03:03:53 -05:00
|
|
|
|
2026-02-08 03:20:36 -05:00
|
|
|
// Enable verbose mode for debugging
|
|
|
|
|
sqlite3.verbose();
|
2026-02-08 03:03:53 -05:00
|
|
|
|
2026-02-08 03:20:36 -05:00
|
|
|
const dbPath = process.env.DB_PATH || './dashboard.db';
|
2026-02-08 03:03:53 -05:00
|
|
|
|
2026-02-08 03:20:36 -05:00
|
|
|
db = await open({
|
|
|
|
|
filename: dbPath,
|
|
|
|
|
driver: sqlite3.Database
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await db.exec(`
|
2026-02-08 03:03:53 -05:00
|
|
|
CREATE TABLE IF NOT EXISTS uptime_logs (
|
|
|
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
|
|
|
service_name TEXT NOT NULL,
|
|
|
|
|
url TEXT NOT NULL,
|
|
|
|
|
status TEXT NOT NULL,
|
|
|
|
|
latency INTEGER,
|
|
|
|
|
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS visitors (
|
|
|
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
|
|
|
ip_hash TEXT,
|
|
|
|
|
city TEXT,
|
|
|
|
|
country TEXT,
|
|
|
|
|
lat REAL,
|
|
|
|
|
lon REAL,
|
|
|
|
|
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
);
|
2026-02-09 02:05:22 -05:00
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS monitored_services (
|
|
|
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
|
|
|
name TEXT NOT NULL UNIQUE,
|
|
|
|
|
url TEXT NOT NULL,
|
|
|
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
|
|
|
);
|
2026-02-09 03:28:24 -05:00
|
|
|
|
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_uptime_logs_service_timestamp
|
|
|
|
|
ON uptime_logs(service_name, timestamp);
|
2026-02-08 03:03:53 -05:00
|
|
|
`);
|
|
|
|
|
|
2026-02-08 03:20:36 -05:00
|
|
|
return db;
|
2026-02-08 03:03:53 -05:00
|
|
|
}
|