src/Controller/IndexController.php line 32

Open in your IDE?
  1. <?php
  2. /**
  3.  * Created by PhpStorm.
  4.  * User: karg
  5.  * Date: 2019-03-26
  6.  * Time: 14:30
  7.  */
  8. namespace App\Controller;
  9. use App\Entity\School;
  10. use App\Entity\UserHasSchool;
  11. use App\Repository\UserHasSchoolRepository;
  12. use App\Service\MasterDataService;
  13. use App\Service\QualityCheckService;
  14. use Doctrine\ORM\NonUniqueResultException;
  15. use Symfony\Component\HttpFoundation\RedirectResponse;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
  19. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  20. class IndexController extends AbstractController
  21. {
  22.     /**
  23.      * @Route("/", name="home")
  24.      * @param MasterDataService   $masterDataService
  25.      * @param QualityCheckService $qualityCheckService
  26.      * @return Response
  27.      * @throws NonUniqueResultException
  28.      */
  29.     public function index(MasterDataService $masterDataServiceQualityCheckService $qualityCheckService): Response
  30.     {
  31.         return $this->render('index/index.html.twig', [
  32.             'controller_name' => 'IndexController',
  33.             'hasMasterData' => $masterDataService->hasFinalisedMasterData(),
  34.             'hasQualityCheck' => ! \is_null($qualityCheckService->getLastResult()),
  35.             'hasUpdatedMasterData' => $masterDataService->hasUpdatedMasterData(),
  36.         ]);
  37.     }
  38.     /**
  39.      * @Route("/accept_invite/{school}", name="accept_invite")
  40.      * @param School $school
  41.      * @return RedirectResponse
  42.      * @throws \Exception
  43.      */
  44.     public function acceptInvite(School $school): RedirectResponse
  45.     {
  46.         /** @var UserHasSchoolRepository $ur */
  47.         $uhsr $this->getDoctrine()->getRepository(UserHasSchool::class);
  48.         $uhs $uhsr->find(['user' => $this->getUser(), 'school' => $school]);
  49.         $uhs->setState(UserHasSchool::STATE_ACCEPTED);
  50.         $this->refreshToken();
  51.         $this->getDoctrine()->getManager()->flush($uhs);
  52.         $this->getSuccessMessage('Die Anfrage wurde angenommen!');
  53.         return $this->redirectToRoute('home');
  54.     }
  55.     /**
  56.      * @Route("/decline_invite/{school}", name="decline_invite")
  57.      * @param School $school
  58.      * @return RedirectResponse
  59.      * @throws \Exception
  60.      */
  61.     public function declineInvite(School $school): RedirectResponse
  62.     {
  63.         /** @var UserHasSchoolRepository $ur */
  64.         $uhsr $this->getDoctrine()->getRepository(UserHasSchool::class);
  65.         $uhs $uhsr->find(['user' => $this->getUser(), 'school' => $school]);
  66.         $uhs->setState(UserHasSchool::STATE_REJECTED);
  67.         $this->refreshToken();
  68.         $this->getDoctrine()->getManager()->flush($uhs);
  69.         $this->getErrorMessage('Die Anfrage wurde abgelehnt!');
  70.         return $this->redirectToRoute('home');
  71.     }
  72.     /**
  73.      * @Route("/change_school/{school}", name="change_school")
  74.      * @param School $school
  75.      * @return RedirectResponse
  76.      */
  77.     public function changeSchool(School $school): RedirectResponse
  78.     {
  79.         try {
  80.             $this->getUser()->setCurrentSchool($school);
  81.             $this->refreshToken();
  82.             $this->getDoctrine()->getManager()->flush();
  83.             $this->getSuccessMessage('Schule gewechselt!');
  84.         } catch (\Throwable $e) {
  85.             $this->getErrorMessage('Schule nicht gefunden!');
  86.         }
  87.         return $this->redirectToRoute('home');
  88.     }
  89.     /**
  90.      * @throws \Exception
  91.      */
  92.     protected function refreshToken(): void
  93.     {
  94.         // Session aktualisieren, sonst fliegt der User nach Redirekt raus
  95.         // always_authenticate_before_granting=true kann leider nicht verwendet werden
  96.         // bug: https://github.com/symfony/symfony/issues/32756
  97.         $token $this->container->get('security.token_storage')->getToken();
  98.         $token $token instanceof SwitchUserToken ?
  99.             new SwitchUserToken(
  100.                 $this->getUser(),
  101.                 $token->getCredentials(),
  102.                 $token->getProviderKey(),
  103.                 \array_merge($this->getUser()->getRoles(), ["ROLE_PREVIOUS_ADMIN"]),
  104.                 $token->getOriginalToken()
  105.             )
  106.             :
  107.             new UsernamePasswordToken(
  108.                 $this->getUser(),
  109.                 $token->getCredentials(),
  110.                 $token->getProviderKey(),
  111.                 $this->getUser()->getRoles()
  112.             );
  113.         $this->container->get('security.token_storage')->setToken($token);
  114.     }
  115. }