<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Http\Requests; use App\Test; use App\Testdetail; use App\Question; use App\Option; use App\Group; class TestController extends Controller { public function startTest(Test $test) { if (Auth::user()->testTaken(2)) { //insert session flash return redirect('/home'); } session(['questions' => $test->randomizeQuestions(), 'question_counter' => 0, 'test' => $test, 'wrong_answers' => 0, 'is_correct' => false, 'has_failed' => false, 'last_question' => false]); return redirect()->action('TestController@showQuestion'); } public function showQuestion() { session(['question_counter' => session('question_counter')+1]); $question = session('questions')->get(session('question_counter')-1); $options = $question->options->shuffle(); session(['options' => $options]); return view('tests.index', compact('question'), compact('options')); } public function answerQuestion() { $question = session('questions')->get(session('question_counter')-1); $question_id = $question->id; $answer_id = request()->get('answer'); if (!empty(session('answers'))) { $answers = session('answers'); } $answers["$question_id"] = $answer_id; session(['answers' => $answers]); if (!$question->isCorrect(session('answers')["$question->id"])) { session(['wrong_answers' => session('wrong_answers')+1]); session(['is_correct' => false]); } else { session(['is_correct' => true]); } if (session('test')->hasFailed(session('wrong_answers'))) { session(['has_failed' => true]); } if (session('test')->lastQuestion(session('question_counter'))) { session(['last_question' => true]); } return redirect()->action('TestController@showAnswer'); } public function showAnswer() { $question = session('questions')->get(session('question_counter')-1); $options = session('options'); return view('tests.answer', compact("question"), compact("options")); } public function testRetry(Test $test) { Auth::user()->storeTestdetails($test, session("has_failed")); $test->sessionPurge(); return redirect("/test/$test->id"); } public function testEnd(Test $test) { Auth::user()->storeTestdetails($test, session("has_failed")); $test->sessionPurge(); return redirect("/home"); } /** * * Common controller functions between moderators and administrators for handling tests and associated questions * */ public function addTest() { $test = new Test(); $test->createTest(request()->all()); return redirect('/admin/tests'); } public function confirmDeleteTest(Test $test) { return view('tests.delete', compact('test')); } public function confirmDeleteQuestion(Question $question) { return view('tests.question.delete', compact('question')); } public function deleteQuestion(Question $question) { $test = $question->test; $question->deleteQuestion(); return redirect("/admin/tests/$test->id"); } public function deleteTest(Test $test) { $test->deleteTest(); return redirect('/admin/tests'); } public function editQuestion(Question $question) { $options = $question->options; return view('tests.question.edit', compact('question'), compact('options')); } public function newQuestion(Test $test) { $question_number = $test->nextQuestionNumber(); return view('tests.question.new', compact('test'), compact('question_number')); } public function updateTest(Test $test) { $test->updateTest(request()->all()); return redirect("/admin/tests/$test->id"); } public function showTest(Test $test) { $questions = $test->questions; return view('tests.show', compact('test'), compact('questions')); } public function newTest() { if (Auth::user()->isAdministrator()) { $groups = Group::all(); return view('tests.new', compact('groups')); } return view('tests.new'); } public function editTest(Test $test) { if (Auth::user()->isAdministrator()) { $groups = Group::all(); return view('tests.edit', compact('test'), compact('groups')); } return view('tests.edit', compact('test')); } /* REFACTOR */ public function addQuestion(Test $test) { $question = new Question; $question->title = request()->title; $question->question = request()->question; if (empty(Option::all()->last()->id)) { $question->answer_id = 1; } else { $question->answer_id = Option::all()->last()->id+1; } $test->questions()->save($question); $option1 = new Option; $option1->option = request()->option1; $option2 = new Option; $option2->option = request()->option2; $option3 = new Option; $option3->option = request()->option3; $option4 = new Option; $option4->option = request()->option4; $question->options()->save($option1); $question->options()->save($option2); $question->options()->save($option3); $question->options()->save($option4); return redirect("/admin/tests/$test->id"); } public function updateQuestion(Question $question) { $test = $question->test; $question->question = request()->question; $options = $question->options; $options[0]->option = request()->option1; $options[1]->option = request()->option2; $options[2]->option = request()->option3; $options[3]->option = request()->option4; $question->update(); $options[0]->update(); $options[1]->update(); $options[2]->update(); $options[3]->update(); return redirect("/admin/tests/$test->id"); } }