const mysql = require('mysql2/promise'); const logger = require('../utils/logger'); class Database { constructor() { this.pool = null; } async connect() { try { this.pool = mysql.createPool({ host: process.env.DB_HOST || 'localhost', port: process.env.DB_PORT || 3306, user: process.env.DB_USER || 'root', password: process.env.DB_PASSWORD || '', database: process.env.DB_NAME || 'ai_agent_iot', waitForConnections: true, connectionLimit: 10, queueLimit: 0, acquireTimeout: 60000, charset: 'utf8mb4' }); // Test the connection const connection = await this.pool.getConnection(); await connection.ping(); connection.release(); logger.info('Database connection pool created successfully'); } catch (error) { logger.error('Database connection failed:', error); throw error; } } async disconnect() { if (this.pool) { await this.pool.end(); logger.info('Database connection pool closed'); } } async query(sql, params = []) { try { const [rows] = await this.pool.execute(sql, params); return rows; } catch (error) { logger.error('Database query error:', error); throw error; } } async transaction(callback) { const connection = await this.pool.getConnection(); try { await connection.beginTransaction(); const result = await callback(connection); await connection.commit(); return result; } catch (error) { await connection.rollback(); throw error; } finally { connection.release(); } } async healthCheck() { try { await this.query('SELECT 1 as health'); return true; } catch (error) { logger.error('Database health check failed:', error); return false; } } } module.exports = new Database();