Files
geograsim/App/php/api/logistik-saves.php
T
Adminator 1e51ef7def Nachtrag: alle bisher untracked Ordner + hängende Änderungen mit-committen
- Konzept/, didaktik_geografie/, didaktik_simulation/, v2-modules/, v2-platform/
- 12 code-workspace-Files
- STATUS-*.md
- viele M/D/R-Änderungen an bereits getrackten Files
- .gitignore verstärkt: **/.humaninput/, **/secret_keys.txt

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-07-08 02:27:02 +02:00

93 lines
2.8 KiB
PHP

<?php
/**
* API: Logistik-Savegames
*
* GET /api/logistik-saves?slot=1
* -> laedt Savegame-Slot (slot = 1..5, default 1)
*
* POST /api/logistik-saves {slot: 1, data: "...", version: 1}
* -> speichert Savegame
*
* DELETE /api/logistik-saves?slot=1
* -> loescht Savegame
*
* Persistiert in der generischen game_saves-Tabelle mit Namespace-Key
* "logistik:save:<slot>". Keine eigene Tabelle noetig.
*
* Security: Session-ID validiert gegen student_sessions; keine fremden
* Saves abrufbar.
*/
$method = $_SERVER['REQUEST_METHOD'];
$db = Database::get();
/** Session pruefen, gegen student_sessions validieren. */
function lgs_requireValidStudent(): string {
$sid = Session::requireStudent();
$db = Database::get();
$row = $db->fetchOne('SELECT id FROM student_sessions WHERE id = ?', [$sid]);
if (!$row) {
http_response_code(401);
echo json_encode(['error' => 'Session ungueltig']);
exit;
}
return $sid;
}
function lgs_slotKey($slot): string {
$slot = max(1, min(5, (int)$slot));
return 'logistik:save:' . $slot;
}
if ($method === 'GET') {
$sid = lgs_requireValidStudent();
$slot = (int)($_GET['slot'] ?? 1);
$key = lgs_slotKey($slot);
$row = $db->fetchOne(
'SELECT save_data, save_version, updated_at FROM game_saves WHERE session_id = ? AND save_key = ?',
[$sid, $key]
);
if (!$row) Response::ok(['data' => null, 'slot' => $slot]);
Response::ok([
'slot' => $slot,
'data' => $row['save_data'],
'version' => (int)$row['save_version'],
'updatedAt' => $row['updated_at'],
]);
}
if ($method === 'POST') {
$sid = lgs_requireValidStudent();
$body = json_decode(file_get_contents('php://input'), true);
if (!is_array($body) || !isset($body['data'])) {
Response::error('data-Feld fehlt', 400);
}
$slot = (int)($body['slot'] ?? 1);
$key = lgs_slotKey($slot);
$data = is_string($body['data']) ? $body['data'] : json_encode($body['data']);
if (strlen($data) > 500000) Response::error('Payload zu gross (>500KB)', 413);
$version = (int)($body['version'] ?? 1);
$db->execute(
'INSERT INTO game_saves (session_id, save_key, save_data, save_version)
VALUES (?, ?, ?, ?)
ON DUPLICATE KEY UPDATE save_data = VALUES(save_data), save_version = VALUES(save_version)',
[$sid, $key, $data, $version]
);
Response::ok(['slot' => $slot, 'saved' => true]);
}
if ($method === 'DELETE') {
$sid = lgs_requireValidStudent();
$slot = (int)($_GET['slot'] ?? 1);
$key = lgs_slotKey($slot);
$db->execute(
'DELETE FROM game_saves WHERE session_id = ? AND save_key = ?',
[$sid, $key]
);
Response::ok(['slot' => $slot, 'deleted' => true]);
}
Response::error('Methode nicht erlaubt', 405);