null]); $key = $_GET['key'] ?? ''; if (!$key || strlen($key) > 100) Response::error('key fehlt oder zu lang'); // Optional: module_id mitgeben → erlaubt es, Saves bei aktivem // Lehrer-Auftrag (mode='teacher_started') zu unterdrücken, damit der // Schüler frisch in den Auftrag startet. Sobald der Auftrag durch ein // assessment-Eintrag (submitted_at > started_at) abgeschlossen ist, // greift wieder der normale Save-Resume. $moduleId = $_GET['module_id'] ?? ''; if ($moduleId !== '' && strlen($moduleId) <= 32) { $session = $db->fetchOne( 'SELECT class_id FROM student_sessions WHERE id = ?', [$sessionId] ); if ($session && $session['class_id']) { $cm = $db->fetchOne( 'SELECT mode, started_at FROM class_modules WHERE class_id = ? AND module_id = ?', [$session['class_id'], $moduleId] ); if ($cm && $cm['mode'] === 'teacher_started' && $cm['started_at']) { $completed = $db->fetchOne( 'SELECT 1 FROM assessments WHERE session_id = ? AND sim_id = ? AND submitted_at > ? LIMIT 1', [$sessionId, $moduleId, $cm['started_at']] ); if (!$completed) { // Aktiver, noch nicht erledigter Lehrer-Auftrag → frisch starten. Response::json(['data' => null, 'version' => null, 'fresh' => 'teacher_started']); } } } } $row = $db->fetchOne( 'SELECT save_data, save_version FROM game_saves WHERE session_id = ? AND save_key = ?', [$sessionId, $key] ); Response::json(['data' => $row ? $row['save_data'] : null, 'version' => $row ? (int)$row['save_version'] : null]); } if ($method === 'POST') { $sessionId = Session::requireStudent(); $body = json_decode(file_get_contents('php://input'), true); // Klima 2D/3D senden 'save_key'/'save_data', historische Sims 'key'/'data'. $key = $body['key'] ?? $body['save_key'] ?? null; $data = $body['data'] ?? $body['save_data'] ?? null; if (!$body || $key === null || $data === null) { Response::error('key und data erforderlich'); } if (!is_string($data)) $data = json_encode($data, JSON_UNESCAPED_UNICODE); if (strlen($key) > 100 || strlen($data) > 500000) { Response::error('Payload zu gross', 413); } $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)', [$sessionId, $key, $data, $body['version'] ?? 2] ); Response::ok(); } Response::error('Methode nicht erlaubt', 405);