<?php
namespace App\Controller;
use App\Entity\Meeting;
use App\Repository\UserRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGenerator;
class HomeController extends AbstractController
{
/**
* @return RedirectResponse
*/
#[Route(path: '/patient/listing', name: 'patient_list_redirection')]
public function patientListRedirection(): RedirectResponse
{
return $this->redirectToRoute('react_app');
}
/**
* @return RedirectResponse|Response
*/
#[Route(path: '/', name: 'homepage')]
public function home(): RedirectResponse|Response
{
if ($this->isGranted('ROLE_DOCTOR')) {
return $this->redirectToRoute('react_app');
}
if ($this->isGranted('ROLE_ESTABLISHMENT_ADMIN') || $this->isGranted('ROLE_SUPER_ADMIN')) {
return $this->redirectToRoute('admin_user');
}
return $this->render('patient/home.html.twig');
}
/**
* @return RedirectResponse
*/
#[Route(path: '/logout', name: 'app_logout')]
public function logout(): RedirectResponse
{
session_unset();
$route = $_SERVER['OIDC_BASE_URI'] . 'auth/realms/' . $_SERVER['OIDC_REALM'] . '/protocol/openid-connect/logout?redirect_uri=' . $this->generateUrl('homepage', [
'_locale' => 'fr'
], UrlGenerator::ABSOLUTE_URL);
return $this->redirect($route, Response::HTTP_TEMPORARY_REDIRECT);
}
/**
* Point d’entrée application React
* @return Response
*/
#[Route(path: '/app', name: 'react_app')]
public function webApp(): Response
{
return $this->render('webapp.html.twig');
}
/**
* Point d’entrée Cgu
* @return Response
*/
#[Route(path: '/cguEnsweet', name: 'cgu_ensweet')]
public function cgu(): Response
{
return $this->render('cgu.html.twig');
}
/**
* Point d’entrée Ifu
* @return Response
*/
#[Route(path: '/ifuEnsweet', name: 'ifu_ensweet')]
public function ifu(): Response
{
return $this->render('ifu.html.twig');
}
/**
* Point d’entrée onBoarding
* @return Response
*/
#[Route(path: '/onBoardingEnsweet', name: 'onBoarding_ensweet')]
public function onBoarding(): Response
{
return $this->render('onBoarding.html.twig');
}
/**
* Point d’entrée onBoarding
* @return Response
*/
#[Route(path: '/welcomeBookletEnsweet', name: 'welcomeBooklet_ensweet')]
public function welcomeBooklet(): Response
{
return $this->render('welcomeBooklet.html.twig');
}
/**
* Point de test pour les sondes kubernetes & pictime
* @return JsonResponse
*/
#[Route(path: '/_health', name: 'health_check')]
public function health(): JsonResponse
{
return $this->json([
'result' => 'OK'
]);
}
/**
* ⚠️ Route sans authentification (hors token)
* @param UserRepository $userRepository
* @param Meeting $meeting
* @param string $token
* @return Response
*/
#[ParamConverter('id', class: Meeting::class)]
#[Route(path: '/conference/{id}/{token}', name: 'join_conference')]
public function conference(UserRepository $userRepository, Meeting $meeting, string $token): Response
{
$meta = $meeting->getMetadata();
$isDoctor = false;
$isGuest = in_array($token, $meta['tokens']['guest']);
$isPresenter = in_array($token, $meta['tokens']['presenter']);
$isExternal = isset($meta['tokens']['external']) && in_array($token, $meta['tokens']['external']);
if (!$isGuest && !$isPresenter && !$isExternal) {
return $this->json([
'error' => 'Token not accepted'
], Response::HTTP_FORBIDDEN);
}
if (!$isExternal && ($uuid = $isGuest ? array_search($token, $meta['tokens']['guest']) : array_search($token, $meta['tokens']['presenter']))) {
$user = $userRepository->findOneBy([
'uniqKey' => $uuid
]);
if (!$user) {
return $this->json(['error' => 'User not found'], Response::HTTP_NOT_FOUND);
}
$userName = $user->getFirstname() . ' ' . $user->getLastname();
$isDoctor = in_array('ROLE_DOCTOR', $user->getRoles());
} else {
$userName = array_search($token, $meta['tokens']['external']);
}
$data = [
'token' => $token,
'meetingUrl' => $meeting->getMetadata()['room']['url'],
'userName' => $userName,
'isDoctor' => $isDoctor
];
if ($meeting->getBoardId() != null) {
$data['whiteBoardUrl'] = $isDoctor ? 'https://miro.com/app/board/' . $meeting->getBoardId() . '/' : 'https://miro.com/app/board/' . $meeting->getBoardId() . '/?embedMode=view_only_without_ui';
} else {
$data['whiteBoardUrl'] = null;
}
$data['etpBoards'] = null;
if($meeting->getEtpBoardIds()) {
$data['etpBoards'] = array_map(function($board) {
return [
'url' => 'https://miro.com/app/board/' . $board['id'] . '/',
'name' => $board['name']
];
}, $meeting->getEtpBoardIds());
}
return $this->render('conference.html.twig', $data);
}
}