Files
gutscheintracker/lib/db-migrate.ts
T

35 lines
1.6 KiB
TypeScript

import { getDb } from "./db";
/**
* Stellt additive Schema-Änderungen sicher, ohne dass auf dem Server ein
* separater `prisma migrate`-Lauf nötig ist. Idempotent: fehlende Tabellen
* und Spalten werden genau einmal ergänzt, alles andere bleibt unangetastet.
* Best-effort: Fehler werden geloggt, der Start läuft trotzdem weiter.
*/
export async function ensureSchema(): Promise<void> {
try {
const db = getDb();
const tables = (await db.$queryRaw<{ name: string }[]>`SELECT name FROM sqlite_master WHERE type='table'`).map(
(t) => t.name
);
if (!tables.includes("AppSetting")) {
await db.$executeRaw`CREATE TABLE "AppSetting" ("key" TEXT NOT NULL PRIMARY KEY, "value" TEXT NOT NULL, "updatedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP)`;
}
if (!tables.includes("HouseholdMember")) {
await db.$executeRaw`CREATE TABLE "HouseholdMember" ("id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "name" TEXT NOT NULL, "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP)`;
await db.$executeRaw`CREATE UNIQUE INDEX "HouseholdMember_name_key" ON "HouseholdMember"("name")`;
}
const cols = (await db.$queryRaw<{ name: string }[]>`SELECT name FROM pragma_table_info('Voucher')`).map(
(c) => c.name
);
if (!cols.includes("providerDomain")) {
await db.$executeRaw`ALTER TABLE "Voucher" ADD COLUMN "providerDomain" TEXT`;
}
if (!cols.includes("createdBy")) {
await db.$executeRaw`ALTER TABLE "Voucher" ADD COLUMN "createdBy" TEXT`;
}
} catch (err) {
console.error("ensureSchema fehlgeschlagen (Start läuft weiter):", err);
}
}