server/drizzle/db.ts
Jesse Wierzbinski c764cc044d
fix: 🚑 Sleep process instead of exiting it on error
Avoids Docker's auto-restart policy from causing infinite reboots and hanging the system
2024-06-13 23:44:46 -10:00

66 lines
1.9 KiB
TypeScript

import { drizzle } from "drizzle-orm/node-postgres";
import { migrate } from "drizzle-orm/postgres-js/migrator";
import { LogLevel, LogManager, type MultiLogManager } from "log-manager";
import { Client } from "pg";
import { config } from "~/packages/config-manager";
import * as schema from "./schema";
export const client = new Client({
host: config.database.host,
port: Number(config.database.port),
user: config.database.username,
password: config.database.password,
database: config.database.database,
});
export const setupDatabase = async (
logger: LogManager | MultiLogManager = new LogManager(Bun.stdout),
info = true,
) => {
try {
await client.connect();
} catch (e) {
if (
(e as Error).message ===
"Client has already been connected. You cannot reuse a client."
) {
return;
}
await logger.logError(LogLevel.Critical, "Database", e as Error);
await logger.log(
LogLevel.Critical,
"Database",
"Failed to connect to database. Please check your configuration.",
);
// Hang until Ctrl+C is pressed
await Bun.sleep(Number.POSITIVE_INFINITY);
}
// Migrate the database
info &&
(await logger.log(LogLevel.Info, "Database", "Migrating database..."));
try {
await migrate(db, {
migrationsFolder: "./drizzle/migrations",
});
} catch (e) {
await logger.logError(LogLevel.Critical, "Database", e as Error);
await logger.log(
LogLevel.Critical,
"Database",
"Failed to migrate database. Please check your configuration.",
);
// Hang until Ctrl+C is pressed
await Bun.sleep(Number.POSITIVE_INFINITY);
}
info && (await logger.log(LogLevel.Info, "Database", "Database migrated"));
};
export const db = drizzle(client, { schema });