mirror of
https://github.com/myronblair/tomtomgames-app
synced 2026-06-30 17:49:57 -05:00
207 lines
9.9 KiB
PHP
207 lines
9.9 KiB
PHP
<?php
|
||
$key = $_GET['key'] ?? '';
|
||
if ($key !== 'TomGames2024Admin') die('<h2 style="font-family:sans-serif;color:red">Access denied. Add ?key=TomGames2024Admin to URL.</h2>');
|
||
|
||
require_once __DIR__ . '/../includes/config.php';
|
||
|
||
$log = [];
|
||
function ok($msg) { global $log; $log[] = ['t'=>'ok', 'm'=>$msg]; }
|
||
function err($msg) { global $log; $log[] = ['t'=>'err', 'm'=>$msg]; }
|
||
function warn($msg) { global $log; $log[] = ['t'=>'warn','m'=>$msg]; }
|
||
function info($msg) { global $log; $log[] = ['t'=>'info','m'=>$msg]; }
|
||
|
||
try {
|
||
$pdo = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=utf8mb4", DB_USER, DB_PASS,
|
||
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
|
||
ok('Connected to <strong>'.DB_NAME.'</strong> as <strong>'.DB_USER.'</strong>');
|
||
} catch (Exception $e) {
|
||
die('<pre style="color:red">CONNECTION FAILED: '.htmlspecialchars($e->getMessage()).'</pre>');
|
||
}
|
||
|
||
// Helper: check if column exists
|
||
function colExists(PDO $pdo, string $table, string $col): bool {
|
||
$r = $pdo->query("SHOW COLUMNS FROM `$table` LIKE '$col'")->fetch();
|
||
return (bool)$r;
|
||
}
|
||
|
||
// ── CREATE TABLES ───────────────────────────────────────────
|
||
$tables = [
|
||
'users' => "CREATE TABLE IF NOT EXISTS users (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
username VARCHAR(50) UNIQUE NOT NULL,
|
||
password VARCHAR(255) NOT NULL,
|
||
alias VARCHAR(100) NOT NULL,
|
||
email VARCHAR(150) UNIQUE,
|
||
email_verified TINYINT(1) DEFAULT 0,
|
||
tokens DECIMAL(10,2) DEFAULT 0,
|
||
is_admin TINYINT(1) DEFAULT 0,
|
||
status ENUM('active','suspended') DEFAULT 'active',
|
||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||
last_login DATETIME
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
|
||
|
||
'pending_registrations' => "CREATE TABLE IF NOT EXISTS pending_registrations (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
username VARCHAR(50) NOT NULL,
|
||
password VARCHAR(255) NOT NULL,
|
||
alias VARCHAR(100) NOT NULL,
|
||
email VARCHAR(150) NOT NULL,
|
||
token VARCHAR(64) UNIQUE NOT NULL,
|
||
expires_at DATETIME NOT NULL,
|
||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
|
||
|
||
'token_purchases' => "CREATE TABLE IF NOT EXISTS token_purchases (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
user_id INT NOT NULL,
|
||
tokens INT NOT NULL,
|
||
amount_cents INT NOT NULL,
|
||
payment_method VARCHAR(20) DEFAULT 'card',
|
||
square_payment_id VARCHAR(255),
|
||
platform_id VARCHAR(50),
|
||
game_alias VARCHAR(100),
|
||
player_name VARCHAR(100),
|
||
billing_name VARCHAR(160),
|
||
billing_address VARCHAR(200),
|
||
billing_city VARCHAR(80),
|
||
billing_state VARCHAR(2),
|
||
billing_zip VARCHAR(10),
|
||
billing_email VARCHAR(150),
|
||
is_custom TINYINT(1) DEFAULT 0,
|
||
failure_reason TEXT,
|
||
card_brand VARCHAR(30),
|
||
card_last4 VARCHAR(4),
|
||
receipt_url VARCHAR(512),
|
||
status ENUM('pending','completed','failed') DEFAULT 'pending',
|
||
admin_note TEXT,
|
||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||
FOREIGN KEY (user_id) REFERENCES users(id)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
|
||
|
||
'cashout_requests' => "CREATE TABLE IF NOT EXISTS cashout_requests (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
user_id INT NOT NULL,
|
||
platform_id VARCHAR(50) NOT NULL,
|
||
alias VARCHAR(100) NOT NULL,
|
||
tokens DECIMAL(10,2) NOT NULL,
|
||
status ENUM('pending','approved','rejected') DEFAULT 'pending',
|
||
admin_note TEXT,
|
||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||
resolved_at DATETIME,
|
||
FOREIGN KEY (user_id) REFERENCES users(id)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
|
||
|
||
'saved_billing' => "CREATE TABLE IF NOT EXISTS saved_billing (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
user_id INT UNIQUE NOT NULL,
|
||
first_name VARCHAR(80),
|
||
last_name VARCHAR(80),
|
||
email VARCHAR(150),
|
||
address VARCHAR(200),
|
||
city VARCHAR(80),
|
||
state VARCHAR(2),
|
||
zip VARCHAR(10),
|
||
card_brand VARCHAR(30),
|
||
card_last4 VARCHAR(4),
|
||
card_exp_month VARCHAR(2),
|
||
card_exp_year VARCHAR(4),
|
||
sq_card_id VARCHAR(255),
|
||
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
|
||
|
||
'chat_messages' => "CREATE TABLE IF NOT EXISTS chat_messages (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
user_id INT NOT NULL,
|
||
sender ENUM('user','admin') NOT NULL,
|
||
message TEXT NOT NULL,
|
||
is_read TINYINT(1) DEFAULT 0,
|
||
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||
FOREIGN KEY (user_id) REFERENCES users(id)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4",
|
||
];
|
||
|
||
foreach ($tables as $name => $sql) {
|
||
try { $pdo->exec($sql); ok("Table <strong>$name</strong> ✓"); }
|
||
catch (Exception $e) { err("Table <strong>$name</strong>: ".htmlspecialchars($e->getMessage())); }
|
||
}
|
||
|
||
// ── ADD MISSING COLUMNS (compatible with MySQL 5.6/5.7/8) ──
|
||
// Check existence first, then ALTER — works on all MySQL versions
|
||
$addCols = [
|
||
// [table, column, definition, after]
|
||
['token_purchases', 'billing_name', "VARCHAR(160)", 'player_name'],
|
||
['token_purchases', 'billing_address', "VARCHAR(200)", 'billing_name'],
|
||
['token_purchases', 'billing_city', "VARCHAR(80)", 'billing_address'],
|
||
['token_purchases', 'billing_state', "VARCHAR(2)", 'billing_city'],
|
||
['token_purchases', 'billing_zip', "VARCHAR(10)", 'billing_state'],
|
||
['token_purchases', 'billing_email', "VARCHAR(150)", 'billing_zip'],
|
||
['token_purchases', 'is_custom', "TINYINT(1) DEFAULT 0", 'billing_email'],
|
||
['token_purchases', 'failure_reason', "TEXT", 'is_custom'],
|
||
['token_purchases', 'card_brand', "VARCHAR(30)", 'failure_reason'],
|
||
['token_purchases', 'card_last4', "VARCHAR(4)", 'card_brand'],
|
||
['token_purchases', 'receipt_url', "VARCHAR(512)", 'card_last4'],
|
||
['token_purchases', 'admin_note', "TEXT", 'status'],
|
||
['users', 'email_verified', "TINYINT(1) DEFAULT 0", 'email'],
|
||
];
|
||
|
||
foreach ($addCols as [$tbl, $col, $def, $after]) {
|
||
if (colExists($pdo, $tbl, $col)) {
|
||
ok("Column <strong>$tbl.$col</strong> already exists ✓");
|
||
} else {
|
||
try {
|
||
$pdo->exec("ALTER TABLE `$tbl` ADD COLUMN `$col` $def AFTER `$after`");
|
||
ok("Column <strong>$tbl.$col</strong> added ✓");
|
||
} catch (Exception $e) {
|
||
err("Column <strong>$tbl.$col</strong>: ".htmlspecialchars($e->getMessage()));
|
||
}
|
||
}
|
||
}
|
||
|
||
// ── FIX ADMIN email_verified ────────────────────────────────
|
||
try {
|
||
$n = $pdo->exec("UPDATE users SET email_verified=1 WHERE is_admin=1");
|
||
ok("Admin accounts email_verified set to 1 ($n updated)");
|
||
} catch (Exception $e) { warn("Admin fix: ".htmlspecialchars($e->getMessage())); }
|
||
|
||
// ── SUMMARY ─────────────────────────────────────────────────
|
||
$tables_now = $pdo->query("SHOW TABLES")->fetchAll(PDO::FETCH_COLUMN);
|
||
info("All tables: <strong>".implode(', ', $tables_now)."</strong>");
|
||
|
||
try {
|
||
$total = $pdo->query("SELECT COUNT(*) FROM users")->fetchColumn();
|
||
$admins = $pdo->query("SELECT COUNT(*) FROM users WHERE is_admin=1")->fetchColumn();
|
||
info("Users: <strong>$total total</strong>, $admins admin(s)");
|
||
} catch (Exception $e) {}
|
||
?>
|
||
<!DOCTYPE html><html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<title>TomTomGames DB Install</title>
|
||
<style>
|
||
body{font-family:'Segoe UI',sans-serif;background:#0a0a12;color:#e8e8f0;max-width:680px;margin:40px auto;padding:20px}
|
||
h1{font-size:20px;margin-bottom:4px;background:linear-gradient(135deg,#f0c040,#00e5ff);-webkit-background-clip:text;-webkit-text-fill-color:transparent}
|
||
.sub{color:#8888aa;font-size:13px;margin-bottom:24px}
|
||
.row{padding:9px 14px;border-radius:7px;margin-bottom:5px;font-size:13px;display:flex;align-items:flex-start;gap:10px}
|
||
.ok {background:rgba(0,230,118,.08);border:1px solid rgba(0,230,118,.2)}
|
||
.err {background:rgba(255,68,68,.1);border:1px solid rgba(255,68,68,.3);color:#ff9999}
|
||
.warn{background:rgba(255,214,10,.07);border:1px solid rgba(255,214,10,.2);color:#ffd60a}
|
||
.info{background:rgba(0,229,255,.06);border:1px solid rgba(0,229,255,.15);color:#aaddff}
|
||
.ic{flex-shrink:0;font-weight:700}
|
||
.next{background:rgba(240,192,64,.07);border:1px solid rgba(240,192,64,.2);border-radius:10px;padding:16px;margin-top:24px}
|
||
.next h2{color:#f0c040;font-size:14px;margin-bottom:8px}
|
||
.next ol{padding-left:16px;line-height:2;color:#ccccdd;font-size:13px}
|
||
.del{background:rgba(255,68,68,.07);border:1px solid rgba(255,68,68,.2);border-radius:7px;padding:10px 14px;margin-top:14px;font-size:12px;color:#ff9999}
|
||
</style></head><body>
|
||
<h1>🎮 TomTomGames — DB Install / Repair</h1>
|
||
<div class="sub">Database: <strong><?= DB_NAME ?></strong></div>
|
||
<?php foreach ($log as $e): $ic = $e['t']==='ok'?'✓':($e['t']==='err'?'✗':($e['t']==='warn'?'⚠':'ℹ')); ?>
|
||
<div class="row <?= $e['t'] ?>"><span class="ic"><?= $ic ?></span><span><?= $e['m'] ?></span></div>
|
||
<?php endforeach; ?>
|
||
<div class="next"><h2>Next Steps</h2><ol>
|
||
<li>All green ✓? Your database is fully set up</li>
|
||
<li>Visit <strong>/create_admin.php</strong> to create admin account (if needed)</li>
|
||
<li>Visit <strong>https://tomtomgames.com</strong> — app should load normally</li>
|
||
<li><strong>Delete install.php</strong> from your server now</li>
|
||
</ol></div>
|
||
<div class="del">⚠ Delete <code>install.php</code> after use — it exposes DB structure.</div>
|
||
</body></html>
|