import { Kysely, SqliteDialect, sql } from "kysely"; import Database from "better-sqlite3"; import "dotenv/config"; const path = process.env.DATABASE_PATH; if (!path) { throw new Error("DATABASE_PATH environment variable is not defined."); } console.log("Database path", path); const database = new Database(path); database.exec("PRAGMA journal_mode = WAL;"); const dialect = new SqliteDialect({ database }); const db = new Kysely({ dialect }); const migrations = [ db.schema .createTable("letters") .addColumn("id", "integer", (c) => c.primaryKey()) .addColumn("created", "datetime", (c) => c.defaultTo(sql`CURRENT_TIMESTAMP`).notNull()) .addColumn("updated", "datetime", (c) => c.defaultTo(sql`CURRENT_TIMESTAMP`).notNull()) .addColumn("firstName", "text", (c) => c.notNull()) .addColumn("lastName", "text", (c) => c.notNull()) .addColumn("language", "text", (c) => c.notNull()) .addColumn("email", "text", (c) => c.notNull()) .addColumn("phone", "text") .addColumn("variant", "text", (c) => c.notNull()) .addColumn("gender", "text") .addColumn("branch", "text", (c) => c.notNull()) .addColumn("isClient", "boolean", (c) => c.notNull()) .addColumn("message", "text", (c) => c.notNull()) .addColumn("subscribed", "boolean", (c) => c.notNull()) .addColumn("confirmationToken", "text", (c) => c.notNull()) .addColumn("confirmed", "boolean", (c) => c.notNull().defaultTo(false)), ]; async function initMigrationsTable() { await db.schema .createTable("migrations") .ifNotExists() .addColumn("id", "integer", (c) => c.primaryKey()) .addColumn("executedAt", "datetime", (c) => c.defaultTo(sql`CURRENT_TIMESTAMP`).notNull()) .execute(); } async function runMigrations() { initMigrationsTable(); for (const [id, migration] of migrations.entries()) { const migrationRecord = await db .selectFrom("migrations") .where("id", "=", id) .select(["id", "executedAt"]) .executeTakeFirst(); if (migrationRecord) { console.log(id, "|", "at", migrationRecord.executedAt); } else { await migration.execute(); await db.insertInto("migrations").values({ id }).execute(); console.log(id, "|", "now"); } } } runMigrations();