2026-06-01 21:44:29 +07:00
|
|
|
import { drizzle } from "drizzle-orm/node-postgres";
|
|
|
|
|
import { Pool } from "pg";
|
|
|
|
|
import { config } from "../config/index.js";
|
2026-06-02 21:06:42 +07:00
|
|
|
import { createChildLogger } from "@bete/shared/logger";
|
2026-06-01 21:44:29 +07:00
|
|
|
|
|
|
|
|
const logger = createChildLogger("database");
|
|
|
|
|
|
|
|
|
|
let pool: Pool | null = null;
|
|
|
|
|
let db: ReturnType<typeof drizzle> | null = null;
|
|
|
|
|
|
|
|
|
|
export async function initializeDatabase() {
|
|
|
|
|
if (db) {
|
|
|
|
|
logger.warn("Database already initialized");
|
|
|
|
|
return db;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const databaseUrl =
|
|
|
|
|
config.DATABASE_URL ||
|
|
|
|
|
`postgresql://${config.DATABASE_USER}${config.DATABASE_PASSWORD ? `:${config.DATABASE_PASSWORD}` : ""}@${config.DATABASE_HOST}:${config.DATABASE_PORT}/${config.DATABASE_NAME}`;
|
|
|
|
|
|
|
|
|
|
pool = new Pool({
|
|
|
|
|
connectionString: databaseUrl,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
pool.on("error", (err) => {
|
|
|
|
|
logger.error({ err }, "Unexpected error on idle client");
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const client = await pool.connect();
|
|
|
|
|
client.release();
|
|
|
|
|
logger.info("Database connection successful");
|
|
|
|
|
} catch (err) {
|
|
|
|
|
logger.error({ err }, "Failed to connect to database");
|
|
|
|
|
throw err;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
db = drizzle(pool);
|
|
|
|
|
return db;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function getDatabase() {
|
|
|
|
|
if (!db) {
|
|
|
|
|
throw new Error(
|
|
|
|
|
"Database not initialized. Call initializeDatabase() first.",
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
return db;
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-02 00:11:29 +07:00
|
|
|
export function getPool() {
|
|
|
|
|
if (!pool) {
|
|
|
|
|
throw new Error(
|
|
|
|
|
"Database not initialized. Call initializeDatabase() first.",
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
return pool;
|
|
|
|
|
}
|
|
|
|
|
|
2026-06-01 21:44:29 +07:00
|
|
|
export async function closeDatabase() {
|
|
|
|
|
if (pool) {
|
|
|
|
|
await pool.end();
|
|
|
|
|
pool = null;
|
|
|
|
|
db = null;
|
|
|
|
|
logger.info("Database connection closed");
|
|
|
|
|
}
|
|
|
|
|
}
|