Fix Flutter exam parsing, make exams tab dynamic from API, and add intelligent exam resolution to submitExam

This commit is contained in:
Hamza-Ayed
2026-09-03 16:59:14 +03:00
parent 0a61e32033
commit 445a1aa0e3
3 changed files with 206 additions and 100 deletions
+51 -1
View File
@@ -88,7 +88,21 @@ class ExamController
$isTeacher = ($request->role === 'teacher' || $request->role === 'super_admin');
$exam = Database::selectOne("SELECT * FROM exams WHERE id = ? LIMIT 1", [$examId]);
if (!$exam || $examId === 1 || (str_contains($exam['title'] ?? '', 'الوحدة الأولى') && count(Database::select("SELECT id FROM questions WHERE exam_id = ?", [$examId])) < 15)) {
if (!$exam) {
// Fallback: Find published unit exam with questions
$exam = Database::selectOne(
"SELECT e.* FROM exams e
JOIN questions q ON q.exam_id = e.id
WHERE e.is_published = 1 AND (e.scope = 'unit_exam' OR e.scope = 'unit_comprehensive')
GROUP BY e.id HAVING COUNT(q.id) >= 10
ORDER BY e.id DESC LIMIT 1"
);
if ($exam) {
$examId = (int)$exam['id'];
}
}
if (!$exam || (count(Database::select("SELECT id FROM questions WHERE exam_id = ?", [$examId])) < 15)) {
$examId = self::seedUnit1ComprehensiveExam();
$exam = Database::selectOne("SELECT * FROM exams WHERE id = ? LIMIT 1", [$examId]);
}
@@ -194,6 +208,42 @@ class ExamController
$timeSpent = (int)($body['time_spent_seconds'] ?? 0);
$exam = Database::selectOne("SELECT * FROM exams WHERE id = ? LIMIT 1", [$examId]);
if (!$exam) {
// 1. Resolve exam from submitted question IDs
if (!empty($answers) && is_array($answers)) {
$firstQId = (int)($answers[0]['question_id'] ?? 0);
if ($firstQId > 0) {
$qRow = Database::selectOne("SELECT exam_id FROM questions WHERE id = ? LIMIT 1", [$firstQId]);
if ($qRow && !empty($qRow['exam_id'])) {
$examId = (int)$qRow['exam_id'];
$exam = Database::selectOne("SELECT * FROM exams WHERE id = ? LIMIT 1", [$examId]);
}
}
}
// 2. Resolve to latest published unit exam with questions
if (!$exam) {
$exam = Database::selectOne(
"SELECT e.* FROM exams e
JOIN questions q ON q.exam_id = e.id
WHERE e.is_published = 1 AND (e.scope = 'unit_exam' OR e.scope = 'unit_comprehensive')
GROUP BY e.id HAVING COUNT(q.id) >= 10
ORDER BY e.id DESC LIMIT 1"
);
if ($exam) {
$examId = (int)$exam['id'];
}
}
// 3. Fallback to any published exam
if (!$exam) {
$exam = Database::selectOne("SELECT * FROM exams WHERE is_published = 1 ORDER BY id DESC LIMIT 1");
if ($exam) {
$examId = (int)$exam['id'];
}
}
}
if (!$exam) {
$response->status(404)->json(['status' => 'error', 'message' => 'الامتحان غير موجود']);
return;