← back to Rentv Adintel

db/index.js

44 lines

'use strict';
/**
 * Postgres connection pool — the single source of truth (spec §5).
 * House convention: local unix socket at /tmp, database `rentv_advertisers`.
 * DATABASE_URL overrides for production / CI.
 */
const { Pool } = require('pg');

const pool = process.env.DATABASE_URL
  ? new Pool({ connectionString: process.env.DATABASE_URL })
  : new Pool({
      host: process.env.PGHOST || '/tmp',
      database: process.env.PGDATABASE || 'rentv_advertisers',
      user: process.env.PGUSER || process.env.USER,
      max: 10,
    });

pool.on('error', (err) => {
  // eslint-disable-next-line no-console
  console.error('[db] idle client error', err.message);
});

async function query(text, params) {
  return pool.query(text, params);
}

/** Convenience: run inside a transaction, auto rollback on throw. */
async function tx(fn) {
  const client = await pool.connect();
  try {
    await client.query('BEGIN');
    const out = await fn(client);
    await client.query('COMMIT');
    return out;
  } catch (e) {
    await client.query('ROLLBACK');
    throw e;
  } finally {
    client.release();
  }
}

module.exports = { pool, query, tx };