<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Http\Requests; use App\Test; use App\Question; use App\Option; use App\Group; use App\Http\Requests\StoreTest; use App\Http\Requests\StoreQuestion; class AdministrativeTestController extends Controller { public function __construct() { $this->middleware('auth'); } /** * * Common controller functions between moderators and administrators for handling tests * */ public function showTest(Test $test) { $this->authorize('view', $test); $questions = Question::where("test_id", $test->id)->with("options")->get(); return view('tests.show', compact('test'), compact('questions')); } public function newTest() { $this->authorize('create', Test::class); if (Auth::user()->isAdministrator()) { $groups = Group::all(); return view('tests.new', compact('groups')); } return view('tests.new'); } public function addTest(StoreTest $request) { $this->authorize('create', Test::class); $test = new Test(); $test->createTest($request->all()); $request->session()->flash('status', 'The test has been created'); return redirect("/" . Auth::user()->getAdminPath() . "/tests/$test->id"); } public function editTest(Test $test) { $this->authorize('update', $test); if (Auth::user()->isAdministrator()) { $groups = Group::all(); return view('tests.edit', compact('test'), compact('groups')); } return view('tests.edit', compact('test')); } public function updateTest(Test $test, StoreTest $request) { $this->authorize('update', $test); $test->updateTest($request->all()); $request->session()->flash('status', 'The test has been updated'); return redirect("/" . Auth::user()->getAdminPath() . "/tests/$test->id"); } public function deleteTest(Test $test) { $this->authorize('delete', $test); $test->deleteTest(); $request->session()->flash('status', 'The test has been deleted'); return redirect("/" . Auth::user()->getAdminPath() . '/tests'); } /** * * Common controller functions between moderators and administrators for handling questions * */ public function newQuestion(Test $test) { $this->authorize('createQuestion', $test); $this->authorize('create', Question::class); $question_number = $test->nextQuestionNumber(); return view('tests.question.new', compact('test'), compact('question_number')); } public function addQuestion(Test $test, StoreQuestion $request) { $this->authorize('createQuestion', $test); $this->authorize('create', Question::class); $question = new Question; $question->addQuestion($test, $request); foreach ($request["options"] as $optionData) { $option = new Option; $option->addOption($question, $optionData); } $request->session()->flash('status', 'The question has been created'); return redirect("/" . Auth::user()->getAdminPath() . "/tests/$test->id"); } public function editQuestion(Question $question) { $this->authorize('update', $question); $options = $question->options; return view('tests.question.edit', compact('question'), compact('options')); } public function updateQuestion(Question $question, StoreQuestion $request) { $this->authorize('update', $question); $test = $question->test; $question->updateQuestion($request); $options = $question->options; $optionsData = $request["options"]; foreach ($options as $key => $option) { $option->updateOption($optionsData[$key+1]); } $request->session()->flash('status', 'The question has been updated'); return redirect("/" . Auth::user()->getAdminPath() . "/tests/$test->id"); } public function deleteQuestion(Question $question, Request $request) { $this->authorize('delete', $question); $test = $question->test; $question->deleteQuestion(); $request->session()->flash('status', 'The question has been deleted'); return redirect("/" . Auth::user()->getAdminPath() . "/tests/$test->id"); } }