Files
weval-consulting/api/wevads-v2-api.php

158 lines
8.6 KiB
PHP

<?php
require_once __DIR__ . '/_secrets.php';
// WEVADS IA v2 — Live API
// Connects to S95 PostgreSQL (adx_system) via private network
header("Content-Type: application/json; charset=utf-8");
header("Access-Control-Allow-Origin: *");
$action = $_GET['action'] ?? '';
if (!$action) die(json_encode(["error" => "action required"]));
try {
$pdo = new PDO("pgsql:host=10.1.0.3;port=5432;dbname=adx_system", "admin", weval_secret('WEVAL_PG_ADMIN_PASS'), [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_TIMEOUT => 5
]);
} catch (Exception $e) {
die(json_encode(["error" => "DB connection failed", "detail" => $e->getMessage()]));
}
// === DASHBOARD ===
if ($action === 'dashboard') {
$kpis = [];
try { $kpis['campaigns'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.campaigns")->fetchColumn(); } catch(Exception $e) { $kpis['campaigns'] = 0; }
try { $kpis['campaigns_active'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.campaigns WHERE status='active'")->fetchColumn(); } catch(Exception $e) { $kpis['campaigns_active'] = 0; }
try { $kpis['campaigns_draft'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.campaigns WHERE status='draft'")->fetchColumn(); } catch(Exception $e) { $kpis['campaigns_draft'] = 0; }
try { $kpis['contacts'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.send_contacts")->fetchColumn(); } catch(Exception $e) {
try { $kpis['contacts'] = (int)$pdo->query("SELECT COUNT(*) FROM ethica.medecins_real")->fetchColumn(); } catch(Exception $e2) { $kpis['contacts'] = 0; }
}
try { $kpis['contacts_email'] = (int)$pdo->query("SELECT COUNT(*) FROM ethica.medecins_real WHERE email IS NOT NULL AND email != ''")->fetchColumn(); } catch(Exception $e) { $kpis['contacts_email'] = 0; }
try { $kpis['emails_sent'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.unified_send_log")->fetchColumn(); } catch(Exception $e) { $kpis['emails_sent'] = 0; }
try { $kpis['senders_active'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.office_accounts WHERE status='active'")->fetchColumn(); } catch(Exception $e) { $kpis['senders_active'] = 0; }
try { $kpis['senders_capacity'] = (int)$pdo->query("SELECT COALESCE(SUM(daily_limit),0) FROM admin.office_accounts WHERE status='active'")->fetchColumn(); } catch(Exception $e) { $kpis['senders_capacity'] = 0; }
$recent = [];
try {
$s = $pdo->query("SELECT id, name, subject_line, status, created_at FROM admin.campaigns ORDER BY created_at DESC LIMIT 10");
$recent = $s->fetchAll(PDO::FETCH_ASSOC);
} catch(Exception $e) {}
die(json_encode(["kpis" => $kpis, "recent_campaigns" => $recent]));
}
// === CAMPAIGNS ===
if ($action === 'campaigns') {
$camps = [];
$total = 0;
try {
$total = (int)$pdo->query("SELECT COUNT(*) FROM admin.campaigns")->fetchColumn();
$s = $pdo->query("SELECT id, name, subject_line, status, created_at, target_count, sent_count FROM admin.campaigns ORDER BY created_at DESC LIMIT 100");
$camps = $s->fetchAll(PDO::FETCH_ASSOC);
} catch(Exception $e) {}
die(json_encode(["total" => $total, "campaigns" => $camps]));
}
// === CONTACTS ===
if ($action === 'contacts') {
$page = max(1, (int)($_GET['page'] ?? 1));
$limit = 30;
$offset = ($page - 1) * $limit;
$data = ["total" => 0, "by_pays" => [], "by_spec" => [], "contacts" => [], "page" => $page, "pages" => 1];
try {
$data['total'] = (int)$pdo->query("SELECT COUNT(*) FROM ethica.medecins_real")->fetchColumn();
$data['pages'] = max(1, ceil($data['total'] / $limit));
$data['by_pays'] = $pdo->query("SELECT pays, COUNT(*) as c FROM ethica.medecins_real WHERE pays IS NOT NULL GROUP BY pays ORDER BY c DESC")->fetchAll(PDO::FETCH_ASSOC);
$data['by_spec'] = $pdo->query("SELECT specialite, COUNT(*) as c FROM ethica.medecins_real WHERE specialite IS NOT NULL AND specialite != '' GROUP BY specialite ORDER BY c DESC LIMIT 20")->fetchAll(PDO::FETCH_ASSOC);
$s = $pdo->prepare("SELECT nom, prenom, specialite, ville, pays, email, telephone, source FROM ethica.medecins_real ORDER BY id DESC LIMIT ? OFFSET ?");
$s->execute([$limit, $offset]);
$data['contacts'] = $s->fetchAll(PDO::FETCH_ASSOC);
} catch(Exception $e) { $data['error'] = $e->getMessage(); }
die(json_encode($data));
}
// === TEMPLATES ===
if ($action === 'templates') {
$tpls = [];
try {
$s = $pdo->query("SELECT id, name, subject_line, category, brand, created_at FROM admin.creative_templates ORDER BY created_at DESC LIMIT 50");
$tpls = $s->fetchAll(PDO::FETCH_ASSOC);
} catch(Exception $e) {
// Fallback: try creatives table
try {
$s = $pdo->query("SELECT id, name, subject_line, category, created_at FROM admin.creatives ORDER BY created_at DESC LIMIT 50");
$tpls = $s->fetchAll(PDO::FETCH_ASSOC);
} catch(Exception $e2) {}
}
die(json_encode(["templates" => $tpls]));
}
// === SEND ENGINE ===
if ($action === 'send_engine') {
$data = [
"method" => "O365 SMTP",
"pmta" => ["configured" => 4, "alive" => 0, "ips" => ["159.138.28.67","159.138.19.43","159.138.18.197","159.138.8.202"]],
"o365" => ["active" => 0, "capacity" => 0],
"send_log" => ["total" => 0, "today" => 0]
];
try { $data['o365']['active'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.office_accounts WHERE status='active'")->fetchColumn(); } catch(Exception $e) {}
try { $data['o365']['capacity'] = (int)$pdo->query("SELECT COALESCE(SUM(daily_limit),0) FROM admin.office_accounts WHERE status='active'")->fetchColumn(); } catch(Exception $e) {}
try { $data['send_log']['total'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.unified_send_log")->fetchColumn(); } catch(Exception $e) {}
try { $data['send_log']['today'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.unified_send_log WHERE created_at > CURRENT_DATE")->fetchColumn(); } catch(Exception $e) {}
// Check PMTA servers alive
foreach ($data['pmta']['ips'] as $ip) {
$sock = @fsockopen($ip, 25, $errno, $errstr, 2);
if ($sock) { $data['pmta']['alive']++; fclose($sock); }
}
die(json_encode($data));
}
// === SENDERS ===
if ($action === 'senders') {
$senders = [];
try {
$s = $pdo->query("SELECT email, daily_limit, status, sent_today FROM admin.office_accounts ORDER BY status DESC, email LIMIT 50");
$senders = $s->fetchAll(PDO::FETCH_ASSOC);
} catch(Exception $e) {
// Fallback columns
try {
$s = $pdo->query("SELECT email, daily_limit, status FROM admin.office_accounts ORDER BY email LIMIT 50");
$senders = $s->fetchAll(PDO::FETCH_ASSOC);
} catch(Exception $e2) {}
}
die(json_encode(["senders" => $senders]));
}
// === ANALYTICS ===
if ($action === 'analytics') {
$data = ["send_configs" => 0, "brain_winners" => 0, "brain_tests" => 0, "domains" => 0];
try { $data['send_configs'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.send_configs")->fetchColumn(); } catch(Exception $e) {}
try { $data['brain_winners'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.brain_winners")->fetchColumn(); } catch(Exception $e) {}
try { $data['brain_tests'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.brain_tests")->fetchColumn(); } catch(Exception $e) {}
try { $data['domains'] = (int)$pdo->query("SELECT COUNT(*) FROM admin.domains")->fetchColumn(); } catch(Exception $e) {}
try {
$data['recent_sends'] = $pdo->query("SELECT id, campaign_id, status, created_at FROM admin.unified_send_log ORDER BY created_at DESC LIMIT 20")->fetchAll(PDO::FETCH_ASSOC);
} catch(Exception $e) { $data['recent_sends'] = []; }
die(json_encode($data));
}
// === MODULES ===
if ($action === 'modules') {
$modules = [
["name" => "Brain Engine", "status" => "active", "desc" => "AI decision engine — 9 SACRED winners"],
["name" => "Send Engine", "status" => "active", "desc" => "O365 SMTP + PMTA hybrid"],
["name" => "Ethica HCP", "status" => "active", "desc" => "59,175 HCPs — MA/TN/DZ"],
["name" => "Tracking", "status" => "active", "desc" => "S151 open/click tracking → S3"],
["name" => "DKIM Manager", "status" => "active", "desc" => "Auto DKIM rotation"],
["name" => "Warmup Engine", "status" => "paused", "desc" => "IP/domain warmup automation"],
["name" => "Dark Scout", "status" => "paused", "desc" => "Competitor intelligence"],
["name" => "Harvester", "status" => "paused", "desc" => "Lead generation automation"]
];
die(json_encode(["modules" => $modules]));
}
die(json_encode(["error" => "Unknown action: $action"]));