2024-04-11 13:39:07 +02:00
|
|
|
import { drizzle } from "drizzle-orm/node-postgres";
|
2024-04-14 12:36:25 +02:00
|
|
|
import { migrate } from "drizzle-orm/postgres-js/migrator";
|
2024-05-29 02:51:55 +02:00
|
|
|
import { LogLevel, LogManager, type MultiLogManager } from "log-manager";
|
2024-04-13 14:20:12 +02:00
|
|
|
import { Client } from "pg";
|
2024-06-13 01:10:40 +02:00
|
|
|
import { config } from "~/packages/config-manager";
|
2024-04-11 13:39:07 +02:00
|
|
|
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,
|
|
|
|
|
});
|
|
|
|
|
|
2024-05-07 09:41:02 +02:00
|
|
|
export const setupDatabase = async (
|
2024-05-29 02:51:55 +02:00
|
|
|
logger: LogManager | MultiLogManager = new LogManager(Bun.stdout),
|
2024-05-07 09:41:02 +02:00
|
|
|
info = true,
|
|
|
|
|
) => {
|
2024-04-14 10:12:41 +02:00
|
|
|
try {
|
|
|
|
|
await client.connect();
|
|
|
|
|
} catch (e) {
|
2024-05-13 23:36:46 +02:00
|
|
|
if (
|
|
|
|
|
(e as Error).message ===
|
|
|
|
|
"Client has already been connected. You cannot reuse a client."
|
2024-06-13 04:26:43 +02:00
|
|
|
) {
|
2024-05-13 23:36:46 +02:00
|
|
|
return;
|
2024-06-13 04:26:43 +02:00
|
|
|
}
|
2024-05-13 23:36:46 +02:00
|
|
|
|
2024-06-13 04:26:43 +02:00
|
|
|
await logger.logError(LogLevel.Critical, "Database", e as Error);
|
2024-04-14 10:12:41 +02:00
|
|
|
|
|
|
|
|
await logger.log(
|
2024-06-13 04:26:43 +02:00
|
|
|
LogLevel.Critical,
|
2024-04-14 10:12:41 +02:00
|
|
|
"Database",
|
|
|
|
|
"Failed to connect to database. Please check your configuration.",
|
|
|
|
|
);
|
2024-06-14 11:26:20 +02:00
|
|
|
process.exit();
|
2024-04-14 10:12:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Migrate the database
|
2024-05-07 09:41:02 +02:00
|
|
|
info &&
|
2024-06-13 04:26:43 +02:00
|
|
|
(await logger.log(LogLevel.Info, "Database", "Migrating database..."));
|
2024-04-14 10:12:41 +02:00
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
await migrate(db, {
|
2024-06-13 01:10:40 +02:00
|
|
|
migrationsFolder: "./drizzle/migrations",
|
2024-04-14 10:12:41 +02:00
|
|
|
});
|
|
|
|
|
} catch (e) {
|
2024-06-13 04:26:43 +02:00
|
|
|
await logger.logError(LogLevel.Critical, "Database", e as Error);
|
2024-04-14 10:12:41 +02:00
|
|
|
await logger.log(
|
2024-06-13 04:26:43 +02:00
|
|
|
LogLevel.Critical,
|
2024-04-14 10:12:41 +02:00
|
|
|
"Database",
|
|
|
|
|
"Failed to migrate database. Please check your configuration.",
|
|
|
|
|
);
|
2024-06-14 11:26:20 +02:00
|
|
|
process.exit();
|
2024-04-14 10:12:41 +02:00
|
|
|
}
|
|
|
|
|
|
2024-06-13 04:26:43 +02:00
|
|
|
info && (await logger.log(LogLevel.Info, "Database", "Database migrated"));
|
2024-04-14 10:12:41 +02:00
|
|
|
};
|
|
|
|
|
|
2024-04-11 13:39:07 +02:00
|
|
|
export const db = drizzle(client, { schema });
|