70 lines
1.8 KiB
TypeScript
70 lines
1.8 KiB
TypeScript
import { Pool, PoolConfig, PoolClient } from 'pg';
|
|
|
|
// Re-export PoolClient for use in services
|
|
export type { PoolClient };
|
|
import { config } from './index.js';
|
|
import { logger } from '../shared/utils/logger.js';
|
|
|
|
const poolConfig: PoolConfig = {
|
|
host: config.database.host,
|
|
port: config.database.port,
|
|
database: config.database.name,
|
|
user: config.database.user,
|
|
password: config.database.password,
|
|
max: 20,
|
|
idleTimeoutMillis: 30000,
|
|
connectionTimeoutMillis: 2000,
|
|
};
|
|
|
|
export const pool = new Pool(poolConfig);
|
|
|
|
pool.on('connect', () => {
|
|
logger.debug('New database connection established');
|
|
});
|
|
|
|
pool.on('error', (err) => {
|
|
logger.error('Unexpected database error', { error: err.message });
|
|
});
|
|
|
|
export async function testConnection(): Promise<boolean> {
|
|
try {
|
|
const client = await pool.connect();
|
|
const result = await client.query('SELECT NOW()');
|
|
client.release();
|
|
logger.info('Database connection successful', { timestamp: result.rows[0].now });
|
|
return true;
|
|
} catch (error) {
|
|
logger.error('Database connection failed', { error: (error as Error).message });
|
|
return false;
|
|
}
|
|
}
|
|
|
|
export async function query<T = any>(text: string, params?: any[]): Promise<T[]> {
|
|
const start = Date.now();
|
|
const result = await pool.query(text, params);
|
|
const duration = Date.now() - start;
|
|
|
|
logger.debug('Query executed', {
|
|
text: text.substring(0, 100),
|
|
duration: `${duration}ms`,
|
|
rows: result.rowCount
|
|
});
|
|
|
|
return result.rows as T[];
|
|
}
|
|
|
|
export async function queryOne<T = any>(text: string, params?: any[]): Promise<T | null> {
|
|
const rows = await query<T>(text, params);
|
|
return rows[0] || null;
|
|
}
|
|
|
|
export async function getClient() {
|
|
const client = await pool.connect();
|
|
return client;
|
|
}
|
|
|
|
export async function closePool(): Promise<void> {
|
|
await pool.end();
|
|
logger.info('Database pool closed');
|
|
}
|