Files
epaper-display/display/middleware/src/db/migrations/001-initial.ts
T
christianandClaude Sonnet 4.6 e760853781 refactor: migrate from node-sqlite3-wasm to better-sqlite3
Replace all db.run(sql, [params]) calls with db.prepare(sql).run(...params)
across all source modules and test files. Also remove the node-sqlite3-wasm
import from tests/db.test.ts and update the type annotation accordingly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 21:17:44 +02:00

128 lines
4.0 KiB
TypeScript

import Database from 'better-sqlite3';
export function migrate001(db: Database): void {
db.exec(`
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
created_at TEXT DEFAULT (datetime('now'))
);
CREATE TABLE IF NOT EXISTS mqtt_brokers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
host TEXT NOT NULL,
port INTEGER DEFAULT 1883,
username TEXT,
password TEXT,
use_tls INTEGER DEFAULT 0,
enabled INTEGER DEFAULT 1,
status TEXT DEFAULT 'disconnected',
created_at TEXT DEFAULT (datetime('now')),
updated_at TEXT DEFAULT (datetime('now'))
);
CREATE TABLE IF NOT EXISTS mqtt_topics (
id INTEGER PRIMARY KEY AUTOINCREMENT,
broker_id INTEGER NOT NULL,
topic TEXT NOT NULL,
json_path TEXT,
selected INTEGER DEFAULT 0,
ignored INTEGER DEFAULT 0,
last_payload TEXT,
discovered_at TEXT DEFAULT (datetime('now')),
FOREIGN KEY (broker_id) REFERENCES mqtt_brokers(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS pg_sources (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
host TEXT NOT NULL,
port INTEGER DEFAULT 5432,
database_name TEXT NOT NULL,
username TEXT NOT NULL,
password TEXT NOT NULL,
use_tls INTEGER DEFAULT 0,
enabled INTEGER DEFAULT 1,
status TEXT DEFAULT 'disconnected',
created_at TEXT DEFAULT (datetime('now'))
);
CREATE TABLE IF NOT EXISTS pg_queries (
id INTEGER PRIMARY KEY AUTOINCREMENT,
source_id INTEGER NOT NULL,
name TEXT NOT NULL,
query TEXT NOT NULL,
interval_sec INTEGER DEFAULT 60,
result_column TEXT NOT NULL,
last_result TEXT,
last_run_at TEXT,
FOREIGN KEY (source_id) REFERENCES pg_sources(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS datapoints (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
label TEXT NOT NULL,
unit TEXT,
value TEXT,
status TEXT DEFAULT 'unknown',
source_type TEXT NOT NULL CHECK(source_type IN ('mqtt','postgresql')),
source_id INTEGER NOT NULL,
topic_id INTEGER,
query_id INTEGER,
transform TEXT,
enabled INTEGER DEFAULT 1,
updated_at TEXT DEFAULT (datetime('now')),
FOREIGN KEY (topic_id) REFERENCES mqtt_topics(id) ON DELETE SET NULL,
FOREIGN KEY (query_id) REFERENCES pg_queries(id) ON DELETE SET NULL
);
CREATE TABLE IF NOT EXISTS layouts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
type TEXT DEFAULT 'free' CHECK(type IN ('free','grid')),
width INTEGER DEFAULT 800,
height INTEGER DEFAULT 480,
grid_cols INTEGER,
grid_rows INTEGER,
created_at TEXT DEFAULT (datetime('now'))
);
CREATE TABLE IF NOT EXISTS layout_elements (
id INTEGER PRIMARY KEY AUTOINCREMENT,
layout_id INTEGER NOT NULL,
datapoint_id INTEGER,
type TEXT NOT NULL CHECK(type IN ('value','label','line','rect')),
x INTEGER NOT NULL DEFAULT 0,
y INTEGER NOT NULL DEFAULT 0,
width INTEGER,
height INTEGER,
font_size INTEGER DEFAULT 24,
font_weight TEXT DEFAULT 'normal',
text_align TEXT DEFAULT 'left',
icon TEXT,
style TEXT DEFAULT 'plain' CHECK(style IN ('plain','card')),
static_text TEXT,
grid_col INTEGER,
grid_row INTEGER,
sort_order INTEGER DEFAULT 0,
FOREIGN KEY (layout_id) REFERENCES layouts(id) ON DELETE CASCADE,
FOREIGN KEY (datapoint_id) REFERENCES datapoints(id) ON DELETE SET NULL
);
CREATE TABLE IF NOT EXISTS displays (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
description TEXT,
layout_id INTEGER,
api_token TEXT,
last_seen TEXT,
refresh_sec INTEGER DEFAULT 300,
created_at TEXT DEFAULT (datetime('now')),
FOREIGN KEY (layout_id) REFERENCES layouts(id) ON DELETE SET NULL
);
`);
}