← 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 };