106 lines
2.9 KiB
JavaScript
106 lines
2.9 KiB
JavaScript
const { Pool } = require('pg');
|
|
require('dotenv').config();
|
|
|
|
/**
|
|
* Configuration de la base de données PostgreSQL
|
|
*/
|
|
const dbConfig = {
|
|
user: process.env.DB_USER || 'postgres',
|
|
host: process.env.DB_HOST || 'localhost',
|
|
database: process.env.DB_NAME || 'prd',
|
|
password: process.env.DB_PASSWORD || 'admin',
|
|
port: process.env.DB_PORT || 5432,
|
|
|
|
// Configuration du pool de connexions
|
|
max: parseInt(process.env.DB_POOL_MAX) || 20, // Nombre maximum de connexions dans le pool
|
|
min: parseInt(process.env.DB_POOL_MIN) || 2, // Nombre minimum de connexions maintenues
|
|
idleTimeoutMillis: parseInt(process.env.DB_IDLE_TIMEOUT) || 30000, // Temps d'inactivité avant fermeture
|
|
connectionTimeoutMillis: parseInt(process.env.DB_CONNECTION_TIMEOUT) || 2000, // Timeout pour établir une connexion
|
|
acquireTimeoutMillis: parseInt(process.env.DB_ACQUIRE_TIMEOUT) || 60000, // Timeout pour acquérir une connexion
|
|
|
|
// Configuration SSL si nécessaire
|
|
ssl: process.env.DB_SSL === 'true' ? {
|
|
rejectUnauthorized: process.env.DB_SSL_REJECT_UNAUTHORIZED !== 'false'
|
|
} : false
|
|
};
|
|
|
|
/**
|
|
* Pool de connexions PostgreSQL
|
|
*/
|
|
const pool = new Pool(dbConfig);
|
|
|
|
/**
|
|
* Gestionnaire d'erreur pour le pool
|
|
*/
|
|
pool.on('error', (err) => {
|
|
console.error('PostgreSQL Error:', err);
|
|
});
|
|
|
|
/**
|
|
* Classe pour gérer les opérations de base de données
|
|
*/
|
|
class Database {
|
|
|
|
/**
|
|
* Exécute une requête SQL avec des paramètres
|
|
* @param {string} text - La requête SQL
|
|
* @param {Array} params - Les paramètres de la requête
|
|
* @returns {Promise<Object>} - Le résultat de la requête
|
|
*/
|
|
static async query(text, params) {
|
|
try {
|
|
return await pool.query(text, params);
|
|
} catch (error) {
|
|
console.error('Error executing query:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Teste la connexion à la base de données
|
|
* @returns {Promise<boolean>} - True si la connexion est réussie
|
|
*/
|
|
static async testConnection() {
|
|
try {
|
|
const result = await this.query('SELECT NOW() as current_time');
|
|
console.log('Database connection successful:', result.rows[0].current_time);
|
|
return true;
|
|
} catch (error) {
|
|
console.error('Database connection failed:', error.message);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Ferme toutes les connexions du pool
|
|
* @returns {Promise<void>}
|
|
*/
|
|
static async close() {
|
|
try {
|
|
await pool.end();
|
|
console.log('PostgreSQL connection pool closed');
|
|
} catch (error) {
|
|
console.error('Error closing connection pool:', error);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Gestion propre de l'arrêt de l'application
|
|
*/
|
|
process.on('SIGINT', async () => {
|
|
console.log('SIGINT signal received, closing connections...');
|
|
await Database.close();
|
|
process.exit(0);
|
|
});
|
|
|
|
process.on('SIGTERM', async () => {
|
|
console.log('SIGTERM signal received, closing connections...');
|
|
await Database.close();
|
|
process.exit(0);
|
|
});
|
|
|
|
module.exports = {
|
|
Database
|
|
};
|