118 lines
3.8 KiB
PHP
Executable File
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');
|
|
}
|
|
}
|