From b5766b0850a4689dd123a6afb022c4382f408d23 Mon Sep 17 00:00:00 2001 From: Nyk <0xnykcd@googlemail.com> Date: Fri, 27 Feb 2026 20:07:50 +0700 Subject: [PATCH] fix: enable foreign_keys pragma and add missing indexes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add `PRAGMA foreign_keys = ON` to db.ts — without this, all ON DELETE CASCADE constraints across 7 tables are silently ignored (SQLite disables foreign keys by default) - Add migration 015 with indexes on hot query paths: notifications(read_at), notifications(recipient, read_at), activities(actor), activities(entity_type, entity_id), messages(read_at) --- README.md | 2 +- src/lib/db.ts | 1 + src/lib/migrations.ts | 12 ++++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7502fd1..a4fde11 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ mission-control/ │ ├── lib/ │ │ ├── auth.ts # Session + API key auth, RBAC │ │ ├── db.ts # SQLite (better-sqlite3, WAL mode) -│ │ ├── migrations.ts # 14 schema migrations +│ │ ├── migrations.ts # 15 schema migrations │ │ ├── scheduler.ts # Background task scheduler │ │ ├── webhooks.ts # Outbound webhook delivery │ │ └── websocket.ts # Gateway WebSocket client diff --git a/src/lib/db.ts b/src/lib/db.ts index 5d2bbd1..53d6eaa 100644 --- a/src/lib/db.ts +++ b/src/lib/db.ts @@ -23,6 +23,7 @@ export function getDatabase(): Database.Database { db.pragma('journal_mode = WAL'); db.pragma('synchronous = NORMAL'); db.pragma('cache_size = 1000'); + db.pragma('foreign_keys = ON'); // Initialize schema if needed initializeSchema(); diff --git a/src/lib/migrations.ts b/src/lib/migrations.ts index 68b8446..d90e180 100644 --- a/src/lib/migrations.ts +++ b/src/lib/migrations.ts @@ -424,6 +424,18 @@ const migrations: Migration[] = [ db.exec(`CREATE INDEX IF NOT EXISTS idx_users_provider ON users(provider)`) db.exec(`CREATE INDEX IF NOT EXISTS idx_users_email ON users(email)`) } + }, + { + id: '015_missing_indexes', + up: (db) => { + db.exec(` + CREATE INDEX IF NOT EXISTS idx_notifications_read_at ON notifications(read_at); + CREATE INDEX IF NOT EXISTS idx_notifications_recipient_read ON notifications(recipient, read_at); + CREATE INDEX IF NOT EXISTS idx_activities_actor ON activities(actor); + CREATE INDEX IF NOT EXISTS idx_activities_entity ON activities(entity_type, entity_id); + CREATE INDEX IF NOT EXISTS idx_messages_read_at ON messages(read_at); + `) + } } ]