<?php
namespace App\Controller\Front\Scholar\Module;
use App\Enum\ScholarStatusEnum;
use App\Repository\Exercise\ExerciseRepository;
use App\Repository\Scholar\ChapterRepository;
use App\Repository\Scholar\LessonRepository;
use App\Repository\Scholar\ModuleRepository;
use App\Repository\Scholar\TrainingRepository;
use App\Service\Achievement\AchievementManager;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
class ShowController extends AbstractController
{
public function __construct(
private TrainingRepository $trainingRepository,
private ModuleRepository $moduleRepository,
private LessonRepository $lessonRepository,
private ExerciseRepository $exerciseRepository,
private AchievementManager $achievementManager,
private ChapterRepository $chapterRepository,
) {}
#[Route(path: '/training/{trainingId}/module/{moduleId}', name: 'front_channel_module_show_redirection', methods: ['GET'])]
public function __invoke(Request $request, string $trainingId, string $moduleId): Response
{
/**
* Redirect to first lesson of selected module
* If module doesn't exist in the training, redirect to training
* Where user will be redirected
* path: '/training/{trainingId}/module/{moduleId}/lesson/{lessonId}', name: 'front_channel_lesson_show'
*/
$training = $this->trainingRepository->find($trainingId);
if ($training === null || $training->getStatus() !== ScholarStatusEnum::PUBLISHED) {
throw new NotFoundHttpException('Training not found.');
}
$module = $this->moduleRepository->findOneByTrainingAndId($training, $moduleId);
if ($module === null || !in_array($module->getStatus(), [ScholarStatusEnum::PUBLISHED, null])) {
throw new NotFoundHttpException('Module not found.');
}
$lessons = $module->getLessons();
if ($lessons !== null && count($lessons) > 0) {
return $this->redirectToRoute('front_channel_lesson_show', [
'trainingId' => $trainingId,
'moduleId' => $moduleId,
'lessonId' => $lessons[0]->getLesson()->getId()
]);
}
return $this->redirectToRoute('front_channel_training_show', ['id' => $trainingId]);
}
}