Files
eagler-tiers/server/db.js
starified 08bf320b57 uploaded
2026-04-21 22:03:19 -04:00

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,
};