SLC_Game/04_Tablet-Quiz/app/feedback.php
breitenbach76 029a12151e Feedback-Collector serverfest: Datenpfad konfigurierbar + Doku fuer php-fpm
Vorbereitung fuer Server-Deploy (Server hat kein PHP; nginx vorhanden, PHP 8.3 im Repo installierbar):

- feedback.php: Datenverzeichnis ueber Env SLC_FEEDBACK_DIR ueberschreibbar
  (empfohlen ausserhalb des Web-Roots -> keine git-pull-Konflikte, .jsonl nicht
  oeffentlich). Default unveraendert ./feedback-data. Weiterhin NUR PHP-Core noetig,
  keine Extensions.
- .gitignore: 04_Tablet-Quiz/app/feedback-data/ ausgenommen (falls Default-Pfad).
- DEPLOY.md: konkrete Schritte fuer Ubuntu 24.04 + nginx (apt install php-fpm,
  Socket php8.3-fpm, NUR feedback.php als PHP ausfuehren = Hardening, feedback-data
  per deny all schuetzen, SLC_FEEDBACK_DIR setzen) + curl-Verifikation.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 09:04:41 +02:00

61 lines
2.3 KiB
PHP

<?php
/**
* SLC-Workshop — minimaler Feedback-Sammelpunkt (Referenz-Implementierung).
*
* Nimmt einen JSON-POST der Companion-App entgegen und hängt ihn als eine Zeile
* (JSON Lines) an eine Datei an. Kein Framework, keine Datenbank, keine Secrets.
*
* Auswertung später: die Datei `feedback-data/feedback.jsonl` einlesen (jede Zeile
* ein JSON-Objekt) — z. B. nach JSON/CSV konvertieren.
*
* Voraussetzung: PHP (php-fpm) ist auf dem Webserver aktiv und dieser Pfad wird
* von der App aus erreicht (gleiche Domain). Schreibrechte aufs Datenverzeichnis
* sind nötig. Alternativen (Node/Caddy) siehe DEPLOY.md.
*/
header('Content-Type: application/json; charset=utf-8');
// Nur POST erlaubt (GET nur als simpler Health-Check).
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
echo json_encode(['ok' => 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]);