Advertisement
ensarhamzic

Untitled

Jan 31st, 2023
713
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 36.91 KB | None | 0 0
  1. <?php
  2.  
  3. namespace App\Http\Controllers;
  4.  
  5. use App\Models\ContentType;
  6. use Illuminate\Http\Request;
  7. use CloudinaryLabs\CloudinaryLaravel\Facades\Cloudinary;
  8. use Illuminate\Support\Facades\Storage;
  9. use Illuminate\Support\Facades\File;
  10. use Illuminate\Support\Arr;
  11.  
  12. use Auth;
  13.  
  14.  
  15. use App\Models\Course;
  16. use App\Models\Question;
  17. use App\Models\Section;
  18. use App\Models\Content;
  19. use App\Models\CourseAttend;
  20. use App\Models\ContentComplete;
  21. use App\Models\QuestionAnswer;
  22. use App\Models\User;
  23. use App\Models\Rating;
  24.  
  25. class CoursesController extends Controller
  26. {
  27.     /**
  28.      * Display a listing of the resource.
  29.      *
  30.      * @return \Illuminate\Http\Response
  31.      */
  32.     public function index()
  33.     {
  34.         $activeCourses = Course::where("user_JMBG", auth()->user()->JMBG)->where('active', 1)->get();
  35.         $inactiveCourses = Course::where("user_JMBG", auth()->user()->JMBG)->where('active', 0)->get();
  36.         return view('teacher.courses.index', compact('activeCourses', 'inactiveCourses'));
  37.     }
  38.  
  39.     /**
  40.      * Show the form for creating a new resource.
  41.      *
  42.      * @return \Illuminate\Http\Response
  43.      */
  44.     public function create()
  45.     {
  46.         return view('teacher.courses.create');
  47.     }
  48.  
  49.     /**
  50.      * Store a newly created resource in storage.
  51.      *
  52.      * @param  \Illuminate\Http\Request  $request
  53.      * @return \Illuminate\Http\Response
  54.      */
  55.     public function store(Request $request)
  56.     {
  57.         $request->validate([
  58.             'title' => 'required|min:5',
  59.             'description' => 'required|min:30',
  60.             'imageURI' => 'required',
  61.         ]);
  62.  
  63.         $imageURI = $request->imageURI;
  64.         $image_uploaded = Cloudinary::upload($imageURI)->getSecurePath();
  65.  
  66.         $course = new Course();
  67.         $stringJMBG = (string)auth()->user()->JMBG;
  68.         while (strlen($stringJMBG) < 13) {
  69.             $stringJMBG = '0' . $stringJMBG;
  70.         }
  71.         $course->user_JMBG = $stringJMBG;
  72.         $course->title = $request->title;
  73.         $course->description = $request->description;
  74.         $course->image = $image_uploaded;
  75.         $course->active = 1;
  76.         $course->save();
  77.  
  78.         return redirect()->route('courses.show', $course->id);
  79.     }
  80.  
  81.     /**
  82.      * Display the specified resource.
  83.      *
  84.      * @param  int  $id
  85.      * @return \Illuminate\Http\Response
  86.      */
  87.     public function show($id)
  88.     {
  89.         $course = Course::findOrFail($id);
  90.         if ((!$course->active && Auth::check() && !Auth::user()->ownsCourse($course)) || (!$course->active && !Auth::check())) abort(404);
  91.         $userRating = null;
  92.         if (Auth::check())
  93.             $userRating = Rating::where('course_id', $id)->where('user_JMBG', auth()->user()->JMBG)->first();
  94.         return view('teacher.courses.show', compact('course', 'userRating'));
  95.     }
  96.  
  97.     public function showCheckQuestion(Request $request, $courseId, $contentId)
  98.     {
  99.         $course = Course::findOrFail($courseId);
  100.         $sections = $course->sections()->get();
  101.  
  102.         // find course which section_id is equal to one of the sections of the course and content_id is equal to the contentId
  103.         $content = Content::whereHas('section', function ($query) use ($sections) {
  104.             $query->whereIn('id', $sections->pluck('id'));
  105.         })->where('id', $contentId)->first();
  106.  
  107.         if (!Auth::check() || !Auth::user()->attendsCourse($course) || !$content) {
  108.             return redirect()->back();
  109.         }
  110.  
  111.         $question = Question::where('content_id', $contentId)->where('type', 'check')->first();
  112.         $question->answers = $question->answers->shuffle();
  113.  
  114.         return view('teacher.courses.showCheckQuestion', compact('course', 'content', 'question'));
  115.     }
  116.  
  117.     /**
  118.      * Show the form for editing the specified resource.
  119.      *
  120.      * @param  int  $id
  121.      * @return \Illuminate\Http\Response
  122.      */
  123.     public function edit($id)
  124.     {
  125.         $course = Course::findOrFail($id);
  126.         if (Auth::check() && Auth::user()->ownsCourse($course) && $course->completed == 0)
  127.             return view('teacher.courses.edit', compact('course'));
  128.         return redirect()->back();
  129.     }
  130.  
  131.     /**
  132.      * Update the specified resource in storage.
  133.      *
  134.      * @param  \Illuminate\Http\Request  $request
  135.      * @param  int  $id
  136.      * @return \Illuminate\Http\Response
  137.      */
  138.     public function update(Request $request, $id)
  139.     {
  140.         if (!Auth::check() || !Auth::user()->ownsCourse(Course::find($id)))
  141.             return redirect()->back();
  142.  
  143.         $request->validate([
  144.             'title' => 'required|min:5',
  145.             'description' => 'required|min:30',
  146.         ]);
  147.  
  148.         $course = Course::find($id);
  149.         $course->title = $request->title;
  150.         $course->description = $request->description;
  151.         if ($request->imageURI) {
  152.             $imageURI = $request->imageURI;
  153.             $image_uploaded = Cloudinary::upload($imageURI)->getSecurePath();
  154.             $course->image = $image_uploaded;
  155.         }
  156.         $course->save();
  157.  
  158.         return redirect()->route('courses.show', $id)->with('success', 'Course updated successfully');
  159.     }
  160.  
  161.     /**
  162.      * Remove the specified resource from storage.
  163.      *
  164.      * @param  int  $id
  165.      * @return \Illuminate\Http\Response
  166.      */
  167.     public function destroy($id)
  168.     {
  169.         $course = Course::find($id);
  170.         if (!Auth::check() || (!Auth::user()->ownsCourse($course) && !Auth::user()->isAdmin()))
  171.             return redirect()->back();
  172.         $course->delete();
  173.         if (Auth::user()->isAdmin())
  174.             return redirect()->route('index');
  175.         return redirect()->route('teacher.courses.index');
  176.     }
  177.  
  178.     public function toggleActive($id)
  179.     {
  180.         $course = Course::find($id);
  181.         $course->active = !$course->active;
  182.         $course->save();
  183.         return redirect()->route('teacher.courses.index');
  184.     }
  185.  
  186.     public function addSection(Request $request, $courseId)
  187.     {
  188.         return view('teacher.courses.addSection', compact('courseId'));
  189.     }
  190.  
  191.     public function storeSection(Request $request, $courseId)
  192.     {
  193.         $request->validate([
  194.             'title' => 'required',
  195.         ]);
  196.  
  197.         $course = Course::find($courseId);
  198.         if (!Auth::check() || !Auth::user()->ownsCourse($course))
  199.             return redirect()->back();
  200.  
  201.         $course->sections()->create([
  202.             'title' => $request->title,
  203.         ]);
  204.  
  205.         return redirect()->route('courses.show', $courseId)->with('success', 'Section added successfully');
  206.     }
  207.  
  208.     public function editSection(Request $request, $courseId, $sectionId)
  209.     {
  210.         $course = Course::findOrFail($courseId);
  211.         $section = $course->sections()->findOrFail($sectionId);
  212.  
  213.         if (!Auth::check() ||  !Auth::user()->ownsCourse($course))
  214.             return redirect()->back();
  215.  
  216.         return view('teacher.courses.editSection', ['course' => $course, 'section' => $section]);
  217.     }
  218.  
  219.     public function updateSection(Request $request, $courseId, $sectionId)
  220.     {
  221.         $request->validate([
  222.             'title' => 'required',
  223.         ]);
  224.  
  225.         $course = Course::findOrFail($courseId);
  226.         $section = $course->sections()->findOrFail($sectionId);
  227.  
  228.         if (!Auth::check() ||  !Auth::user()->ownsCourse($course))
  229.             return redirect()->back();
  230.  
  231.         $section->title = $request->title;
  232.         $section->save();
  233.  
  234.         return redirect()->route('courses.show', $courseId)->with('success', 'Section updated successfully');
  235.     }
  236.  
  237.     public function deleteSection(Request $request, $courseId, $sectionId)
  238.     {
  239.         $course = Course::findOrFail($courseId);
  240.         $section = $course->sections()->findOrFail($sectionId);
  241.  
  242.         if (!Auth::check() || (!Auth::user()->ownsCourse($course) && !Auth::user()->isAdmin()))
  243.             return redirect()->back();
  244.  
  245.         $section->delete();
  246.  
  247.         return redirect()->route('courses.show', $courseId)->with('success', 'Section deleted successfully');
  248.     }
  249.  
  250.     public function addContent(Request $request, $courseId)
  251.     {
  252.         $course = Course::findOrFail($courseId);
  253.  
  254.         if (!Auth::check() || !Auth::user()->ownsCourse($course))
  255.             return redirect()->back();
  256.  
  257.         return view('teacher.courses.addContent', ['course' => $course]);
  258.     }
  259.  
  260.     public function storeContent(Request $request,  $courseId)
  261.     {
  262.         $request->validate([
  263.             'title' => 'required',
  264.             'section' => 'required',
  265.             'checkQuestion' => "required",
  266.             'checkQuestionAnswers' => "required",
  267.             'easyQuestion' => "required",
  268.             'easyQuestionAnswers' => "required",
  269.             'mediumQuestion' => "required",
  270.             'mediumQuestionAnswers' => "required",
  271.             'hardQuestion' => "required",
  272.             'hardQuestionAnswers' => "required",
  273.         ]);
  274.  
  275.  
  276.         if ($request->onlyLink) {
  277.             $request->validate([
  278.                 'link' => 'required',
  279.             ]);
  280.         } else {
  281.             $request->validate([
  282.                 'content' => 'required',
  283.             ]);
  284.         }
  285.  
  286.         $course = Course::find($courseId);
  287.         if (!Auth::user()->ownsCourse($course))
  288.             return redirect()->back();
  289.  
  290.         $contentSource = null;
  291.         if ($request->onlyLink) {
  292.             $contentSource = $request->link;
  293.         } else {
  294.             $file = $request->file('content');
  295.             $destinationPath = 'uploads';
  296.             $filename = $file->getClientOriginalName();
  297.             $file->move($destinationPath, $filename);
  298.  
  299.             $filePath = $destinationPath . '/' . $filename;
  300.  
  301.             $contentSource = Cloudinary::upload($filePath, [
  302.                 'resource_type' => 'auto',
  303.             ])->getSecurePath();
  304.  
  305.             unlink($filePath);
  306.         }
  307.  
  308.         $contentType = ContentType::where('name', $request->contentType)->first();
  309.  
  310.         $addedContent = $course->sections()->find($request->section)->contents()->create([
  311.             'title' => $request->title,
  312.             'source' => $contentSource,
  313.             'content_type_id' => $contentType->id,
  314.         ]);
  315.  
  316.  
  317.         $checkQuestion = new Question();
  318.         $checkQuestion->content_id = $addedContent->id;
  319.         $checkQuestion->text = $request->checkQuestion;
  320.         $checkQuestion->type = 'check';
  321.         $checkQuestion->save();
  322.  
  323.  
  324.         $correctCheckAnswer = $request->checkQuestionAnswers[0];
  325.         $i = 0;
  326.         foreach ($request->checkQuestionAnswers as $answer) {
  327.             $checkQuestion->answers()->create([
  328.                 'text' => $answer,
  329.                 'is_correct' => $i == 0 && $answer == $correctCheckAnswer,
  330.             ]);
  331.         }
  332.  
  333.  
  334.         $easyQuestion = new Question();
  335.         $easyQuestion->content_id = $addedContent->id;
  336.         $easyQuestion->text = $request->easyQuestion;
  337.         $easyQuestion->type = 'test';
  338.         $easyQuestion->level = 'easy';
  339.         $easyQuestion->save();
  340.  
  341.         $correctEasyAnswer = $request->easyQuestionAnswers[0];
  342.         $i = 0;
  343.         foreach ($request->easyQuestionAnswers as $answer) {
  344.             $easyQuestion->answers()->create([
  345.                 'text' => $answer,
  346.                 'is_correct' => $i == 0 && $answer == $correctEasyAnswer,
  347.             ]);
  348.         }
  349.  
  350.  
  351.         $mediumQuestion = new Question();
  352.         $mediumQuestion->content_id = $addedContent->id;
  353.         $mediumQuestion->text = $request->mediumQuestion;
  354.         $mediumQuestion->type = 'test';
  355.         $mediumQuestion->level = 'medium';
  356.         $mediumQuestion->save();
  357.  
  358.         $correctMediumAnswer = $request->mediumQuestionAnswers[0];
  359.         $i = 0;
  360.         foreach ($request->mediumQuestionAnswers as $answer) {
  361.             $mediumQuestion->answers()->create([
  362.                 'text' => $answer,
  363.                 'is_correct' => $i == 0 && $answer == $correctMediumAnswer,
  364.             ]);
  365.         }
  366.  
  367.  
  368.         $hardQuestion = new Question();
  369.         $hardQuestion->content_id = $addedContent->id;
  370.         $hardQuestion->text = $request->hardQuestion;
  371.         $hardQuestion->type = 'test';
  372.         $hardQuestion->level = 'hard';
  373.         $hardQuestion->save();
  374.  
  375.         $correctHardAnswer = $request->hardQuestionAnswers[0];
  376.         $i = 0;
  377.         foreach ($request->hardQuestionAnswers as $answer) {
  378.             $hardQuestion->answers()->create([
  379.                 'text' => $answer,
  380.                 'is_correct' =>  $i == 0 && $answer == $correctHardAnswer,
  381.             ]);
  382.         }
  383.  
  384.         return redirect()->route('courses.show', $courseId)->with('success', 'Content added successfully');
  385.     }
  386.  
  387.     public function editContent(Request $request, $courseId, $contentId)
  388.     {
  389.         $course = Course::findOrFail($courseId);
  390.         $sections = $course->sections()->get();
  391.  
  392.         // find course which section_id is equal to one of the sections of the course and content_id is equal to the contentId
  393.         $content = Content::whereHas('section', function ($query) use ($sections) {
  394.             $query->whereIn('id', $sections->pluck('id'));
  395.         })->where('id', $contentId)->first();
  396.  
  397.         $checkQuestion = $content->questions()->where('type', 'check')->first();
  398.  
  399.         $easyQuestion = $content->questions()->where('type', 'test')->where('level', 'easy')->first();
  400.         $mediumQuestion = $content->questions()->where('type', 'test')->where('level', 'medium')->first();
  401.         $hardQuestion = $content->questions()->where('type', 'test')->where('level', 'hard')->first();
  402.  
  403.  
  404.  
  405.         if (!Auth::check() || !Auth::user()->ownsCourse($course) || !$content)
  406.             return redirect()->back();
  407.  
  408.         return view(
  409.             'teacher.courses.editContent',
  410.             [
  411.                 'course' => $course, 'content' => $content,
  412.                 'checkQuestion' => $checkQuestion,
  413.                 'easyQuestion' => $easyQuestion,
  414.                 'mediumQuestion' => $mediumQuestion,
  415.                 'hardQuestion' => $hardQuestion
  416.             ]
  417.         );
  418.     }
  419.  
  420.     public function updateContent(Request $request, $courseId, $contentId)
  421.     {
  422.         $request->validate([
  423.             'title' => 'required',
  424.             'section' => 'required',
  425.             'checkQuestion' => "required",
  426.             'checkQuestionAnswers' => "required",
  427.             'easyQuestion' => "required",
  428.             'easyQuestionAnswers' => "required",
  429.             'mediumQuestion' => "required",
  430.             'mediumQuestionAnswers' => "required",
  431.             'hardQuestion' => "required",
  432.             'hardQuestionAnswers' => "required",
  433.         ]);
  434.  
  435.  
  436.         $course = Course::findOrFail($courseId);
  437.         $sections = $course->sections()->get();
  438.  
  439.         // find course which section_id is equal to one of the sections of the course and content_id is equal to the contentId
  440.         $content = Content::whereHas('section', function ($query) use ($sections) {
  441.             $query->whereIn('id', $sections->pluck('id'));
  442.         })->where('id', $contentId)->first();
  443.  
  444.         if ($request->content) {
  445.             $file = $request->file('content');
  446.             $destinationPath = 'uploads';
  447.             $filename = $file->getClientOriginalName();
  448.             $file->move($destinationPath, $filename);
  449.  
  450.             $filePath = $destinationPath . '/' . $filename;
  451.  
  452.             $contentSource = Cloudinary::upload($filePath, [
  453.                 'resource_type' => 'auto',
  454.             ])->getSecurePath();
  455.         } else if ($request->link) {
  456.             $contentSource = $request->link;
  457.         } else {
  458.             $contentSource = $content->source;
  459.         }
  460.  
  461.         if (!Auth::user()->ownsCourse($course) || !$content) {
  462.             return redirect()->back();
  463.         }
  464.  
  465.         $contentType = ContentType::where('name', $request->contentType)->first();
  466.  
  467.         $content->title = $request->title;
  468.         $content->section_id = $request->section;
  469.         $content->source = $contentSource;
  470.         if ($contentType)
  471.             $content->content_type_id = $contentType->id;
  472.         $content->save();
  473.  
  474.         $checkQuestion = $content->questions()->where('type', 'check')->first();
  475.         $checkQuestion->text = $request->checkQuestion;
  476.         $checkQuestion->save();
  477.  
  478.         $checkQuestionAnswers = $checkQuestion->answers()->get();
  479.         $correctCheckAnswer = $request->checkQuestionAnswers[0];
  480.         for ($i = 0; $i < count($checkQuestionAnswers); $i++) {
  481.             $checkQuestionAnswers[$i]->text = $request->checkQuestionAnswers[$i];
  482.             $checkQuestionAnswers[$i]->is_correct = $request->checkQuestionAnswers[$i] == $correctCheckAnswer && $i == 0;
  483.             $checkQuestionAnswers[$i]->save();
  484.         }
  485.  
  486.         $easyQuestion = $content->questions()->where('type', 'test')->where('level', 'easy')->first();
  487.         $easyQuestion->text = $request->easyQuestion;
  488.         $easyQuestion->save();
  489.  
  490.         $easyQuestionAnswers = $easyQuestion->answers()->get();
  491.         $correctEasyAnswer = $request->easyQuestionAnswers[0];
  492.         for ($i = 0; $i < count($easyQuestionAnswers); $i++) {
  493.             $easyQuestionAnswers[$i]->text = $request->easyQuestionAnswers[$i];
  494.             $easyQuestionAnswers[$i]->is_correct = $request->easyQuestionAnswers[$i] == $correctEasyAnswer && $i == 0;
  495.             $easyQuestionAnswers[$i]->save();
  496.         }
  497.  
  498.         $mediumQuestion = $content->questions()->where('type', 'test')->where('level', 'medium')->first();
  499.         $mediumQuestion->text = $request->mediumQuestion;
  500.         $mediumQuestion->save();
  501.  
  502.         $mediumQuestionAnswers = $mediumQuestion->answers()->get();
  503.         $correctMediumAnswer = $request->mediumQuestionAnswers[0];
  504.         for ($i = 0; $i < count($mediumQuestionAnswers); $i++) {
  505.             $mediumQuestionAnswers[$i]->text = $request->mediumQuestionAnswers[$i];
  506.             $mediumQuestionAnswers[$i]->is_correct = $request->mediumQuestionAnswers[$i] == $correctMediumAnswer && $i == 0;
  507.             $mediumQuestionAnswers[$i]->save();
  508.         }
  509.  
  510.         $hardQuestion = $content->questions()->where('type', 'test')->where('level', 'hard')->first();
  511.         $hardQuestion->text = $request->hardQuestion;
  512.         $hardQuestion->save();
  513.  
  514.         $hardQuestionAnswers = $hardQuestion->answers()->get();
  515.         $correctHardAnswer = $request->hardQuestionAnswers[0];
  516.         for ($i = 0; $i < count($hardQuestionAnswers); $i++) {
  517.             $hardQuestionAnswers[$i]->text = $request->hardQuestionAnswers[$i];
  518.             $hardQuestionAnswers[$i]->is_correct = $request->hardQuestionAnswers[$i] == $correctHardAnswer && $i == 0;
  519.             $hardQuestionAnswers[$i]->save();
  520.         }
  521.  
  522.         return redirect()->route('courses.show', $courseId)->with('success', 'Content updated successfully');
  523.     }
  524.  
  525.     public function deleteContent(Request $request, $courseId, $contentId)
  526.     {
  527.         $course = Course::findOrFail($courseId);
  528.         $sections = $course->sections()->get();
  529.  
  530.         // find course which section_id is equal to one of the sections of the course and content_id is equal to the contentId
  531.         $content = Content::whereHas('section', function ($query) use ($sections) {
  532.             $query->whereIn('id', $sections->pluck('id'));
  533.         })->where('id', $contentId)->first();
  534.  
  535.         if (!Auth::check() || !$content || (!Auth::user()->ownsCourse($course) && !Auth::user()->isAdmin())) {
  536.             return redirect()->back();
  537.         }
  538.  
  539.         $content->delete();
  540.  
  541.         return redirect()->route('courses.show', $courseId)->with('success', 'Content deleted successfully');
  542.     }
  543.  
  544.     public function enroll(Request $request, $courseId)
  545.     {
  546.         if (auth()->guest()) {
  547.             return redirect()->route('login');
  548.         }
  549.         $course = Course::findOrFail($courseId);
  550.         if ($course->active == 0) {
  551.             return redirect()->back()->with('error', 'You can not enroll in this course. Course is not active at the moment');
  552.         }
  553.  
  554.         $stringId = (string)auth()->user()->JMBG;
  555.         while (strlen($stringId) < 13) {
  556.             $stringId = '0' . $stringId;
  557.         }
  558.         CourseAttend::create([
  559.             'user_JMBG' => $stringId,
  560.             'course_id' => $course->id,
  561.         ]);
  562.  
  563.         return redirect()->back()->with('success', 'You have successfully enrolled in this course');
  564.     }
  565.  
  566.     public function unenroll(Request $request, $courseId)
  567.     {
  568.         if (auth()->guest()) {
  569.             return redirect()->route('login');
  570.         }
  571.         $course = Course::findOrFail($courseId);
  572.         $stringId = (string)auth()->user()->JMBG;
  573.         while (strlen($stringId) < 13) {
  574.             $stringId = '0' . $stringId;
  575.         }
  576.         $courseAttend = CourseAttend::where('user_JMBG', $stringId)->where('course_id', $course->id)->first();
  577.         if ($courseAttend) {
  578.             $courseAttend->delete();
  579.         }
  580.  
  581.         return redirect()->back()->with('success', 'You have successfully unenrolled from this course');
  582.     }
  583.  
  584.     public function complete(Request $request, $courseId)
  585.     {
  586.         $course = Course::findOrFail($courseId);
  587.         if (!Auth::check() || !Auth::user()->ownsCourse($course)) {
  588.             return redirect()->back();
  589.         }
  590.  
  591.         $course->completed = true;
  592.         $course->save();
  593.  
  594.         return redirect()->back()->with('success', 'You have marked this course as completed. Now, your students can do tests for this course.');
  595.     }
  596.  
  597.     public function incomplete(Request $request, $courseId)
  598.     {
  599.         $course = Course::findOrFail($courseId);
  600.         if (!Auth::user()->ownsCourse($course)) {
  601.             return redirect()->back();
  602.         }
  603.  
  604.         $course->completed = false;
  605.         $course->save();
  606.  
  607.         return redirect()->back()->with('success', 'You have marked this course as incomplete. Now, your students can not do tests for this course.');
  608.     }
  609.  
  610.     public function completeContent(Request $request, $courseId, $contentId)
  611.     {
  612.         $course = Course::findOrFail($courseId);
  613.         $sections = $course->sections()->get();
  614.  
  615.         // find course which section_id is equal to one of the sections of the course and content_id is equal to the contentId
  616.         $content = Content::whereHas('section', function ($query) use ($sections) {
  617.             $query->whereIn('id', $sections->pluck('id'));
  618.         })->where('id', $contentId)->first();
  619.         if (!Auth::check() || !Auth::user()->attendsCourse($course) || !$content) {
  620.             return redirect()->back();
  621.         }
  622.  
  623.         $contentComplete = ContentComplete::where('user_JMBG', auth()->user()->JMBG)->where('content_id', $content->id)->first();
  624.         if ($contentComplete) {
  625.             return redirect()->back();
  626.         } else {
  627.             ContentComplete::create([
  628.                 'user_JMBG' => auth()->user()->JMBG,
  629.                 'content_id' => $content->id,
  630.             ]);
  631.         }
  632.  
  633.         return redirect()->back();
  634.     }
  635.  
  636.     public function showTest($courseId)
  637.     {
  638.         $course = Course::findOrFail($courseId);
  639.         if (!Auth::check() || !Auth::user()->attendsCourse($course) || Auth::user()->doneTest($course)) {
  640.             return redirect()->back();
  641.         }
  642.  
  643.         if ($course->completed == false) {
  644.             return redirect()->back()->with('error', 'You can not do test for this course because it is not completed yet.');
  645.         }
  646.  
  647.         $sections = $course->sections()->get();
  648.         $contents = Content::whereHas('section', function ($query) use ($sections) {
  649.             $query->whereIn('id', $sections->pluck('id'));
  650.         })->get();
  651.  
  652.         $checkQuestions = Question::whereHas('content', function ($query) use ($contents) {
  653.             $query->whereIn('id', $contents->pluck('id'));
  654.         })->where('type', 'check')->get();
  655.  
  656.         $answerIds = [];
  657.         foreach ($checkQuestions as $checkQuestion) {
  658.             $answerIds = array_merge($answerIds, $checkQuestion->answers->pluck('id')->toArray());
  659.         }
  660.  
  661.         $userAnswers = Auth::user()->answers()->get();
  662.         $userAnswers = $userAnswers->whereIn('answer_id', $answerIds);
  663.  
  664.         if ($userAnswers->count() != $checkQuestions->count()) {
  665.             return redirect()->back()->with('error', 'You have not completed all the contents of this course.');
  666.         }
  667.  
  668.         $correctAnswers = 0;
  669.         foreach ($userAnswers as $userAnswer)
  670.             if ($userAnswer->answer->is_correct)
  671.                 $correctAnswers++;
  672.  
  673.         $percentage = $correctAnswers / $checkQuestions->count() * 100;
  674.  
  675.         $easyQuestions = [];
  676.         $mediumQuestions = [];
  677.         $hardQuestions = [];
  678.         foreach ($contents as $content) {
  679.             array_push($easyQuestions, $content->questions()->where('level', 'easy')->get());
  680.             array_push($mediumQuestions, $content->questions()->where('level', 'medium')->get());
  681.             array_push($hardQuestions, $content->questions()->where('level', 'hard')->get());
  682.         }
  683.  
  684.  
  685.         $questions = null;
  686.         if ($percentage >= 0 && $percentage < 50) {
  687.             $questions = $easyQuestions;
  688.         } else if ($percentage >= 50 && $percentage < 80) {
  689.             $questions = $mediumQuestions;
  690.         } else if ($percentage >= 80 && $percentage <= 100) {
  691.             $questions = $hardQuestions;
  692.         }
  693.  
  694.         $questions = collect($questions)->flatten();
  695.         foreach ($questions as $question) {
  696.             $question->answers = $question->answers->shuffle();
  697.         }
  698.  
  699.         return view('teacher.courses.test', compact('course', 'questions'));
  700.     }
  701.  
  702.     public function questionHelp(Request $request, $questionId)
  703.     {
  704.         // get question answers, and return the correct one and second one return the wrong one
  705.         $question = Question::findOrFail($questionId);
  706.         $answers = $question->answers()->get();
  707.         $answers = $answers->shuffle();
  708.         $correctAnswer = $answers->where('is_correct', true)->first();
  709.         $incorrectAnswer = $answers->where('is_correct', false)->first();
  710.  
  711.         $answers = [
  712.             'correct' => $correctAnswer,
  713.             'incorrect' => $incorrectAnswer,
  714.         ];
  715.  
  716.         return response()->json($answers);
  717.     }
  718.  
  719.     public function answerQuestion(Request $request, $courseId, $contentId)
  720.     {
  721.         if (!Auth::check()) {
  722.             return redirect()->back();
  723.         }
  724.         $course = Course::findOrFail($courseId);
  725.         $sections = $course->sections()->get();
  726.  
  727.         // find course which section_id is equal to one of the sections of the course and content_id is equal to the contentId
  728.         $content = Content::whereHas('section', function ($query) use ($sections) {
  729.             $query->whereIn('id', $sections->pluck('id'));
  730.         })->where('id', $contentId)->first();
  731.  
  732.         if (!Auth::user()->attendsCourse($course) || !$content) {
  733.             return redirect()->back();
  734.         }
  735.  
  736.         $question = Question::where('content_id', $contentId)->where('type', 'check')->first();
  737.         $answerId = $request->answer;
  738.  
  739.         if ($question->answers->pluck('id')->contains($answerId)) {
  740.             $questionAnswer = new QuestionAnswer();
  741.             $questionAnswer->user_JMBG = auth()->user()->JMBG;
  742.             $questionAnswer->answer_id = $answerId;
  743.             $questionAnswer->save();
  744.  
  745.             $contentComplete = new ContentComplete();
  746.             $contentComplete->user_JMBG = auth()->user()->JMBG;
  747.             $contentComplete->content_id = $contentId;
  748.             $contentComplete->save();
  749.         }
  750.  
  751.         return redirect()->route('courses.show', $courseId);
  752.     }
  753.  
  754.     public function endTest(Request $request, $courseId)
  755.     {
  756.         if (!Auth::check()) {
  757.             return redirect()->back();
  758.         }
  759.         $course = Course::findOrFail($courseId);
  760.         if (!Auth::user()->attendsCourse($course)) {
  761.             return redirect()->back();
  762.         }
  763.  
  764.         $userAnswers = $request->only(array_filter($request->keys(), function ($key) {
  765.             return strpos($key, 'question') === 0;
  766.         }));
  767.  
  768.         foreach ($userAnswers as $questionId => $answerId) {
  769.             $questionId = intval(str_replace('question', '', $questionId));
  770.             $answerId = intval($answerId);
  771.             $questionAnswer = new QuestionAnswer();
  772.             $questionAnswer->user_JMBG = auth()->user()->JMBG;
  773.             $questionAnswer->answer_id = $answerId;
  774.             if ($request['help' . $questionId] == 1)
  775.                 $questionAnswer->help_used = true;
  776.             $questionAnswer->save();
  777.         }
  778.  
  779.         return redirect()->route('courses.test.results', $courseId);
  780.     }
  781.  
  782.     public function testResults(Request $request, $courseId)
  783.     {
  784.         $course = Course::findOrFail($courseId);
  785.         if (!Auth::check() || !Auth::user()->attendsCourse($course) || !Auth::user()->doneTest($course)) {
  786.             return redirect()->back();
  787.         }
  788.         $questions = collect($course->questions())->where('type', 'test');
  789.         $questionsIds = $questions->pluck('id');
  790.  
  791.         $rawAnswers = Auth::user()->answers;
  792.         $allAnswers = [];
  793.         foreach ($rawAnswers as $answer) {
  794.             if ($answer->answer->question->type == "test")
  795.                 array_push($allAnswers, $answer->answer);
  796.         }
  797.         $allAnswers = Arr::flatten($allAnswers);
  798.         $allAnswers = collect($allAnswers);
  799.         $userAnswers = $allAnswers->whereIn('question_id', $questionsIds);
  800.         $level = $userAnswers->first()->question->level;
  801.  
  802.         $questions = $questions->where('level', $level);
  803.         $user = Auth::user();
  804.  
  805.         $points = 0;
  806.         foreach ($questions as $question) {
  807.             if (in_array($question->getCorrectAnswer()->id, $userAnswers->pluck('id')->toArray()))
  808.                 if ($question->getCorrectAnswer()->userUsedHelp($user->JMBG))
  809.                     $points += 0.5;
  810.                 else
  811.                     $points += 1;
  812.         }
  813.  
  814.         return view('teacher.courses.testResults', compact('course', 'questions', 'userAnswers', 'user', 'points'));
  815.     }
  816.  
  817.     public function userTestResults(Request $request, $courseId, $userJMBG)
  818.     {
  819.         $course = Course::findOrFail($courseId);
  820.         $user = User::where('JMBG', $userJMBG)->first();
  821.         if (!Auth::check() || !$user->attendsCourse($course) || !$user->doneTest($course)) {
  822.             return redirect()->back();
  823.         }
  824.         $questions = collect($course->questions())->where('type', 'test');
  825.         $questionsIds = $questions->pluck('id');
  826.  
  827.         $rawAnswers = $user->answers;
  828.         $allAnswers = [];
  829.         foreach ($rawAnswers as $answer) {
  830.             if ($answer->answer->question->type == "test")
  831.                 array_push($allAnswers, $answer->answer);
  832.         }
  833.         $allAnswers = Arr::flatten($allAnswers);
  834.         $allAnswers = collect($allAnswers);
  835.         $userAnswers = $allAnswers->whereIn('question_id', $questionsIds);
  836.         $level = $userAnswers->first()->question->level;
  837.  
  838.         $questions = $questions->where('level', $level);
  839.  
  840.         $points = 0;
  841.         foreach ($questions as $question) {
  842.             if (in_array($question->getCorrectAnswer()->id, $userAnswers->pluck('id')->toArray()))
  843.                 if ($question->getCorrectAnswer()->userUsedHelp($user->JMBG))
  844.                     $points += 0.5;
  845.                 else
  846.                     $points += 1;
  847.         }
  848.  
  849.         return view('teacher.courses.testResults', compact('course', 'questions', 'userAnswers', 'user', 'points'));
  850.     }
  851.  
  852.     public function showAttendants(Request $request, $courseId)
  853.     {
  854.         $course = Course::findOrFail($courseId);
  855.         if (!Auth::check() || !Auth::user()->ownsCourse($course)) {
  856.             return redirect()->back();
  857.         }
  858.  
  859.         $attendants = $course->attends()->get();
  860.         $averagePoints = 0;
  861.         $usersDoneTest = 0;
  862.  
  863.         foreach ($attendants as $attendant) {
  864.             $questions = collect($course->questions())->where('type', 'test');
  865.             $questionsIds = $questions->pluck('id');
  866.  
  867.             $rawAnswers = $attendant->user->answers;
  868.             $allAnswers = [];
  869.             foreach ($rawAnswers as $answer) {
  870.                 if ($answer->answer->question->type == "test")
  871.                     array_push($allAnswers, $answer->answer);
  872.             }
  873.             $allAnswers = Arr::flatten($allAnswers);
  874.             $allAnswers = collect($allAnswers);
  875.             $userAnswers = $allAnswers->whereIn('question_id', $questionsIds);
  876.             if ($userAnswers->count() == 0)
  877.                 continue;
  878.  
  879.             $usersDoneTest++;
  880.             $level = $userAnswers->first()->question->level;
  881.  
  882.             $questions = $questions->where('level', $level);
  883.  
  884.             $points = 0;
  885.             foreach ($questions as $question) {
  886.                 if (in_array($question->getCorrectAnswer()->id, $userAnswers->pluck('id')->toArray()))
  887.                     if ($question->getCorrectAnswer()->userUsedHelp($attendant->user->JMBG))
  888.                         $points += 0.5;
  889.                     else
  890.                         $points += 1;
  891.             }
  892.             $averagePoints += $points;
  893.         }
  894.  
  895.         if ($usersDoneTest > 0)
  896.             $averagePoints /= $usersDoneTest;
  897.  
  898.         return view('teacher.courses.attendants', compact('course', 'attendants', 'averagePoints'));
  899.     }
  900.  
  901.     public function testStatistics(Request $request, $courseId)
  902.     {
  903.         $course = Course::findOrFail($courseId);
  904.         if (!Auth::check() || !Auth::user()->ownsCourse($course)) {
  905.             return redirect()->back();
  906.         }
  907.  
  908.         $attendants = $course->attends()->get();
  909.         $averagePoints = 0;
  910.         $usersDoneTest = 0;
  911.  
  912.         foreach ($attendants as $attendant) {
  913.             $questions = collect($course->questions())->where('type', 'test')->where('level', $request->input('level'));
  914.             $questionsIds = $questions->pluck('id');
  915.  
  916.             $rawAnswers = $attendant->user->answers;
  917.             $allAnswers = [];
  918.             foreach ($rawAnswers as $answer) {
  919.                 if ($answer->answer->question->type == "test")
  920.                     array_push($allAnswers, $answer->answer);
  921.             }
  922.             $allAnswers = Arr::flatten($allAnswers);
  923.             $allAnswers = collect($allAnswers);
  924.             $userAnswers = $allAnswers->whereIn('question_id', $questionsIds);
  925.             if ($userAnswers->count() == 0)
  926.                 continue;
  927.  
  928.             $usersDoneTest++;
  929.             $level = $userAnswers->first()->question->level;
  930.  
  931.             $questions = $questions->where('level', $level);
  932.  
  933.             $points = 0;
  934.             foreach ($questions as $question) {
  935.                 if (in_array($question->getCorrectAnswer()->id, $userAnswers->pluck('id')->toArray()))
  936.                     if ($question->getCorrectAnswer()->userUsedHelp($attendant->user->JMBG))
  937.                         $points += 0.5;
  938.                     else
  939.                         $points += 1;
  940.             }
  941.             $averagePoints += $points;
  942.         }
  943.  
  944.         if ($usersDoneTest > 0)
  945.             $averagePoints /= $usersDoneTest;
  946.  
  947.  
  948.         $questions = collect($course->questions())->where('type', 'test')->where('level', $request->input('level'));
  949.         foreach ($questions as $question) {
  950.             $usersWithCorrectAnswer = 0;
  951.             foreach ($attendants as $attendant) {
  952.                 $rawAnswers = $attendant->user->answers;
  953.                 $allAnswers = [];
  954.                 foreach ($rawAnswers as $answer) {
  955.                     if ($answer->answer->question->type == "test")
  956.                         array_push($allAnswers, $answer->answer);
  957.                 }
  958.                 $allAnswers = Arr::flatten($allAnswers);
  959.                 $allAnswers = collect($allAnswers);
  960.                 $userAnswer = $allAnswers->where('question_id', $question->id)->first();
  961.                 if ($userAnswer == null)
  962.                     continue;
  963.  
  964.                 if ($userAnswer->id == $question->getCorrectAnswer()->id)
  965.                     $usersWithCorrectAnswer++;
  966.             }
  967.             $question->usersWithCorrectAnswer = $usersWithCorrectAnswer;
  968.         }
  969.  
  970.         $questions = $questions->sortBy('usersWithCorrectAnswer');
  971.  
  972.         return view('teacher.courses.testStatistics', compact('course', 'questions', 'averagePoints', 'usersDoneTest'));
  973.     }
  974.  
  975.     public function rate(Request $request, $courseId)
  976.     {
  977.         $request->validate([
  978.             'rating' => 'required|numeric|min:1|max:5'
  979.         ]);
  980.         $course = Course::findOrFail($courseId);
  981.         if (!Auth::check() || !Auth::user()->attendsCourse($course))
  982.             return redirect()->back();
  983.  
  984.         $existingRating = Rating::where('user_JMBG', Auth::user()->JMBG)->where('course_id', $courseId)->first();
  985.         if ($existingRating) {
  986.             $existingRating->rating = $request->rating;
  987.             $existingRating->save();
  988.             return redirect()->back();
  989.         }
  990.         $rating = new Rating();
  991.         $rating->user_JMBG = Auth::user()->JMBG;
  992.         $rating->course_id = $courseId;
  993.         $rating->rating = $request->rating;
  994.         $rating->save();
  995.  
  996.         return redirect()->back();
  997.     }
  998. }
  999.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement