����JFIF��x�x����'
Server IP : 66.29.137.217 / Your IP : 18.218.195.15 Web Server : LiteSpeed System : Linux premium294.web-hosting.com 4.18.0-513.11.1.lve.el8.x86_64 #1 SMP Thu Jan 18 16:21:02 UTC 2024 x86_64 User : gltevjme ( 1095) PHP Version : 7.0.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/gltevjme/cbt.gltechlimited.com/app/Http/Controllers/User/ |
Upload File : |
<?php /** * File name: PracticeController.php * Last modified: 18/07/21, 3:06 PM * Author: NearCraft - https://codecanyon.net/user/nearcraft * Copyright (c) 2021 */ namespace App\Http\Controllers\User; use App\Filters\PracticeSetFilters; use App\Http\Controllers\Controller; use App\Models\PracticeSession; use App\Models\PracticeSet; use App\Models\Question; use App\Models\Section; use App\Models\Skill; use App\Models\SubCategory; use App\Repositories\QuestionRepository; use App\Repositories\UserPracticeSetRepository; use App\Transformers\Platform\PracticeQuestionTransformer; use App\Transformers\Platform\PracticeSetCardTransformer; use App\Transformers\Platform\PracticeSolutionTransformer; use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Inertia\Inertia; class PracticeController extends Controller { private UserPracticeSetRepository $repository; private QuestionRepository $questionRepository; public function __construct(UserPracticeSetRepository $repository, QuestionRepository $questionRepository) { $this->middleware(['role:guest|student|employee']); $this->repository = $repository; $this->questionRepository = $questionRepository; } /** * View available practice sets for a section * * @param SubCategory $category * @param Section $section * @param $skill * @return \Inertia\Response */ public function practiceSets(SubCategory $category, Section $section, $skill) { $skill = Skill::where('slug', $skill)->firstOrFail(); return Inertia::render('User/PracticeSets', [ 'category' => $category, 'section' => $section, 'skill' => $skill, 'subscription' => request()->user()->hasActiveSubscription($category->id, 'practice_sets') ]); } /** * Fetch practice sets for the practice sets screen * * @param SubCategory $category * @param Section $section * @param $skill * @param PracticeSetFilters $filters * @return \Illuminate\Http\JsonResponse */ public function fetchPracticeSets(SubCategory $category, Section $section, $skill, PracticeSetFilters $filters) { $skill = Skill::where('slug', $skill)->firstOrFail(); $sets = fractal($skill->practiceSets()->with('skill:id,name') ->where('sub_category_id', $category->id)->where('practice_sets.is_active', '=', 1) ->orderBy('practice_sets.is_paid', 'asc') ->paginate(20), new PracticeSetCardTransformer()) ->toArray(); return response()->json([ 'sets' => $sets ], 200); } /** * Create or Load a Practice Session and redirect to practice screen * * @param PracticeSet $practiceSet * @return \Illuminate\Http\RedirectResponse */ public function initPracticeSet(PracticeSet $practiceSet) { $subscription = request()->user()->hasActiveSubscription($practiceSet->sub_category_id, 'practice_sets'); if($practiceSet->is_paid && !$subscription) { return redirect()->back()->with('errorMessage', __('You don\'t have an active plan to access this content. Please subscribe.')); } $practiceSet->loadCount(['questions', 'sessions' => function ($query) { $query->where('user_id', auth()->user()->id); }]); // Restrict if there are no questions in this practice set if($practiceSet->questions_count == 0) { return redirect()->back()->with('errorMessage', __('There are no questions in this practice set')); } if($practiceSet->sessions_count > 0) { $session = $this->repository->getSession($practiceSet); } else { $session = $this->repository->createSession($practiceSet); } if($session->status == 'completed') { return redirect()->route('get_practice_session_analysis', ['practiceSet' => $practiceSet->slug, 'session' => $session->code]) ->with('successMessage', __('You completed this practice set')); } return redirect()->route('go_to_practice', ['practiceSet' => $practiceSet->slug, 'session' => $session->code]); } /** * Go To Practice Screen * * @param PracticeSet $practiceSet * @param $session * @return \Illuminate\Http\RedirectResponse|\Inertia\Response */ public function goToPractice(PracticeSet $practiceSet, $session) { $subscription = request()->user()->hasActiveSubscription($practiceSet->sub_category_id, 'practice_sets'); if($practiceSet->is_paid && !$subscription) { return redirect()->back()->with('errorMessage', __('You don\'t have an active plan to access this content. Please subscribe.')); } $session = PracticeSession::where('code', $session)->firstOrFail(); return Inertia::render('User/PracticeScreen', [ 'practiceSet' => $practiceSet->only('code', 'title', 'slug', 'total_questions', 'allow_rewards'), 'settings' => [ 'show_reward_popup' => $practiceSet->settings->get('show_reward_popup', true), ], 'session' => $session, ]); } /** * Fetch practice set questions with session questions * * @param PracticeSet $practiceSet * @param $session * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse */ public function getPracticeQuestions(PracticeSet $practiceSet, $session) { $subscription = request()->user()->hasActiveSubscription($practiceSet->sub_category_id, 'practice_sets'); if($practiceSet->is_paid && !$subscription) { return redirect()->back()->with('errorMessage', __('You don\'t have an active plan to access this content. Please subscribe.')); } $session = PracticeSession::with('questions')->where('code', $session)->firstOrFail(); $questions = fractal($practiceSet->questions()->with(['questionType:id,name,code', 'skill:id,name', 'comprehensionPassage:id,body', 'practiceSessions' => function($query) use ($session) { $query->where('practice_session_id', $session->id); }])->paginate(5), new PracticeQuestionTransformer())->toArray(); return response()->json([ 'questions' => $questions['data'], 'pagination' => $questions['meta']['pagination'], 'answered' => $session->questions()->wherePivot('status', '=', 'answered')->count(), ], 200); } /** * Check the user submitted answer is correct or not and update session accordingly * * @param Request $request * @param PracticeSet $practiceSet * @param $session * @return \Illuminate\Http\JsonResponse */ public function checkAnswer(Request $request, PracticeSet $practiceSet, $session) { $session = PracticeSession::select(['id', 'code', 'practice_set_id', 'total_time_taken', 'total_points_earned', 'percentage_completed']) ->where('code', $session) ->firstOrFail(); $question = Question::select(['id', 'question', 'options', 'correct_answer', 'default_marks', 'solution', 'question_type_id']) ->with(['questionType:id,name,code']) ->where('code', $request->question_id) ->firstOrFail(); $isCorrect = $this->questionRepository->evaluateAnswer($question, $request->user_answer); $correctAnswer = $this->questionRepository->formatCorrectAnswer($question, $request->user_answer); $pointsEarned = $practiceSet->auto_grading ? $question->default_marks : $practiceSet->correct_marks; /*Insert or Update Session Question*/ DB::table('practice_session_questions')->upsert([ 'question_id' => $question->id, 'practice_session_id' => $session->id, 'original_question' => formatQuestionProperty($question->question, $question->questionType->code), 'options' => serialize(formatOptionsProperty($question->options, $question->questionType->code, $question->question)), 'user_answer' => serialize($request->user_answer), 'correct_answer' => serialize($correctAnswer), 'time_taken' => $request->time_taken, 'points_earned' => $isCorrect ? $pointsEarned : 0, 'is_correct' => $isCorrect, 'status' => 'answered' ], ['question_id', 'practice_session_id'], ['user_answer', 'is_correct', 'time_taken', 'status'] ); /*Update Session */ if($isCorrect) { $session->total_points_earned = $session->total_points_earned + $pointsEarned; } $totalAnswered = $session->questions()->wherePivot('status', '=', 'answered')->count(); $session->percentage_completed = $totalAnswered != 0 ? round(($totalAnswered/$practiceSet->total_questions) * 100, 2) : 0; $session->total_time_taken = $request->total_time_taken; $session->update(); return response()->json([ 'is_correct' => $isCorrect, 'status' => 'answered', 'solution' => $question->solution, 'solution_video' => $question->solution_video, 'ca' => $correctAnswer, 'points_earned' => $isCorrect ? $pointsEarned : 0, 'total_points_earned' => $session->total_points_earned, 'answered' => $totalAnswered ], 200); } /** * Finish Practice Session and Redirect to Analysis Screen * * @param PracticeSet $practiceSet * @param $session * @return \Illuminate\Http\RedirectResponse * @throws \Throwable */ public function finish(PracticeSet $practiceSet, $session) { $session = PracticeSession::with('questions')->where('code', $session)->firstOrFail(); DB::transaction(function () use($practiceSet, $session) { if($practiceSet->allow_rewards && $session->total_points_earned > 0 && $session->status != 'completed') { auth()->user()->deposit($session->total_points_earned, ['description' => $practiceSet->title, 'session' => $session->code]); } $session->percentage_completed = round(100, 2); $session->status = 'completed'; $session->completed_at = Carbon::now()->toDateTimeString(); $session->results = array_merge($this->repository->sessionAnalytics($session, $practiceSet->total_questions), [ 'allow_rewards' => $practiceSet->allow_rewards ]); $session->update(); }); return redirect()->route('get_practice_session_analysis', ['practiceSet' => $practiceSet->slug, 'session' => $session->code]); } /** * Practice Session Analysis and Progress Status * * @param PracticeSet $practiceSet * @param $session * @return \Inertia\Response */ public function analysis(PracticeSet $practiceSet, $session) { $session = PracticeSession::with('questions')->where('code', $session)->firstOrFail(); if(request()->has('total_time_taken')) { $session->total_time_taken = request()->get('total_time_taken'); $session->update(); } return Inertia::render('User/PracticeAnalysis', [ 'practiceSet' => $practiceSet->only('code', 'title', 'slug', 'total_questions'), 'session' => $session->only('code', 'total_time_taken', 'total_points_earned', 'status'), 'analytics' => $session->status == 'completed' ? $session->results : $this->repository->sessionAnalytics($session, $practiceSet->total_questions), 'allowRewards' => $session->results->get('allow_rewards', $practiceSet->allow_rewards) ]); } /** * Get Practice Session solutions api endpoint * * @param PracticeSet $practiceSet * @param $session * @return \Illuminate\Http\JsonResponse */ public function solutions(PracticeSet $practiceSet, $session) { $session = PracticeSession::with('questions')->where('code', $session)->firstOrFail(); $questions = fractal($session->questions()->with(['questionType:id,name,code', 'skill:id,name']) ->get(['id','code', 'question', 'question_type_id', 'skill_id', 'solution', 'solution_video']), new PracticeSolutionTransformer())->toArray(); return response()->json([ 'questions' => $questions['data'], ], 200); } }