11<?php
22
3- declare (strict_types=1 );
4-
53namespace App \Http \Controllers ;
64
75use App \Models \Course ;
108use App \Models \Quiz ;
119use App \Models \QuizAnswer ;
1210use App \Models \QuizAttempt ;
13- use Exception ;
1411use Illuminate \Http \RedirectResponse ;
1512use Illuminate \Http \Request ;
1613use Illuminate \Support \Facades \Auth ;
2017use Inertia \Inertia ;
2118use Inertia \Response ;
2219
23- final class CourseReviewController extends Controller
20+ class CourseReviewController extends Controller
2421{
25- public const REVIEW_QUIZ_WRONG_QUESTIONS_TARGET = 5 ; // Target number of previously wrong questions
26-
27- public const REVIEW_QUIZ_NEW_QUESTIONS_TARGET = 5 ; // Target number of new/random questions
22+ const REVIEW_QUIZ_WRONG_QUESTIONS_TARGET = 5 ; // Target number of previously wrong questions
23+ const REVIEW_QUIZ_NEW_QUESTIONS_TARGET = 5 ; // Target number of new/random questions
2824
2925 /**
3026 * Generate and display the final review quiz for a course.
3127 */
32- public function generate (Course $ course ): Response | RedirectResponse
28+ public function generate (Course $ course ): Response | RedirectResponse
3329 {
3430 $ user = Auth::user ();
3531
3632 $ placeholderQuiz = $ course ->finalReviewQuiz ;
37- if (! $ placeholderQuiz ) {
33+ if (!$ placeholderQuiz ) {
3834 Log::warning ("CourseReview: Course {$ course ->id } has no final_review_quiz_id linked. " );
3935 $ quizTitle = "{$ course ->title } - Final Review " ;
4036 $ quizDescription = "A comprehensive review of topics from {$ course ->title }. " ;
@@ -70,10 +66,11 @@ public function generate(Course $course): Response|RedirectResponse
7066 ->get ();
7167 }
7268
69+ // Combine and shuffle questions
7370 $ finalQuestions = $ wrongQuestions ->concat ($ newQuestions )->shuffle ();
7471
7572 if ($ finalQuestions ->isEmpty ()) {
76- return Inertia::render ('Courses/Review /Show ' , [
73+ return Inertia::render ('courses/review /Show ' , [
7774 'course ' => $ course ->only ('id ' , 'title ' , 'slug ' ),
7875 'quizData ' => null ,
7976 'message ' => 'Not enough questions available for a review quiz for this course yet. Try completing more module quizzes. ' ,
@@ -93,13 +90,13 @@ public function generate(Course $course): Response|RedirectResponse
9390 });
9491
9592 $ quizDataForView = [
96- 'id ' => 'final_review_ ' . $ course ->id . '_ ' . uniqid (),
93+ 'id ' => 'final_review_ ' . $ course ->id . '_ ' . uniqid (),
9794 'title ' => $ quizTitle ,
9895 'description ' => $ quizDescription ,
9996 'questions ' => $ displayQuestions ,
10097 ];
10198
102- session (['_courseReviewQuestions_ ' . $ course ->id => $ finalQuestions ->keyBy ('id ' )->toArray ()]);
99+ session (['_courseReviewQuestions_ ' . $ course ->id => $ finalQuestions ->keyBy ('id ' )->toArray ()]);
103100
104101 return Inertia::render ('courses/review/Show ' , [
105102 'course ' => $ course ->only ('id ' , 'title ' , 'slug ' ),
@@ -108,21 +105,23 @@ public function generate(Course $course): Response|RedirectResponse
108105 ]);
109106 }
110107
108+
111109 /**
112110 * Process and grade the submitted final review quiz.
113111 */
114- public function submit (Request $ request , Course $ course ): Response | RedirectResponse
112+ public function submit (Request $ request , Course $ course ): Response | RedirectResponse
115113 {
116114 $ user = Auth::user ();
117115 $ submittedAnswers = $ request ->input ('answers ' , []);
118116 $ request ->input ('quizId ' );
119117
120118 $ request ->validate (['answers ' => 'required|array ' , 'quizId ' => 'required|string ' ]);
121119
122- $ correctQuestionsData = session ('_courseReviewQuestions_ ' .$ course ->id );
123- session ()->forget ('_courseReviewQuestions_ ' .$ course ->id );
120+ // Retrieve correct answers from session
121+ $ correctQuestionsData = session ('_courseReviewQuestions_ ' . $ course ->id );
122+ session ()->forget ('_courseReviewQuestions_ ' . $ course ->id );
124123
125- if (! $ correctQuestionsData ) {
124+ if (!$ correctQuestionsData ) {
126125 return Redirect::route ('course.review.generate ' , $ course )
127126 ->with ('error ' , 'Review quiz session expired. Please try again. ' );
128127 }
@@ -147,7 +146,7 @@ public function submit(Request $request, Course $course): Response|RedirectRespo
147146 ]);
148147
149148 foreach ($ submittedAnswers as $ questionId => $ userAnswer ) {
150- if (! $ correctQuestions ->has ($ questionId )) {
149+ if (!$ correctQuestions ->has ($ questionId )) {
151150 continue ;
152151 }
153152
@@ -158,16 +157,16 @@ public function submit(Request $request, Course $course): Response|RedirectRespo
158157 ? (json_decode ($ question ->options , true ) ?? [])
159158 : ($ question ->options ?? []);
160159
160+
161161 $ isCorrect = false ;
162162 $ correctAnswer = $ question ->correct_answer ?? null ;
163163
164- // TODO: Refactor the grading logic to Service/Trait later
165164 switch ($ question ->type ?? 'multiple_choice ' ) {
166165 case 'multiple_choice ' :
167166 case 'fill_blank ' :
168167 case 'true_false ' :
169168 if (is_string ($ userAnswer ) && is_string ($ correctAnswer )) {
170- $ isCorrect = mb_strtolower ( mb_trim ($ userAnswer )) === mb_strtolower ( mb_trim ($ correctAnswer ));
169+ $ isCorrect = strtolower ( trim ($ userAnswer )) === strtolower ( trim ($ correctAnswer ));
171170 }
172171 break ;
173172 }
@@ -201,9 +200,8 @@ public function submit(Request $request, Course $course): Response|RedirectRespo
201200 $ attempt ->score = $ score ;
202201 $ attempt ->save ();
203202 });
204- } catch (Exception $ e ) {
205- Log::error ('CourseReviewSubmit: Failed to save attempt. ' , ['error ' => $ e ->getMessage ()]);
206-
203+ } catch (\Exception $ e ) {
204+ Log::error ("CourseReviewSubmit: Failed to save attempt. " , ['error ' => $ e ->getMessage ()]);
207205 return Redirect::route ('course.review.generate ' , $ course )
208206 ->with ('error ' , 'An error occurred saving your review attempt. ' );
209207 }
@@ -213,7 +211,7 @@ public function submit(Request $request, Course $course): Response|RedirectRespo
213211 if ($ result ['is_correct ' ]) {
214212 continue ;
215213 }
216- if (! $ result ['lesson_id ' ]) {
214+ if (!$ result ['lesson_id ' ]) {
217215 continue ;
218216 }
219217 if (isset ($ lessonsToReviewDeeply [$ result ['lesson_id ' ]])) {
@@ -225,7 +223,7 @@ public function submit(Request $request, Course $course): Response|RedirectRespo
225223 'id ' => $ lessonModel ->id ,
226224 'title ' => $ lessonModel ->title ,
227225 'url ' => route ('lessons.show ' , ['course ' => $ course ->slug , 'lesson ' => $ lessonModel ->slug ]),
228- 'external_resources ' => $ lessonModel ->externalResources ->map (fn ($ res ) => $ res ->only ('title ' , 'url ' , 'type ' , 'description ' ))->toArray (),
226+ 'external_resources ' => $ lessonModel ->externalResources ->map (fn ($ res ) => $ res ->only ('title ' , 'url ' , 'type ' , 'description ' ))->toArray (),
229227 ];
230228 }
231229 }
@@ -234,7 +232,7 @@ public function submit(Request $request, Course $course): Response|RedirectRespo
234232 'quiz ' => ['id ' => $ attempt ->quiz_id , 'title ' => $ course ->finalReviewQuiz ?->title ?? "{$ course ->title } - Final Review " ],
235233 'attempt ' => $ attempt ,
236234 'results ' => $ resultsData ,
237- 'reviewSuggestions ' => [], // TODO: Legacy, not used here
235+ 'reviewSuggestions ' => [],
238236 'deepReviewSuggestions ' => array_values ($ lessonsToReviewDeeply ),
239237 ]);
240238 }
0 commit comments