src/Controller/DefaultController.php line 29

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Component\HttpFoundation\Response;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\RedirectResponse;
  6. use Symfony\Component\Routing\Annotation\Route;
  7. use Symfony\Component\Mime\MimeTypes;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  10. use App\Form\Type\UserType;
  11. use App\Entity\Structure;
  12. use App\Entity\Firm;
  13. use App\Entity\Attachment;
  14. use App\Entity\Activation;
  15. use App\Entity\User;
  16. use App\Repository\UserRepository;
  17. use App\Security\Voter;
  18. use App\Security\Roles;
  19. use App\Security\RoleSwitcher;
  20. use App\Service\TimetableManager;
  21. use App\Exception\UserActivationException;
  22. class DefaultController extends VicinAppController
  23. {
  24.     /**
  25.      * @Route("/", name="index")
  26.      */
  27.     public function index(Request $request)
  28.     {
  29.         $roleSwitcher $request->getSession()->get('roleSwitcher');
  30.         if ($roleSwitcher !== null) {
  31.             $active $roleSwitcher->getActiveRole();
  32.             if ($active !== null) {
  33.                 switch($active) {
  34.                     case RoleSwitcher::SUPER_ADMIN: return new RedirectResponse($this->generateUrl('superAdminFirms'));
  35.                     case RoleSwitcher::ADMIN: return new RedirectResponse($this->generateUrl('adminStructures'));
  36.                     case RoleSwitcher::USER: return new RedirectResponse($this->generateUrl('userStructures'));
  37.                 }
  38.             }
  39.         }
  40.         if ($this->isGranted('ROLE_SUPER_ADMIN')) {
  41.             return new RedirectResponse($this->generateUrl('superAdminFirms'));
  42.         }
  43.         if ($this->isGranted('ROLE_ADMIN')) {
  44.             return new RedirectResponse($this->generateUrl('adminStructures'));
  45.         }
  46.         if ($this->isGranted('ROLE_USER')) {
  47.             return new RedirectResponse($this->generateUrl('userStructures'));
  48.         }
  49.         return $this->render('index.html.twig');
  50.     }
  51.     
  52.     /**
  53.      * @Route("/clearSession", name="clearSession")
  54.      */
  55.     public function clearSession(Request $request)
  56.     {
  57.         $request->getSession()->set('newTimetable',null);
  58.     }
  59.     
  60.     /**
  61.      * @Route("/structures", name="structures")
  62.      */
  63.     public function structures()
  64.     {
  65.         $structures $this->doctrine->getRepository(Structure::class)->findAll();
  66.         return $this->render('default/structures.html.twig', array('entities'=>$structures));
  67.     }
  68.     
  69.     /**
  70.      * @Route("/firms", name="firms")
  71.      */
  72.     public function firms()
  73.     {
  74.         $structures $this->doctrine->getRepository(Firm::class)->findAll();
  75.         return $this->render('default/firms.html.twig', array('entities'=>$structures));
  76.     }
  77.     
  78.     /**
  79.      * @Route("/downloadAttachment/{id}", name="downloadAttachment", requirements={"id" = "\d+"})
  80.      */
  81.     public function downloadAttachment(Request $requestAttachment $attachment$id)
  82.     {
  83.         $this->denyAccessUnlessGranted(Voter::ATTACHMENT$attachment);
  84.         $response = new Response(stream_get_contents($attachment->getContent()));
  85.         $mime MimeTypes::getDefault()->getMimeTypes($attachment->getType());
  86.         if (! empty($mime)) $response->headers->set('Content-Type',$mime[0]);
  87.         $filename $attachment->getFullName();
  88.         $response->headers->set('Content-Disposition',"attachment; filename=\"{$filename}\"");
  89.         $response->headers->set('Content-Length',$attachment->getSize());
  90.         return $response;
  91.     }
  92.     
  93.     /**
  94.      * @Route("/activateUser/{token}", name="activateUser")
  95.      */
  96.     public function activateUser(Request $request$tokenActivation $activationUserPasswordHasherInterface $passwordHasherTimetableManager $ttManager)
  97.     {
  98.         try {
  99.         if ($activation->isActivated()) throw new UserActivationException("L'attivazione è già avvenuta");
  100.         $user $this->doctrine->getRepository(User::class)->findOneByEmail($activation->getEmail());
  101.         if ($user !== null) throw new UserActivationException("L'utente è già esistente");
  102.         $user = new User();
  103.         if ($activation->getHousingUnit() !== null) {
  104.             $user->setAddress($activation->getHousingUnit()->getAddress());
  105.             $user->setZipCode($activation->getHousingUnit()->getZipCode());
  106.             $user->setCity($activation->getHousingUnit()->getCity());
  107.             $user->setProvince($activation->getHousingUnit()->getProvince());
  108.         }
  109.         $user->setEmail($activation->getEmail());
  110.         $form $this->createForm(UserType::class, $user);
  111.         $form->handleRequest($request);
  112.         if ($form->isSubmitted() && $form->isValid()) {
  113.             $user->setEmail($activation->getEmail());   //just to be sure it's not been changed by user
  114.             $user->setActive(true);
  115.             $user->setAlerts(true);
  116.             if ($user->getPrivacyCheck()) $user->setPrivacy(new \DateTime());
  117.             $hashedPassword $passwordHasher->hashPassword($user$user->getPlainPassword());
  118.             $user->setPassword($hashedPassword);
  119.             $user->setRoles([Roles::USER]); //overwritten to admin if there is at least one activation as admin(*)
  120.             $em $this->doctrine->getManager();
  121.             //$userRepo = $em->getRepository(User::class);
  122.             $em->persist($user);
  123.             $em->flush();   //I need to flush before adding the user to timetables otherwise he won't have an id
  124.             $this->handleUserActivation($user$activation,  $ttManager);
  125.             // check if more activations were present for same user
  126.             $more $em->getRepository(Activation::class)->findByEmail($activation->getEmail());
  127.             foreach($more as $act) {
  128.                 if ($act === $activation) continue; //skip the same one!
  129.                 $this->handleUserActivation($user$act,  $ttManager);
  130.             }
  131.             $em->flush();
  132.             $request->getSession($request)->getFlashBag()->add('success''I dati sono stati salvati, ora puoi fare login con email e password');
  133.             return new RedirectResponse($this->generateUrl('app_login'));
  134.         }
  135.             
  136.         } catch (UserActivationException $ex) {
  137.             $request->getSession($request)->getFlashBag()->add('warning'$ex->getMessage());
  138.             return new RedirectResponse($this->generateUrl('index'));
  139.         }
  140.         //$user->setPrivacyCheck(false);  NON FUNZIONA!!
  141.         return $this->render('default/activateUser1.html.twig', array('form' => $form->createView(), 'email'=>$user->getEmail()));
  142.     }
  143.     
  144.     private function handleUserActivation(User $userActivation $activationTimetableManager $ttManager) {
  145.         if ($activation->isAdmin()) {
  146.             $user->setRoles([Roles::ADMIN]);    //see before (*)
  147.             /* 
  148.              * WARNING: there may be more than one activations as admin, for different firms.
  149.              * As the first activation processed is the one the user is answering to, this one will be kept as the good one - if it is an admin activation
  150.              * If the user answered to a user activation and there are some admin activations, one of them will be randomly kept
  151.              */
  152.             if ($user->getFirm() === null) {
  153.                 $user->setFirm($activation->getFirm()); 
  154.                 //if it's first admin for firm, he must be set as owner
  155.                 $admins $activation->getFirm()->getUsers();
  156.                 if ($admins->isEmpty()) {
  157.                     $user->setRoles([Roles::FIRM_OWNER]);
  158.                 }
  159.             }
  160.         } else {
  161.             if ($activation->getOwner()) {
  162.                 $activation->getHousingUnit()->addOwner($user);
  163.                 $ttManager->newOwner($activation->getHousingUnit()->getStructure(), $user);
  164.             }
  165.             if ($activation->getTenant()) {
  166.                 $activation->getHousingUnit()->addTenant($user);
  167.                 $ttManager->newTenant($activation->getHousingUnit()->getStructure(), $user);
  168.             }
  169.             $activation->getFirm()->addLinkedUser($user);
  170.         }
  171.         $activation->setConfirmation(new \DateTime());
  172.     }
  173.     /**
  174.      * @Route("/reactivateUser/{token}", name="reactivateUser")
  175.      */
  176.     public function reactivateUser(Request $request$token)
  177.     {
  178.         $user $this->doctrine->getRepository(User::class)->findOneByToken($token);
  179.         if ($user === null) throw new \Exception("Token non trovato");
  180.         $user->setActive(true);
  181.         $user->setToken(null);
  182.         $this->doctrine->getManager()->flush();
  183.         $this->addFlash('success''L\'account è stato riattivato, puoi fare login con email e password');
  184.         return new RedirectResponse($this->generateUrl('app_login'));
  185.     }
  186.     
  187.     /**
  188.      * @Route("/inactiveUser/", name="inactiveUser")
  189.      */
  190.     public function inactiveUser()
  191.     {
  192.         return $this->render('errors/inactiveUser.html.twig');
  193.     }
  194.     
  195.     /**
  196.      * @Route("/endImpersonate/", name="endImpersonate")
  197.      */
  198.     public function endImpersonate(Request $request)
  199.     {
  200.         $request->getSession()->set('roleSwitcher',null);
  201.         return new RedirectResponse($this->generateUrl('index',['_switch_user' => '_exit']));
  202.     }
  203.     
  204.     
  205. }