103 lines
2.9 KiB
JavaScript
103 lines
2.9 KiB
JavaScript
const mysql = require('mysql2/promise');
|
|
require('dotenv').config();
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
// Create connection pool for better performance
|
|
const getSSLConfig = () => {
|
|
const useSSL = String(process.env.DB_SSL || '').toLowerCase() === 'true';
|
|
const caPath = process.env.DB_SSL_CA_PATH;
|
|
if (!useSSL) return undefined;
|
|
|
|
try {
|
|
if (caPath) {
|
|
const resolved = path.resolve(caPath);
|
|
if (fs.existsSync(resolved)) {
|
|
console.log('🔐 Loading DB CA certificate from:', resolved);
|
|
return {
|
|
ca: fs.readFileSync(resolved),
|
|
rejectUnauthorized: false // Allow self-signed / custom CA
|
|
};
|
|
} else {
|
|
console.warn('⚠️ CA file not found at path:', resolved, '- proceeding with rejectUnauthorized:false');
|
|
}
|
|
} else {
|
|
console.warn('⚠️ DB_SSL_CA_PATH not set - proceeding with empty CA and rejectUnauthorized:false');
|
|
}
|
|
} catch (e) {
|
|
console.warn('⚠️ Failed to load CA file:', e.message, '- proceeding with empty CA and rejectUnauthorized:false');
|
|
}
|
|
|
|
// Fallback: still provide object so mysql2 enables TLS
|
|
return {
|
|
rejectUnauthorized: false
|
|
};
|
|
};
|
|
|
|
const NODE_ENV = process.env.NODE_ENV || 'development';
|
|
|
|
let dbConfig;
|
|
if (NODE_ENV === 'development') {
|
|
dbConfig = {
|
|
host: process.env.DEV_DB_HOST || 'localhost',
|
|
port: Number(process.env.DEV_DB_PORT) || 3306,
|
|
user: process.env.DEV_DB_USER || 'root',
|
|
password: process.env.DEV_DB_PASSWORD || '', // XAMPP default: no password
|
|
database: process.env.DEV_DB_NAME || 'profitplanet_centralserver',
|
|
// Do NOT use SSL for development/XAMPP
|
|
ssl: undefined
|
|
};
|
|
} else {
|
|
dbConfig = {
|
|
host: process.env.DB_HOST,
|
|
port: Number(process.env.DB_PORT) || 3306,
|
|
user: process.env.DB_USER,
|
|
password: process.env.DB_PASSWORD,
|
|
database: process.env.DB_NAME,
|
|
ssl: getSSLConfig()
|
|
};
|
|
}
|
|
|
|
const pool = mysql.createPool({
|
|
...dbConfig,
|
|
waitForConnections: true,
|
|
connectionLimit: 10,
|
|
queueLimit: 0
|
|
});
|
|
|
|
console.log('📊 MySQL connection pool created (SSL:', !!process.env.DB_SSL, ')');
|
|
|
|
module.exports = {
|
|
// Execute query with parameters
|
|
async execute(query, params = []) {
|
|
try {
|
|
const [rows] = await pool.execute(query, params);
|
|
return rows;
|
|
} catch (error) {
|
|
console.error('💥 Database query error:', error.message);
|
|
throw error;
|
|
}
|
|
},
|
|
// Alias for execute to maintain compatibility
|
|
async query(query, params = []) {
|
|
return await pool.execute(query, params);
|
|
},
|
|
// Get single row
|
|
async get(query, params = []) {
|
|
const rows = await this.execute(query, params);
|
|
return rows[0] || null;
|
|
},
|
|
// Get all rows
|
|
async all(query, params = []) {
|
|
return await this.execute(query, params);
|
|
},
|
|
// Close pool
|
|
async close() {
|
|
await pool.end();
|
|
console.log('📊 MySQL connection pool closed');
|
|
},
|
|
// Get a connection from the pool
|
|
async getConnection() {
|
|
return await pool.getConnection();
|
|
}
|
|
}; |