94 lines
2.5 KiB
JavaScript
94 lines
2.5 KiB
JavaScript
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<import('pg').PoolClient>}
|
|
*/
|
|
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
|
|
}; |