Atlas: Infrastruktur + Team-Konventionen + Sprachregel Lernarbeit
- Design-System (assets/css/design-system.css) mit 21 Komponenten, iPad-Responsive-Breakpoints, Touch-Ziele 36px, Music-Player, Glossar-Tooltips - Templates (sims/template.html + student/teacher-Dashboard) - Docs: module-interface.md (inkl. 4a Sprachregel, 4b Leichte Sprache, 4c iPad), content-architecture.md, crash-recovery.md, music-registry.md - Admin-Infrastruktur: admin-modules.html + api/admin-modules.php (Titel, Emoji, Bild, Status, Dauer, Alter pro Modul) - Inbox-System: _inbox/README.md + _status.md fuer Atlas + Briefings an Klima, Glossar, Lehrplan, Fluss - Zentrale SFX-Pipeline (scripts/generate-sounds.py) - DALL-E-Bilder: 8 Badges + 5 Glossar-Repraesentationsbilder (Querformat) - Logo + Inter-Font lokal - PHP-APIs: admin, glossar, levels, licenses, progress, waypoints, assignments, profile, tickets - Spielsprache entfernt (admin-modules, admin-levels, schueler) - Landing-Page-Bearbeitungen (Boote sichtbarer, Button-Hintergrund) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
/**
|
||||
* API: Klassen-Simulationen (Aufgaben/Hausübungen)
|
||||
* GET /api/assignments?class_id=X → Aktive Aufgaben einer Klasse
|
||||
* GET /api/assignments?student=1 → Aufgaben für eingeloggten Schüler*in
|
||||
* POST /api/assignments {action} → Aufgabe erstellen/beenden
|
||||
*/
|
||||
|
||||
$method = $_SERVER['REQUEST_METHOD'];
|
||||
$db = Database::get();
|
||||
|
||||
if ($method === 'GET') {
|
||||
// Schüler*innen-Ansicht
|
||||
if (isset($_GET['student']) && $_GET['student'] === '1') {
|
||||
$sessionId = Session::requireStudent();
|
||||
$session = $db->fetchOne('SELECT class_id FROM student_sessions WHERE id = ?', [$sessionId]);
|
||||
if (!$session || !$session['class_id']) Response::ok([]);
|
||||
|
||||
$assignments = $db->fetchAll(
|
||||
'SELECT a.id, a.module_id, a.level, a.starts_at, a.ends_at, a.created_at
|
||||
FROM class_assignments a
|
||||
WHERE a.class_id = ? AND a.active = 1 AND a.starts_at <= NOW() AND (a.ends_at IS NULL OR a.ends_at > NOW())
|
||||
ORDER BY a.created_at DESC',
|
||||
[$session['class_id']]
|
||||
);
|
||||
Response::ok($assignments);
|
||||
}
|
||||
|
||||
// Lehrperson-Ansicht
|
||||
$teacherId = Session::requireTeacher();
|
||||
$classId = (int)($_GET['class_id'] ?? 0);
|
||||
if (!$classId) Response::error('class_id erforderlich');
|
||||
|
||||
$class = $db->fetchOne('SELECT id FROM classes WHERE id = ? AND teacher_id = ?', [$classId, $teacherId]);
|
||||
if (!$class) Response::error('Klasse nicht gefunden', 404);
|
||||
|
||||
$assignments = $db->fetchAll(
|
||||
'SELECT id, module_id, level, starts_at, ends_at, active, created_at FROM class_assignments WHERE class_id = ? ORDER BY created_at DESC',
|
||||
[$classId]
|
||||
);
|
||||
Response::ok($assignments);
|
||||
}
|
||||
|
||||
if ($method === 'POST') {
|
||||
$teacherId = Session::requireTeacher();
|
||||
$body = json_decode(file_get_contents('php://input'), true);
|
||||
$action = $body['action'] ?? '';
|
||||
|
||||
if ($action === 'create') {
|
||||
$classId = (int)($body['classId'] ?? 0);
|
||||
$moduleId = $body['moduleId'] ?? '';
|
||||
$level = max(1, min(5, (int)($body['level'] ?? 1)));
|
||||
$endsAt = !empty($body['endsAt']) ? $body['endsAt'] : null;
|
||||
|
||||
if (!$classId || !$moduleId) Response::error('classId und moduleId erforderlich');
|
||||
|
||||
$class = $db->fetchOne('SELECT id FROM classes WHERE id = ? AND teacher_id = ?', [$classId, $teacherId]);
|
||||
if (!$class) Response::error('Klasse nicht gefunden', 404);
|
||||
|
||||
// Vorherige aktive Aufgabe für dieses Modul deaktivieren
|
||||
$db->execute(
|
||||
'UPDATE class_assignments SET active = 0 WHERE class_id = ? AND module_id = ? AND active = 1',
|
||||
[$classId, $moduleId]
|
||||
);
|
||||
|
||||
$db->execute(
|
||||
'INSERT INTO class_assignments (class_id, teacher_id, module_id, level, starts_at, ends_at) VALUES (?, ?, ?, ?, NOW(), ?)',
|
||||
[$classId, $teacherId, $moduleId, $level, $endsAt]
|
||||
);
|
||||
Response::ok(['id' => (int)$db->lastInsertId()]);
|
||||
}
|
||||
|
||||
if ($action === 'stop') {
|
||||
$assignmentId = (int)($body['assignmentId'] ?? 0);
|
||||
if (!$assignmentId) Response::error('assignmentId erforderlich');
|
||||
$db->execute(
|
||||
'UPDATE class_assignments SET active = 0, ends_at = NOW() WHERE id = ? AND teacher_id = ?',
|
||||
[$assignmentId, $teacherId]
|
||||
);
|
||||
Response::ok();
|
||||
}
|
||||
|
||||
Response::error('Unbekannte Aktion');
|
||||
}
|
||||
|
||||
Response::error('Methode nicht erlaubt', 405);
|
||||
Reference in New Issue
Block a user