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} - 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} - 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} */ 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 };