<?php
namespace App\Controller\Front\Exercise;
use App\Entity\Account\User;
use App\Entity\Exercise\Exercise;
use App\Entity\Scholar\Lesson\Lesson;
use App\Entity\Scholar\Module\Module;
use App\Entity\Scholar\Training\Training;
use App\Repository\Exercise\User\ExerciseResultRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
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 ExerciseResultRepository $exerciseResultRepository,
)
{
}
#[Route(path: '/training/{trainingId}/module/{moduleId}/lesson/{lessonId}/exercise/{exerciseId}', name: 'front_channel_exercise_show', methods: ['GET'])]
#[ParamConverter('training', options: ['id' => 'trainingId'])]
#[ParamConverter('module', options: ['id' => 'moduleId'])]
#[ParamConverter('lesson', options: ['id' => 'lessonId'])]
#[ParamConverter('exercise', options: ['id' => 'exerciseId'])]
public function __invoke(Request $request, Training $training, Module $module, Lesson $lesson, Exercise $exercise): Response
{
if (!$this->isGranted('FRONT_ACCESS', [
'training' => $training,
'module' => $module,
'lesson' => $lesson,
])) {
throw $this->createAccessDeniedException();
}
/** @var ?User $user */
$user = $this->getUser();
$bestExerciseResult = $user === null ? null : $this->exerciseResultRepository->findBestExerciseResultForUserAndExercise($user, $exercise);
if (
$exercise->getLesson() !== $lesson
) {
throw new NotFoundHttpException();
}
return $this->render('Front/Exercise/show.html.twig', [
'training' => $training,
'module' => $module,
'lesson' => $lesson,
'current_exercise' => $exercise,
'bestExerciseResult' => $bestExerciseResult,
'channel' => $training->getOwnerChannel(),
]);
}
}