true, 'service' => 'slc-feedback', 'hint' => 'POST JSON to store feedback']); exit; } $raw = file_get_contents('php://input'); if ($raw === false || strlen($raw) === 0 || strlen($raw) > 65536) { http_response_code(400); echo json_encode(['ok' => false, 'error' => 'empty or oversized body']); exit; } $data = json_decode($raw, true); if (!is_array($data)) { http_response_code(400); echo json_encode(['ok' => false, 'error' => 'invalid json']); exit; } // Serverseitigen Eingangszeitstempel + Roh-Metadaten ergänzen (nicht überschreibend). $data['_received'] = gmdate('c'); $data['_ip'] = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : null; // Datenverzeichnis: per Env SLC_FEEDBACK_DIR überschreibbar (empfohlen: AUSSERHALB // des Web-Roots, dann ist die Datei nicht öffentlich abrufbar und git pull bleibt sauber). // Default: ./feedback-data neben diesem Skript (ist per .gitignore aus der Versionierung). $dir = getenv('SLC_FEEDBACK_DIR') ?: (__DIR__ . '/feedback-data'); $file = rtrim($dir, '/') . '/feedback.jsonl'; if (!is_dir($dir)) { @mkdir($dir, 0775, true); } $line = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n"; $fp = @fopen($file, 'ab'); if ($fp === false) { http_response_code(500); echo json_encode(['ok' => false, 'error' => 'cannot open data file (Schreibrechte prüfen)']); exit; } flock($fp, LOCK_EX); fwrite($fp, $line); flock($fp, LOCK_UN); fclose($fp); echo json_encode(['ok' => true]);