Files
2026-09-01 09:22:30 -03:00

118 lines
3.8 KiB
PHP
Executable File

<?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');
}
}