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; $dir = __DIR__ . '/feedback-data'; $file = $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]);