<?php
/*
* This file is part of the nellapp package.
*
* (c) Benjamin Georgeault <https://www.drosalys-web.fr/>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Controller\Front\Scholar\Training;
use App\Entity\Account\Advice;
use App\Entity\Account\User;
use App\Entity\Scholar\Training\Training;
use Nellapp\Bundle\SDKBundle\Permission\Enum\ChannelUserTrainingPermissionEnum;
use App\Form\Account\AdviceType;
use App\Repository\Account\AdviceRepository;
use App\Repository\ChannelUserData\AbstractCursusRepository;
use App\Service\Advice\AdviceManager;
use App\Service\Scholar\ModuleService;
use App\Service\Scholar\StatusService;
use App\Service\Scholar\TrainingService;
use App\Service\Scholar\UserProgression\UserProgressionService;
use Doctrine\ORM\EntityManagerInterface;
use Nellapp\Bundle\SDKBundle\Permission\ChannelUserPermissionService;
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;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
class ShowController extends AbstractController
{
public function __construct(
private EntityManagerInterface $em,
private AuthorizationCheckerInterface $authorizationChecker,
private AdviceRepository $adviceRepository,
private AdviceManager $adviceManager,
private StatusService $statusService,
private AbstractCursusRepository $cursusRepository,
private TrainingService $trainingService,
private ModuleService $moduleService,
private UserProgressionService $userProgressionService,
private ChannelUserPermissionService $channelUserPermissionService,
)
{
}
#[Route(
path: '/training/{id}',
name: 'front_channel_training_show',
)]
#[ParamConverter('training', options: ['id' => 'id'])]
public function __invoke(Request $request, Training $training): Response
{
if ($this->statusService->isDraft($training)) {
throw new NotFoundHttpException();
}
$vars = $this->variables($request, $training);
return $this->render('Front/Scholar/Training/show.html.twig', $vars);
}
/**
* @param Request $request
* @param Training $sub
* @return array
*/
protected function variables(Request $request, $sub): array
{
$vars = [];
$advice = null;
$cursus = null;
$trainingProgression = null;
/** @var ?User $user */
$user = $this->getUser();
$form = null;
if (null !== $user) {
$advice = $this->adviceRepository->findOneByUserAndTraining($user, $sub);
if ($advice === null) {
$advice = new Advice();
}
$form = $this->createForm(AdviceType::class, $advice);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$advice->setUser($user);
$advice->setTraining($sub);
$this->em->persist($advice);
$this->em->flush();
}
$cursusList = $this->cursusRepository->findActiveCursusByTrainingAndUser($sub, $user);
$cursus = count($cursusList) >= 1 ? $cursusList[array_key_first($cursusList)] : null;
$trainingProgression = $this->userProgressionService->getUserProgressionByTrainingAndUser($sub, $user);
$modules = $trainingProgression->getModules();
} else {
$modules = $this->trainingService->getActiveModules($sub);
$modulesWithLessons = [];
foreach ($modules as $module) {
$moduleLessons = [];
$activeLessons = $this->moduleService->getActiveLessons($module);
foreach ($activeLessons as $lesson) {
$moduleLessons[$lesson->getId()] = [
'id' => $lesson->getId(),
'name' => $lesson->getName(),
'isPublic' => $lesson->isPublic(),
'hasFrontAccess' => $this->authorizationChecker->isGranted('FRONT_ACCESS', [
'training' => $sub,
'module' => $module,
'lesson' => $lesson,
]),
];
}
$modulesWithLessons[$module->getId()] = [
'lessons' => $moduleLessons,
'id' => $module->getId(),
'name' => $module->getName(),
];
}
$modules = $modulesWithLessons;
}
$allAdvice = $this->adviceManager->getTrainingAdvices($sub, $user);
$trainingDescriptionEntities = $sub->getTrainingDescriptions();
//TOCHECK
$teacherEntities = $this->channelUserPermissionService->getAllUserForGivenPermissions($sub, ChannelUserTrainingPermissionEnum::CHANNEL_USER_PERM_TRAINING_MANAGE_COMMENT);
$firstModules = array_slice($modules, 0, 5);
$lastModules = array_slice($modules, 5);
$vars['user'] = $user;
$vars['form'] = $form?->createView();
$vars['training_advices'] = $allAdvice;
$vars['training_descriptions'] = $trainingDescriptionEntities;
$vars['teacher_entities'] = $teacherEntities;
$vars['advice_user'] = $advice;
$vars['cursus'] = $cursus;
$vars['sub'] = $sub;
$vars['channel'] = $sub->getOwnerChannel();
$vars['trainingProgression'] = $trainingProgression;
$vars['firstModules'] = $firstModules;
$vars['lastModules'] = $lastModules;
return $vars;
}
}