const { Pool } = require('pg'); const config = { user: process.env.DB_USER, password: process.env.DB_PASSWORD, host: process.env.DB_HOST, port: process.env.DB_PORT, max: 10, idleTimeoutMillis: 30000, connectionTimeoutMillis: 5000 } const pools = { data: new Pool({ ...config, database: process.env.DATA_DB }), users: new Pool({ ...config, database: process.env.USERS_DB }), sensors: new Pool({ ...config, database: process.env.SENSOR_DB || 'users' }) } Object.entries(pools).forEach(([name, pool]) => { pool.on('error', (err) => { console.error(`Error in ${name} pool`, err); }) }); /** * * @param {'users' | 'references'} db - the name of the database * @returns {Promise} */ async function getClient(db) { const pool = pools[db]; if (!pool) throw new Error(`Database pool type ${db} does not exist`); console.log(`Acquiring client for ${db} database... with config:`, config); return await pool.connect(); } /** * Esegue una query sul database specificato * @param {string} text - Query SQL * @param {any[]} params - Parametri * @param {'users' | 'references'} name - Quale DB usare */ async function query(text, params, name = 'users') { const client = await getClient(name); try { return await client.query(text, params); } catch (error) { console.error(`[DB Query Error on ${name}]`, error.message); throw error; } finally { client.release(); } } /** * Inserisce una riga in una tabella */ async function append(table, data, type = 'users') { const keys = Object.keys(data); const values = Object.values(data); const placeholders = keys.map((_, i) => `$${i + 1}`).join(', '); const columns = keys.join(', '); const sql = `INSERT INTO ${table} (${columns}) VALUES (${placeholders}) RETURNING *`; return await query(sql, values, type); } /** * Rimuove una riga */ async function remove(table, condition, params, type = 'users') { const sql = `DELETE FROM ${table} WHERE ${condition}`; return await query(sql, params, type); } async function checkPostgres() { const status = {}; for (const [name, pool] of Object.entries(pools)) { try { await pool.query('SELECT NOW()'); status[name] = 'connected'; } catch (error) { status[name] = 'disconnected'; } } return status; } module.exports = { query, append, remove, getClient, checkPostgres, pools };