First Commit
This commit is contained in:
+117
@@ -0,0 +1,117 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Http\Controllers\Tutorial;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\TutorialLesson;
|
||||
use App\Models\TutorialQuestion;
|
||||
use App\Models\TutorialUserProgress;
|
||||
use App\Services\TutorialService;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\View\View;
|
||||
use Barryvdh\DomPDF\Facade\Pdf;
|
||||
|
||||
class TutorialController extends Controller
|
||||
{
|
||||
public function __construct(
|
||||
private readonly TutorialService $tutorialService
|
||||
) {}
|
||||
|
||||
public function index(): View
|
||||
{
|
||||
$lessons = TutorialLesson::orderBy('order')->get();
|
||||
$progress = TutorialUserProgress::where('user_id', Auth::id())->first();
|
||||
|
||||
return view('tutorial.index', compact('lessons', 'progress'));
|
||||
}
|
||||
|
||||
public function lesson(int $id): View
|
||||
{
|
||||
$lesson = TutorialLesson::findOrFail($id);
|
||||
$lessons = TutorialLesson::orderBy('order')->get();
|
||||
$progress = TutorialUserProgress::where('user_id', Auth::id())->first();
|
||||
|
||||
$completedLessons = $progress?->completed_lessons ?? [];
|
||||
if (!in_array($id, $completedLessons)) {
|
||||
$completedLessons[] = $id;
|
||||
if (!$progress) {
|
||||
$progress = TutorialUserProgress::create(['user_id' => Auth::id(), 'completed_lessons' => $completedLessons]);
|
||||
} else {
|
||||
$progress->update(['completed_lessons' => $completedLessons]);
|
||||
}
|
||||
}
|
||||
|
||||
return view('tutorial.lesson', compact('lesson', 'lessons', 'progress'));
|
||||
}
|
||||
|
||||
public function quiz(): View
|
||||
{
|
||||
$questions = TutorialQuestion::orderBy('order')->get();
|
||||
$progress = TutorialUserProgress::where('user_id', Auth::id())->first();
|
||||
|
||||
return view('tutorial.quiz', compact('questions', 'progress'));
|
||||
}
|
||||
|
||||
public function submitQuiz(Request $request): View
|
||||
{
|
||||
$request->validate([
|
||||
'answers' => 'required|array',
|
||||
'answers.*' => 'required|string',
|
||||
]);
|
||||
|
||||
$questions = TutorialQuestion::orderBy('order')->get();
|
||||
$score = 0;
|
||||
$answers = $request->input('answers', []);
|
||||
$results = [];
|
||||
|
||||
foreach ($questions as $question) {
|
||||
$isCorrect = isset($answers[$question->id]) && $answers[$question->id] === $question->correct_answer;
|
||||
if ($isCorrect) {
|
||||
$score++;
|
||||
}
|
||||
$results[] = [
|
||||
'question' => $question->question,
|
||||
'your_answer' => $answers[$question->id] ?? null,
|
||||
'correct_answer' => $question->correct_answer,
|
||||
'is_correct' => $isCorrect,
|
||||
'explanation' => $question->explanation,
|
||||
];
|
||||
}
|
||||
|
||||
$passed = $score >= 6;
|
||||
|
||||
$progress = TutorialUserProgress::where('user_id', Auth::id())->first();
|
||||
if (!$progress) {
|
||||
$progress = TutorialUserProgress::create(['user_id' => Auth::id()]);
|
||||
}
|
||||
|
||||
$progress->update([
|
||||
'quiz_answers' => $answers,
|
||||
'quiz_score' => $score,
|
||||
'quiz_passed' => $passed,
|
||||
'quiz_completed_at' => now(),
|
||||
]);
|
||||
|
||||
return view('tutorial.result', compact('score', 'results', 'passed', 'progress'));
|
||||
}
|
||||
|
||||
public function certificate(): \Illuminate\Http\Response
|
||||
{
|
||||
$user = Auth::user();
|
||||
$progress = TutorialUserProgress::where('user_id', $user->id)->firstOrFail();
|
||||
|
||||
if (!$progress->quiz_passed) {
|
||||
return redirect()->route('tutorial.quiz')->with('error', 'Você precisa passar no quiz para gerar o certificado.');
|
||||
}
|
||||
|
||||
$progress->update(['certificate_generated_at' => now()]);
|
||||
|
||||
$pdf = Pdf::loadView('tutorial.certificate', compact('user', 'progress'));
|
||||
$pdf->setPaper('a4', 'landscape');
|
||||
|
||||
return $pdf->download('certificado-engenharia-prompt-gprompt.pdf');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user