127 lines
3.5 KiB
JavaScript
127 lines
3.5 KiB
JavaScript
const mysql = require("mysql2/promise");
|
|
const dotenv = require("dotenv");
|
|
const path = require("path");
|
|
|
|
// Load .env from project root (two levels up from bot.js, one level up from this file)
|
|
dotenv.config({ path: path.join(__dirname, "..", ".env") });
|
|
|
|
console.log({
|
|
user: process.env.DB_USER,
|
|
db: process.env.DB_NAME,
|
|
envPath: path.join(__dirname, "..", ".env")
|
|
});
|
|
|
|
const dbConfig = {
|
|
host: process.env.DB_HOST || "127.0.0.1",
|
|
port: Number(process.env.DB_PORT || 3306),
|
|
user: process.env.DB_USER || "root",
|
|
password: process.env.DB_PASSWORD || "",
|
|
};
|
|
|
|
const dbName = process.env.DB_NAME || "eaglertiers";
|
|
|
|
const pool = mysql.createPool({
|
|
...dbConfig,
|
|
database: dbName,
|
|
waitForConnections: true,
|
|
connectionLimit: 10,
|
|
queueLimit: 0,
|
|
});
|
|
|
|
// Test the database connection immediately
|
|
(async () => {
|
|
try {
|
|
const conn = await pool.getConnection();
|
|
console.log("✅ Database connected successfully");
|
|
conn.release();
|
|
} catch (err) {
|
|
console.error("❌ Database connection failed:", err.message);
|
|
// You may want to exit the process if the database is critical
|
|
// process.exit(1);
|
|
}
|
|
})();
|
|
|
|
async function ensureDatabase() {
|
|
const adminPool = mysql.createPool({
|
|
...dbConfig,
|
|
waitForConnections: true,
|
|
connectionLimit: 2,
|
|
queueLimit: 0,
|
|
});
|
|
|
|
const schemaPool = mysql.createPool({
|
|
...dbConfig,
|
|
database: dbName,
|
|
waitForConnections: true,
|
|
connectionLimit: 2,
|
|
queueLimit: 0,
|
|
});
|
|
|
|
try {
|
|
await adminPool.query(`CREATE DATABASE IF NOT EXISTS \`${dbName}\``);
|
|
|
|
await schemaPool.query(`
|
|
CREATE TABLE IF NOT EXISTS players (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
username VARCHAR(32) NOT NULL UNIQUE,
|
|
region ENUM('NA','EU','AS','AU') NOT NULL DEFAULT 'NA',
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
)
|
|
`);
|
|
|
|
try {
|
|
await schemaPool.query(
|
|
"ALTER TABLE players ADD COLUMN IF NOT EXISTS region ENUM('NA','EU','AS','AU') NOT NULL DEFAULT 'NA' AFTER username"
|
|
);
|
|
} catch (error) {
|
|
if (!String(error?.message || "").includes("Duplicate column name")) {
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
await schemaPool.query(`
|
|
CREATE TABLE IF NOT EXISTS player_ranks (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
player_id INT NOT NULL,
|
|
gamemode VARCHAR(32) NOT NULL,
|
|
tier ENUM('HT1','LT1','HT2','LT2','HT3','LT3','HT4','LT4','HT5','LT5') NOT NULL,
|
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
UNIQUE KEY unique_player_gamemode (player_id, gamemode),
|
|
CONSTRAINT fk_player_ranks_player
|
|
FOREIGN KEY (player_id)
|
|
REFERENCES players(id)
|
|
ON DELETE CASCADE
|
|
)
|
|
`);
|
|
|
|
try {
|
|
await schemaPool.query("CREATE INDEX idx_player_ranks_gamemode ON player_ranks (gamemode)");
|
|
} catch (error) {
|
|
if (!String(error?.message || "").includes("Duplicate key name")) {
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
await schemaPool.query(`
|
|
CREATE TABLE IF NOT EXISTS queue_test_tickets (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
discord_user_id VARCHAR(32) NOT NULL,
|
|
tester_discord_id VARCHAR(32) NOT NULL,
|
|
gamemode VARCHAR(32) NOT NULL,
|
|
ticket_channel_id VARCHAR(32) NOT NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_queue_tickets_user_mode_time (discord_user_id, gamemode, created_at)
|
|
)
|
|
`);
|
|
|
|
} finally {
|
|
await schemaPool.end();
|
|
await adminPool.end();
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
pool,
|
|
ensureDatabase,
|
|
};
|