setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
return $pdo;
}
function ensureTables($pdo) {
$pdo->exec("CREATE TABLE IF NOT EXISTS admin.webhooks (id SERIAL PRIMARY KEY, name VARCHAR(255), url TEXT, method VARCHAR(10) DEFAULT 'POST', headers JSONB, status VARCHAR(50) DEFAULT 'active', last_triggered TIMESTAMP, success_count INTEGER DEFAULT 0, error_count INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT NOW())");
$pdo->exec("CREATE TABLE IF NOT EXISTS admin.webhook_logs (id SERIAL PRIMARY KEY, webhook_id INTEGER, request_body TEXT, response_code INTEGER, response_body TEXT, latency_ms INTEGER, status VARCHAR(50), created_at TIMESTAMP DEFAULT NOW())");
$pdo->exec("CREATE TABLE IF NOT EXISTS admin.webhook_incoming (id SERIAL PRIMARY KEY, endpoint VARCHAR(100), method VARCHAR(10), headers JSONB, body TEXT, ip VARCHAR(50), created_at TIMESTAMP DEFAULT NOW())");
}
function triggerWebhook($webhook, $payload) {
$start = microtime(true);
$ch = curl_init($webhook['url']);
$headers = json_decode($webhook['headers'] ?: '{}', true) ?: [];
$headerList = ['Content-Type: application/json'];
foreach ($headers as $k => $v) $headerList[] = "$k: $v";
curl_setopt_array($ch, [CURLOPT_CUSTOMREQUEST => $webhook['method'], CURLOPT_POSTFIELDS => json_encode($payload), CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => $headerList, CURLOPT_TIMEOUT => 30]);
$response = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ['code' => $code, 'response' => $response, 'latency' => round((microtime(true) - $start) * 1000), 'success' => $code >= 200 && $code < 300];
}
if (isset($_GET['incoming'])) {
$pdo = getDb();
ensureTables($pdo);
$stmt = $pdo->prepare("INSERT INTO admin.webhook_incoming (endpoint, method, headers, body, ip) VALUES (?, ?, ?, ?, ?)");
$stmt->execute([$_GET['incoming'], $_SERVER['REQUEST_METHOD'], json_encode(getallheaders()), file_get_contents('php://input'), $_SERVER['REMOTE_ADDR']]);
echo json_encode(['success' => true, 'id' => $pdo->lastInsertId()]);
exit;
}
if (isset($_GET['action'])) {
header('Content-Type: application/json');
$pdo = getDb();
ensureTables($pdo);
switch ($_GET['action']) {
case 'stats':
$webhooks = $pdo->query("SELECT COUNT(*) FROM admin.webhooks")->fetchColumn();
$today = $pdo->query("SELECT COUNT(*) FROM admin.webhook_logs WHERE created_at > NOW() - INTERVAL '24 hours'")->fetchColumn();
$success = $pdo->query("SELECT COUNT(*) FROM admin.webhook_logs WHERE status = 'success' AND created_at > NOW() - INTERVAL '24 hours'")->fetchColumn();
$incoming = $pdo->query("SELECT COUNT(*) FROM admin.webhook_incoming WHERE created_at > NOW() - INTERVAL '24 hours'")->fetchColumn();
echo json_encode(['webhooks' => (int)$webhooks, 'today' => (int)$today, 'success' => (int)$success, 'incoming' => (int)$incoming]);
break;
case 'list':
echo json_encode($pdo->query("SELECT * FROM admin.webhooks ORDER BY name")->fetchAll(PDO::FETCH_ASSOC));
break;
case 'add':
$stmt = $pdo->prepare("INSERT INTO admin.webhooks (name, url, method, headers) VALUES (?, ?, ?, ?)");
$stmt->execute([$_POST['name'] ?? '', $_POST['url'] ?? '', $_POST['method'] ?? 'POST', $_POST['headers'] ?? '{}']);
echo json_encode(['success' => true]);
break;
case 'delete':
$pdo->exec("DELETE FROM admin.webhooks WHERE id = " . intval($_POST['id'] ?? 0));
echo json_encode(['success' => true]);
break;
case 'trigger':
$id = intval($_POST['id'] ?? 0);
$payload = json_decode($_POST['payload'] ?? '{}', true) ?: [];
$webhook = $pdo->query("SELECT * FROM admin.webhooks WHERE id = $id")->fetch(PDO::FETCH_ASSOC);
if (!$webhook) { echo json_encode(['error' => 'Not found']); break; }
$result = triggerWebhook($webhook, $payload);
$stmt = $pdo->prepare("INSERT INTO admin.webhook_logs (webhook_id, request_body, response_code, response_body, latency_ms, status) VALUES (?, ?, ?, ?, ?, ?)");
$stmt->execute([$id, json_encode($payload), $result['code'], $result['response'], $result['latency'], $result['success'] ? 'success' : 'error']);
$field = $result['success'] ? 'success_count' : 'error_count';
$pdo->exec("UPDATE admin.webhooks SET $field = $field + 1, last_triggered = NOW() WHERE id = $id");
echo json_encode($result);
break;
case 'logs':
$where = isset($_GET['webhook_id']) ? "WHERE webhook_id = " . intval($_GET['webhook_id']) : "";
echo json_encode($pdo->query("SELECT l.*, w.name as webhook_name FROM admin.webhook_logs l LEFT JOIN admin.webhooks w ON l.webhook_id = w.id $where ORDER BY l.created_at DESC LIMIT 100")->fetchAll(PDO::FETCH_ASSOC));
break;
case 'incoming_logs':
echo json_encode($pdo->query("SELECT * FROM admin.webhook_incoming ORDER BY created_at DESC LIMIT 100")->fetchAll(PDO::FETCH_ASSOC));
break;
default:
echo json_encode(['error' => 'Unknown']);
}
exit;
}
$pdo = getDb();
ensureTables($pdo);
$incomingUrl = 'http://' . $_SERVER['HTTP_HOST'] . '/webhook-manager.php?incoming=my-endpoint';
?>
Webhook Manager - WEVAL SEND
Webhook Manager
| Name | URL | Method | OK | Err | Last | Actions |
|---|
| Webhook | Code | Latency | Status | Date |
|---|