← back to Professional Directory
agents/shared/db.js
48 lines
/**
* Professional Directory — Shared DB pool.
*
* Migrated 2026-05-04 (tick 23 of overnight YOLO loop) from a standalone
* `new Pool({...})` to a thin CJS wrapper around directory-core/db. All
* @pd/shared consumers continue to `require('@pd/shared')` unchanged.
*
* Doctor-specific behaviors PRESERVED on top of the shared pool:
* - Slow-query warning (>1s)
* - Error logging w/ truncated query preview
* - pool.on('error') listener
* - Default DATABASE_URL fallback if env unset
*
* CJS-importing-ESM works on Node 22.12+ (require(esm) feature). Mac is
* 22.14, Kamatera is 22.22 — both safe.
*/
require('dotenv').config({ path: require('path').resolve(__dirname, '../../.env') });
// Doctor's historical default DATABASE_URL — set BEFORE requiring directory-core/db
// so its lazy-pool initialization picks it up if .env doesn't override.
process.env.DATABASE_URL ??= 'postgresql:///doctor_professional_directory?host=/tmp&user=stevestudio2';
// require(esm) — Node 22.12+ feature. directory-core ships ESM-only.
const { pool, query: coreQuery, withTx } = require('directory-core/db');
pool.on('error', (err) => {
console.error(`[${new Date().toISOString()}] [db] Unexpected pool error:`, err.message);
});
// Wrap directory-core's query with doctor-specific slow-query + error logging.
async function query(text, params) {
const start = Date.now();
try {
const result = await coreQuery(text, params);
const duration = Date.now() - start;
if (duration > 1000) {
console.warn(`[${new Date().toISOString()}] [db] Slow (${duration}ms): ${text.slice(0, 80)}…`);
}
return result;
} catch (err) {
console.error(`[${new Date().toISOString()}] [db] Query error: ${err.message}`);
console.error(`[${new Date().toISOString()}] [db] Query: ${text.slice(0, 120)}`);
throw err;
}
}
module.exports = { pool, query, withTx };