124 lines
4.9 KiB
PHP
Executable File
124 lines
4.9 KiB
PHP
Executable File
<?php
|
|
require_once("/opt/wevads/config/credentials.php");
|
|
/**
|
|
* Brain Combo Discovery API — reads REAL brain_winners + brain_configs from DB
|
|
*/
|
|
header('Content-Type: application/json');
|
|
header('Access-Control-Allow-Origin: *');
|
|
|
|
$action = $_GET['action'] ?? $_POST['action'] ?? 'stats';
|
|
|
|
try {
|
|
$pdo = get_pdo("adx_system");
|
|
} catch (PDOException $e) {
|
|
echo json_encode(['status' => 'error', 'message' => 'DB: ' . $e->getMessage()]);
|
|
exit;
|
|
}
|
|
|
|
// Get actual columns from brain_winners
|
|
$winnerCols = [];
|
|
try {
|
|
$stmt = $pdo->query("SELECT column_name FROM information_schema.columns WHERE table_schema='admin' AND table_name='brain_winners' ORDER BY ordinal_position");
|
|
$winnerCols = $stmt->fetchAll(PDO::FETCH_COLUMN);
|
|
} catch (Exception $e) {}
|
|
|
|
switch ($action) {
|
|
case 'stats':
|
|
$total = $pdo->query("SELECT COUNT(*) FROM admin.brain_configs")->fetchColumn();
|
|
$winners = $pdo->query("SELECT COUNT(*) FROM admin.brain_winners")->fetchColumn();
|
|
|
|
// Get avg inbox rate - adapt to actual columns
|
|
$avgInbox = 0;
|
|
if (in_array('inbox_rate', $winnerCols)) {
|
|
$avgInbox = $pdo->query("SELECT COALESCE(AVG(inbox_rate), 0) FROM admin.brain_winners")->fetchColumn();
|
|
} elseif (in_array('success_rate', $winnerCols)) {
|
|
$avgInbox = $pdo->query("SELECT COALESCE(AVG(success_rate), 0) FROM admin.brain_winners")->fetchColumn();
|
|
}
|
|
|
|
// Count distinct ISPs
|
|
$isps = 0;
|
|
if (in_array('isp', $winnerCols)) {
|
|
$isps = $pdo->query("SELECT COUNT(DISTINCT isp) FROM admin.brain_winners")->fetchColumn();
|
|
} elseif (in_array('isp_name', $winnerCols)) {
|
|
$isps = $pdo->query("SELECT COUNT(DISTINCT isp_name) FROM admin.brain_winners")->fetchColumn();
|
|
}
|
|
|
|
echo json_encode([
|
|
'status' => 'ok',
|
|
'data' => [
|
|
'total_configs' => (int)$total,
|
|
'winners' => (int)$winners,
|
|
'avg_inbox' => round((float)$avgInbox, 1),
|
|
'isps_covered' => (int)$isps
|
|
],
|
|
'columns' => $winnerCols
|
|
]);
|
|
break;
|
|
|
|
case 'winners':
|
|
// Build query dynamically based on actual columns
|
|
$cols = implode(', ', array_map(fn($c) => "\"$c\"", $winnerCols));
|
|
$rows = $pdo->query("SELECT $cols FROM admin.brain_winners ORDER BY id DESC LIMIT 20")->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
// Normalize field names for frontend
|
|
$normalized = array_map(function($row) {
|
|
return [
|
|
'isp' => $row['isp'] ?? $row['isp_name'] ?? $row['target_isp'] ?? '—',
|
|
'mua' => $row['mua'] ?? $row['mua_type'] ?? $row['user_agent'] ?? '—',
|
|
'encoding' => $row['encoding'] ?? $row['content_encoding'] ?? '—',
|
|
'x_mailer' => $row['x_mailer'] ?? $row['mailer'] ?? 'none',
|
|
'inbox_rate' => $row['inbox_rate'] ?? $row['success_rate'] ?? 0,
|
|
'status' => 'winner',
|
|
'raw' => $row
|
|
];
|
|
}, $rows);
|
|
|
|
echo json_encode(['status' => 'ok', 'data' => $normalized]);
|
|
break;
|
|
|
|
case 'list':
|
|
// Get brain_configs
|
|
$configCols = [];
|
|
try {
|
|
$stmt = $pdo->query("SELECT column_name FROM information_schema.columns WHERE table_schema='admin' AND table_name='brain_configs' ORDER BY ordinal_position");
|
|
$configCols = $stmt->fetchAll(PDO::FETCH_COLUMN);
|
|
} catch (Exception $e) {}
|
|
|
|
if (!empty($configCols)) {
|
|
$cols = implode(', ', array_map(fn($c) => "\"$c\"", $configCols));
|
|
$rows = $pdo->query("SELECT $cols FROM admin.brain_configs ORDER BY id DESC LIMIT 30")->fetchAll(PDO::FETCH_ASSOC);
|
|
} else {
|
|
$rows = [];
|
|
}
|
|
|
|
$normalized = array_map(function($row) {
|
|
return [
|
|
'id' => $row['id'] ?? '—',
|
|
'combo' => $row['description'] ?? $row['name'] ?? $row['config_name'] ?? json_encode(array_slice($row, 0, 3)),
|
|
'tests' => $row['test_count'] ?? $row['tests'] ?? 0,
|
|
'inbox_rate' => $row['inbox_rate'] ?? $row['success_rate'] ?? 0,
|
|
'status' => $row['status'] ?? $row['is_active'] ?? 'unknown',
|
|
'raw' => $row
|
|
];
|
|
}, $rows);
|
|
|
|
echo json_encode(['status' => 'ok', 'data' => $normalized]);
|
|
break;
|
|
|
|
case 'discover':
|
|
// Trigger a new combo discovery (placeholder — connects to brain engine)
|
|
echo json_encode([
|
|
'status' => 'ok',
|
|
'message' => 'Discovery triggered',
|
|
'brain_tables' => [
|
|
'brain_winners' => count($winnerCols) . ' columns',
|
|
'columns' => $winnerCols
|
|
]
|
|
]);
|
|
break;
|
|
|
|
default:
|
|
echo json_encode(['status' => 'ok', 'message' => 'Brain Combo API', 'actions' => ['stats', 'winners', 'list', 'discover']]);
|
|
}
|
|
?>
|