From 63df0fe8d6f8126a0cfc49590974b4648fb4b53a Mon Sep 17 00:00:00 2001 From: Hendrik Date: Fri, 1 May 2026 19:36:08 +0200 Subject: [PATCH] =?UTF-8?q?v0.1.15=20=E2=80=94=20self-healing=20sunset=5Fc?= =?UTF-8?q?onfig=20migration:=20check=20schema=20each=20boot,=20not=20just?= =?UTF-8?q?=20setting=20flag?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/db.ts | 11 +++++++++++ package.json | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/db.ts b/lib/db.ts index cd72ab4..4ef7f1b 100644 --- a/lib/db.ts +++ b/lib/db.ts @@ -103,6 +103,11 @@ function setSettingDirect(db: Database.Database, key: string, value: string) { db.prepare("INSERT INTO settings (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value").run(key, value); } +function hasColumn(db: Database.Database, table: string, col: string): boolean { + const cols = db.prepare(`PRAGMA table_info(${table})`).all() as { name: string }[]; + return cols.some((c) => c.name === col); +} + function runMigrations(db: Database.Database) { // m_301_to_302: switch existing 301-redirects to 302 so browser-cache stops eating hits. if (getSettingDirect(db, "m_301_to_302") !== "done") { @@ -110,6 +115,12 @@ function runMigrations(db: Database.Database) { db.prepare("UPDATE domain_groups SET redirect_code = 302 WHERE redirect_code = 301").run(); setSettingDirect(db, "m_301_to_302", "done"); } + + // sunset_config column: self-healing — always check schema regardless of setting flag. + if (!hasColumn(db, "domains", "sunset_config")) { + db.exec("ALTER TABLE domains ADD COLUMN sunset_config TEXT"); + } + setSettingDirect(db, "m_sunset_column", "done"); } export function getSetting(key: string): string | null { diff --git a/package.json b/package.json index a815c98..d6f8c1c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "corex-nexredirect", - "version": "0.1.14", + "version": "0.1.15", "license": "MIT", "overrides": { "postcss": "^8.5.13",