Fix Flutter exam parsing, make exams tab dynamic from API, and add intelligent exam resolution to submitExam
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user