diff --git a/src/database/migrate.ts b/src/database/migrate.ts index 9570451..fa3df42 100644 --- a/src/database/migrate.ts +++ b/src/database/migrate.ts @@ -1,28 +1,43 @@ import "dotenv/config"; import Database from "better-sqlite3"; +import { drizzle as drizzleSqlite } from "drizzle-orm/better-sqlite3"; import { migrate as migrateSqlite } from "drizzle-orm/better-sqlite3/migrator"; -import { migrate } from "drizzle-orm/node-postgres/migrator"; +import { migrate as migratePostgres } from "drizzle-orm/node-postgres/migrator"; import { config } from "../config"; import { createChildLogger } from "../logger"; -import { initializeDatabase } from "./drizzle"; +import { closeDatabase, initializeDatabase } from "./drizzle"; const logger = createChildLogger("migrate"); +export function initializeMigrationSqliteDatabase(path = ".muxer-queue.db") { + const sqlite = new Database(path); + sqlite.pragma("journal_mode = WAL"); + return { sqlite, db: drizzleSqlite(sqlite) }; +} + export async function runMigrations(): Promise { try { logger.info("Starting database migrations"); if (config.DATABASE_TYPE === "postgres") { logger.info("Running PostgreSQL migrations"); - const db = await initializeDatabase(); - await migrate(db as any, { migrationsFolder: "./drizzle/migrations" }); + const db = (await initializeDatabase()) as Parameters< + typeof migratePostgres + >[0]; + try { + await migratePostgres(db, { migrationsFolder: "./drizzle/migrations" }); + } finally { + await closeDatabase(); + } logger.info("PostgreSQL migrations completed successfully"); } else { logger.info("Running SQLite migrations"); - const sqlite = new Database(".muxer-queue.db"); - sqlite.pragma("journal_mode = WAL"); - const db = require("drizzle-orm/better-sqlite3").drizzle(sqlite); - migrateSqlite(db, { migrationsFolder: "./drizzle/migrations" }); + const { sqlite, db } = initializeMigrationSqliteDatabase(); + try { + migrateSqlite(db, { migrationsFolder: "./drizzle/migrations" }); + } finally { + sqlite.close(); + } logger.info("SQLite migrations completed successfully"); } } catch (error) { @@ -34,8 +49,7 @@ export async function runMigrations(): Promise { } } -// Run migrations if called directly -if (require.main === module) { +if (import.meta.url === `file://${process.argv[1]}`) { runMigrations() .then(() => { logger.info("Migrations completed"); diff --git a/tests/database/migrate.test.ts b/tests/database/migrate.test.ts new file mode 100644 index 0000000..53072cd --- /dev/null +++ b/tests/database/migrate.test.ts @@ -0,0 +1,21 @@ +import { mkdtempSync, rmSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { describe, expect, it } from "vitest"; +import { initializeMigrationSqliteDatabase } from "../../src/database/migrate"; + +describe("initializeMigrationSqliteDatabase", () => { + it("creates a SQLite DB with WAL journal mode", () => { + const dir = mkdtempSync(join(tmpdir(), "bete-migrate-")); + const dbPath = join(dir, "test.db"); + const { sqlite, db } = initializeMigrationSqliteDatabase(dbPath); + + try { + expect(db).toBeDefined(); + expect(sqlite.pragma("journal_mode", { simple: true })).toBe("wal"); + } finally { + sqlite.close(); + rmSync(dir, { recursive: true, force: true }); + } + }); +});