aboutsummaryrefslogtreecommitdiff
path: root/api/debug/ingest.php
diff options
context:
space:
mode:
authorAgando <roduccomm@gmail.com>2026-07-29 20:46:12 +0200
committerAgando <roduccomm@gmail.com>2026-07-29 20:46:12 +0200
commit0003ad95fa091353827198d0a45cd63a3784479f (patch)
tree4ea79302c13f34b2f1b84a56ed33cc149cd99a21 /api/debug/ingest.php
parentcf7461ffeb4f53f3f50c9c692a2e4fdcecf17e82 (diff)
auto: 2026-07-29_20:50 changes — gunes sponsorluk page, bunq payment modal, AI platforms, news W30
Diffstat (limited to 'api/debug/ingest.php')
-rw-r--r--api/debug/ingest.php117
1 files changed, 117 insertions, 0 deletions
diff --git a/api/debug/ingest.php b/api/debug/ingest.php
new file mode 100644
index 0000000..363dd09
--- /dev/null
+++ b/api/debug/ingest.php
@@ -0,0 +1,117 @@
+<?php
+require_once __DIR__ . '/config.php';
+
+if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
+ error_response('Method not allowed', 405);
+}
+
+$raw = file_get_contents('php://input');
+if (!$raw) error_response('Empty request body');
+
+$payload = json_decode($raw, true);
+if (!$payload || !isset($payload['errors']) || !is_array($payload['errors'])) {
+ error_response('Invalid payload: expected { errors: [...], session: {...} }');
+}
+
+$errors = $payload['errors'];
+$session = $payload['session'] ?? [];
+$clientVersion = $payload['version'] ?? 'unknown';
+
+// Validate batch size
+if (count($errors) > MAX_ERRORS_PER_BATCH) {
+ $errors = array_slice($errors, 0, MAX_ERRORS_PER_BATCH);
+}
+if (strlen($raw) > MAX_BATCH_SIZE_KB * 1024) {
+ error_response('Payload too large (max ' . MAX_BATCH_SIZE_KB . 'KB)', 413);
+}
+
+// Load existing data
+$allErrors = load_json(ERRORS_FILE);
+$sessions = load_json(SESSIONS_FILE);
+
+$sessionId = $session['id'] ?? ('anon_' . bin2hex(random_bytes(4)));
+$ingested = 0;
+$now = date('c');
+
+// Update session metadata
+if (!isset($sessions[$sessionId])) {
+ $sessions[$sessionId] = [
+ 'id' => $sessionId,
+ 'first_seen' => $now,
+ 'version' => $clientVersion,
+ 'modules' => $session['modules'] ?? [],
+ 'user_agent' => $_SERVER['HTTP_USER_AGENT'] ?? '',
+ 'ip' => $_SERVER['REMOTE_ADDR'] ?? '',
+ 'error_count' => 0,
+ ];
+}
+$sessions[$sessionId]['last_seen'] = $now;
+$sessions[$sessionId]['error_count'] += count($errors);
+$sessions[$sessionId]['version'] = $clientVersion;
+
+// Build a lookup of existing hashes for dedup
+$existingHashes = [];
+foreach ($allErrors as $idx => $existing) {
+ $h = $existing['hash'] ?? '';
+ if ($h) {
+ $existingHashes[$h] = $idx;
+ }
+}
+
+// Ingest each error (dedup by hash)
+foreach ($errors as $e) {
+ $hash = $e['hash'] ?? md5(($e['message'] ?? '') . '|' . ($e['source'] ?? '') . '|' . ($e['type'] ?? ''));
+
+ if (isset($existingHashes[$hash])) {
+ // Update existing entry
+ $idx = $existingHashes[$hash];
+ $allErrors[$idx]['count'] += $e['count'] ?? 1;
+ $allErrors[$idx]['last_seen'] = $e['lastSeen'] ?? $now;
+ $allErrors[$idx]['ingested_at'] = $now;
+ if (!empty($e['stack'])) {
+ $allErrors[$idx]['stack'] = substr($e['stack'], 0, 2000);
+ }
+ $ingested++;
+ continue;
+ }
+
+ $entry = [
+ 'hash' => $hash,
+ 'message' => substr($e['message'] ?? '', 0, 500),
+ 'type' => $e['type'] ?? 'unknown',
+ 'severity' => $e['severity'] ?? 'error',
+ 'category' => $e['category'] ?? 'runtime',
+ 'source' => $e['source'] ?? '',
+ 'module' => $e['module'] ?? null,
+ 'stack' => isset($e['stack']) ? substr($e['stack'], 0, 2000) : null,
+ 'session_id' => $sessionId,
+ 'count' => $e['count'] ?? 1,
+ 'first_seen' => $e['firstSeen'] ?? $now,
+ 'last_seen' => $e['lastSeen'] ?? $now,
+ 'ingested_at' => $now,
+ ];
+
+ $allErrors[] = $entry;
+ $existingHashes[$hash] = count($allErrors) - 1;
+ $ingested++;
+}
+
+// Trim to last 10,000 errors (ring buffer)
+if (count($allErrors) > 10000) {
+ $allErrors = array_slice($allErrors, -10000);
+}
+
+save_json(ERRORS_FILE, $allErrors);
+save_json(SESSIONS_FILE, $sessions);
+
+// Rebuild clusters asynchronously (flag file)
+$rebuildFlag = DEBUG_DATA_DIR . '/.rebuild_clusters';
+file_put_contents($rebuildFlag, time());
+
+json_response([
+ 'success' => true,
+ 'ingested' => $ingested,
+ 'session_id' => $sessionId,
+ 'total_errors' => count($allErrors),
+ 'total_sessions' => count($sessions),
+]);