src/BackendBundle/Helper/UserHelper.php line 49

Open in your IDE?
  1. <?php
  2. namespace App\BackendBundle\Helper;
  3. use Doctrine\DBAL\Connection;
  4. use Doctrine\DBAL\Exception;
  5. use Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException;
  6. use Doctrine\DBAL\Statement;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Psr\Log\LoggerInterface;
  9. use Ramsey\Uuid\Uuid;
  10. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  11. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  12. use Symfony\Component\Routing\Router;
  13. use Symfony\Cmf\Component\Routing\ChainRouter;
  14. use App\BackendBundle\Helper\MenuHelper;
  15. use App\Entity\News;
  16. use App\Entity\User;
  17. use App\Entity\UserActivationLink;
  18. use App\Entity\UserData;
  19. use App\Entity\UserPasswordChange;
  20. use App\Entity\UserSetting;
  21. use App\Entity\UserRole;
  22. use App\Entity\Person;
  23. use DateTime;
  24. use Symfony\Component\Security\Core\User\UserInterface;
  25. class UserHelper
  26. {
  27.     private EntityManagerInterface $em;
  28.     private Connection $connection;
  29.     private MenuHelper $menuHelper;
  30.     private TokenStorageInterface $securityTokenStorage;
  31.     private ChainRouter $router;
  32.     private LoggerInterface $logger;
  33.     private UserPasswordHasherInterface $passwordHasher;
  34.     public function __construct(
  35.         EntityManagerInterface      $em,
  36.         MenuHelper                  $menuHelper,
  37.         TokenStorageInterface       $tokenStorage,
  38.         UserPasswordHasherInterface $hasher,
  39.         ChainRouter                 $router,
  40.         LoggerInterface             $logger
  41.     )
  42.     {
  43.         $this->em $em;
  44.         $this->connection $this->em->getConnection();
  45.         $this->menuHelper $menuHelper;
  46.         $this->securityTokenStorage $tokenStorage;
  47.         $this->passwordHasher $hasher;
  48.         $this->router $router;
  49.         $this->logger $logger;
  50.     }
  51.     public function getUserByID($userID): ?User
  52.     {
  53.         return $this->em->getRepository(User::class)->findOneBy(array('id' => $userID));
  54.     }
  55.     public function getUserByEmail($email): ?User
  56.     {
  57.         return $this->em->getRepository(User::class)->findOneBy(array('email' => $email));
  58.     }
  59.     public function createUser($email$password$isActive true$roleNames = array()): User
  60.     {
  61.         $user = new User();
  62.         $uuid Uuid::uuid7();
  63.         $user->setUuid($uuid);
  64.         $user->setUsername($email);
  65.         $encPassword $this->passwordHasher->hashPassword($user$password);
  66.         $user->setPassword($encPassword);
  67.         $user->setEmail($email);
  68.         $user->setIsActive($isActive);
  69.         $user->setCreatedAt(new DateTime());
  70.         $user->setLastLogin(null);
  71.         foreach ($roleNames as $roleName) {
  72.             $role $this->getRoleByName($roleName);
  73.             if (!empty($role)) {
  74.                 $user->addRole($role);
  75.             }
  76.         }
  77.         $this->em->persist($user);
  78.         $this->em->flush();
  79.         $this->createUserSetting($user);
  80.         return $user;
  81.     }
  82.     public function createPerson($firstname$lastname$sex$birthday): Person
  83.     {
  84.         $person = new Person();
  85.         $person->setFirstname($firstname);
  86.         $person->setLastname($lastname);
  87.         $person->setBirthday($birthday);
  88.         $person->setSex($sex);
  89.         $this->em->persist($person);
  90.         $this->em->flush();
  91.         return $person;
  92.     }
  93.     public function createUserData(User $user$person$communication$address): UserData
  94.     {
  95.         $userData = new UserData();
  96.         $userData->setUser($user);
  97.         $userData->setPerson($person);
  98.         $userData->setCommunication($communication);
  99.         $userData->setAddress($address);
  100.         $userData->setChangedAt(new DateTime());
  101.         $this->em->persist($userData);
  102.         $this->em->flush();
  103.         return $userData;
  104.     }
  105.     public function updateUser(User $user$email$password$active): void
  106.     {
  107.         $user->setUsername($email);
  108.         $user->setEmail($email);
  109.         if (!empty($password)) {
  110.             $encPassword $this->passwordHasher->hashPassword($user$password);
  111.             $user->setPassword($encPassword);
  112.         }
  113.         $user->setIsActive($active);
  114.         $this->em->persist($user);
  115.         $this->em->flush();
  116.     }
  117.     public function updatePerson(Person $person$gender$firstname$lastname): void
  118.     {
  119.         $person->setSex($gender);
  120.         $person->setFirstname($firstname);
  121.         $person->setLastname($lastname);
  122.         $this->em->persist($person);
  123.         $this->em->flush();
  124.     }
  125.     public function updatePersonTitles(Person $person$arrTitles): void
  126.     {
  127.         $person->getTitles()->clear();
  128.         if (!empty($arrTitles)) {
  129.             foreach ($arrTitles as $title) {
  130.                 $person->addTitle($title);
  131.             }
  132.         }
  133.         $this->em->persist($person);
  134.         $this->em->flush();
  135.     }
  136.     public function updateUserSetting(UserSetting $userSetting): UserSetting
  137.     {
  138.         $userSetting->setChangedAt(new \DateTime());
  139.         $this->em->persist($userSetting);
  140.         $this->em->flush();
  141.         return $userSetting;
  142.     }
  143.     public function getUserData(User $user): ?UserData
  144.     {
  145.         return $this->em->getRepository(UserData::class)->findOneBy(array('user' => $user));
  146.     }
  147.     public function getPersonById($id): ?Person
  148.     {
  149.         return $this->em->getRepository(Person::class)->findOneBy(array('id' => $id));
  150.     }
  151.     public function getRoleArray(): array
  152.     {
  153.         $allRoles $this->em->getRepository(UserRole::class)->findAll();
  154.         $result = array();
  155.         /* @var $role UserRole */
  156.         foreach ($allRoles as $role) {
  157.             $roleName $role->getName();
  158.             $result[$roleName] = $role;
  159.         }
  160.         return $result;
  161.     }
  162.     public function getRoleByID($roleID): ?UserRole
  163.     {
  164.         return $this->em->getRepository(UserRole::class)->findOneBy(array('id' => $roleID));
  165.     }
  166.     public function getRoleByName($name): ?UserRole
  167.     {
  168.         return $this->em->getRepository(UserRole::class)->findOneBy(array('name' => $name));
  169.     }
  170.     public function isUserLoggedIn()
  171.     {
  172.         $token $this->securityTokenStorage->getToken();
  173.         if (empty($token)) {
  174.             return false;
  175.         }
  176.         $user $token->getUser();
  177.         if ($user == null) {
  178.             return false;
  179.         }
  180.         if (is_string($user) && $user == 'anon.') {
  181.             return false;
  182.         }
  183.         return $user->hasRole('ROLE_USER');
  184.     }
  185.     public function getNewsUrl(User $user null): ?string
  186.     {
  187.         if ($user == null) {
  188.             return null;
  189.         }
  190.         if ($user->isCompany()) {
  191.             return $this->router->generate('company_news_page');
  192.         }
  193.         if ($user->isBoPartner()) {
  194.             return $this->router->generate('bopartner_news_page');
  195.         }
  196.         if ($user->isTeacher()) {
  197.             return $this->router->generate('teacher_news_page');
  198.         }
  199.         if ($user->isDirector()) {
  200.             return $this->router->generate('director_news_page');
  201.         }
  202.         return null;
  203.     }
  204.     /* Bookmark system with symfony is disabled - bookmarks are only available with angular */
  205.     public function canBookmark(User $user null): bool
  206.     {
  207.         return false;
  208.     }
  209.     public function getEncodedPassword($user$plainPassword): string
  210.     {
  211.         return $this->passwordHasher->hashPassword($user$plainPassword);
  212.     }
  213.     public function getUsersByRoleID($roleID)
  214.     {
  215.         $sqlText 'SELECT user FROM App\Entity\User user
  216.                     LEFT JOIN user.roles role
  217.                     WHERE role.id = :roleID';
  218.         $query $this->em->createQuery($sqlText);
  219.         $query->setParameter('roleID'$roleID);
  220.         return $query->getResult();
  221.     }
  222.     public function deleteUserProvider($userID): void
  223.     {
  224.         try {
  225.             $user $this->em->getRepository(User::class)->findOneBy(array('id' => $userID));
  226.             $this->deleteProfiles($user);
  227.             $this->deleteUserData($user);
  228.             $this->deletePasswordChanges($user);
  229.             $this->em->remove($user);
  230.             $this->em->flush();
  231.         } catch (ForeignKeyConstraintViolationException $exc) {
  232.             throw $exc;
  233.         }
  234.     }
  235.     public function deleteUserTeacher($userID): void
  236.     {
  237.         try {
  238.             $user $this->em->getRepository(User::class)->findOneBy(array('id' => $userID));
  239.             $this->deleteActivationLinks($user);
  240.             $this->deleteUserNews($user);
  241.             $this->deleteUserData($user);
  242.             $this->deletePasswordChanges($user);
  243.             $this->em->remove($user);
  244.             $this->em->flush();
  245.         } catch (ForeignKeyConstraintViolationException $exc) {
  246.             throw $exc;
  247.         }
  248.     }
  249.     private function deleteUserNews(User $user): void
  250.     {
  251.         $newsEntries $this->em->getRepository(News::class)->findBy(array('receiverUser' => $user));
  252.         /* @var $newsEntry News */
  253.         foreach ($newsEntries as $newsEntry) {
  254.             $this->em->remove($newsEntry);
  255.         }
  256.         $this->em->flush();
  257.     }
  258.     private function deleteActivationLinks(User $user): void
  259.     {
  260.         $activationLinks $this->em->getRepository(UserActivationLink::class)->findBy(array('user' => $user));
  261.         /* @var $activationLink UserActivationLink */
  262.         foreach ($activationLinks as $activationLink) {
  263.             $this->em->remove($activationLink);
  264.         }
  265.         $this->em->flush();
  266.     }
  267.     private function deleteUserData(User $user): void
  268.     {
  269.         $userData $user->getUserData();
  270.         if ($userData == null) {
  271.             return;
  272.         }
  273.         $address $userData->getAddress();
  274.         if ($address != null) {
  275.             $this->em->remove($address->getAddressLatLon());
  276.             $this->em->remove($address);
  277.         }
  278.         $comm $userData->getCommunication();
  279.         if ($comm != null) {
  280.             $this->em->remove($comm);
  281.         }
  282.         $person $userData->getPerson();
  283.         if ($comm != null) {
  284.             $this->em->remove($person);
  285.         }
  286.         $this->em->remove($userData);
  287.         $this->em->flush();
  288.     }
  289.     private function deletePasswordChanges(User $user): void
  290.     {
  291.         $userPasswordChanges $this->em->getRepository(UserPasswordChange::class)->findBy(array('user' => $user));
  292.         if (count($userPasswordChanges) <= 0) {
  293.             return;
  294.         }
  295.         foreach ($userPasswordChanges as $userPasswordChange) {
  296.             $this->em->remove($userPasswordChange);
  297.         }
  298.         $this->em->flush();
  299.     }
  300.     /**
  301.      * @throws Exception
  302.      */
  303.     private function deleteProfiles(User $user): void
  304.     {
  305.         $userID $user->getId();
  306.         $this->deleteUserCompanyProfileNameRequests($userID);
  307.         $this->deleteUserCompanyProfileMappings($userID);
  308.         $this->deleteUserBoPartnerProfileNameRequests($userID);
  309.         $this->deleteUserBoPartnerProfileMappings($userID);
  310.         $this->deleteUserSchoolProfileNameRequests($userID);
  311.         $this->deleteUserSchoolProfileMappings($userID);
  312.     }
  313.     /**
  314.      * @throws Exception
  315.      */
  316.     public function deleteUserCompanyProfileNameRequests($userID): void
  317.     {
  318.         $connection $this->em->getConnection();
  319.         $sqlDelete 'DELETE FROM company_profile_name_request WHERE user_id=:userID';
  320.         /* @var $deleteStmt Statement */
  321.         $deleteStmt $connection->prepare($sqlDelete);
  322.         $deleteStmt->bindParam('userID'$userID);
  323.         $deleteStmt->execute();
  324.     }
  325.     /**
  326.      * @throws Exception
  327.      */
  328.     public function deleteUserCompanyProfileMappings($userID): void
  329.     {
  330.         $connection $this->em->getConnection();
  331.         $sqlDelete 'DELETE FROM company_profile_mapping WHERE user_id=:userID';
  332.         /* @var $deleteStmt Statement */
  333.         $deleteStmt $connection->prepare($sqlDelete);
  334.         $deleteStmt->bindParam('userID'$userID);
  335.         $deleteStmt->execute();
  336.     }
  337.     /**
  338.      * @throws Exception
  339.      */
  340.     public function deleteUserBoPartnerProfileNameRequests($userID): void
  341.     {
  342.         $connection $this->em->getConnection();
  343.         $sqlDelete 'DELETE FROM bopartner_profile_name_request WHERE user_id=:userID';
  344.         /* @var $deleteStmt Statement */
  345.         $deleteStmt $connection->prepare($sqlDelete);
  346.         $deleteStmt->bindParam('userID'$userID);
  347.         $deleteStmt->execute();
  348.     }
  349.     /**
  350.      * @throws Exception
  351.      */
  352.     public function deleteUserBoPartnerProfileMappings($userID): void
  353.     {
  354.         $connection $this->em->getConnection();
  355.         $sqlDelete 'DELETE FROM bopartner_profile_mapping WHERE user_id=:userID';
  356.         /* @var $deleteStmt Statement */
  357.         $deleteStmt $connection->prepare($sqlDelete);
  358.         $deleteStmt->bindParam('userID'$userID);
  359.         $deleteStmt->execute();
  360.     }
  361.     /**
  362.      * @throws Exception
  363.      */
  364.     public function deleteUserSchoolProfileNameRequests($userID): void
  365.     {
  366.         $connection $this->em->getConnection();
  367.         $sqlDelete 'DELETE FROM school_profile_name_request WHERE user_id=:userID';
  368.         /* @var $deleteStmt Statement */
  369.         $deleteStmt $connection->prepare($sqlDelete);
  370.         $deleteStmt->bindParam('userID'$userID);
  371.         $deleteStmt->execute();
  372.     }
  373.     /**
  374.      * @throws Exception
  375.      */
  376.     public function deleteUserSchoolProfileMappings($userID): void
  377.     {
  378.         $connection $this->em->getConnection();
  379.         $sqlDelete 'DELETE FROM school_director_mapping WHERE user_id=:userID';
  380.         /* @var $deleteStmt Statement */
  381.         $deleteStmt $connection->prepare($sqlDelete);
  382.         $deleteStmt->bindParam('userID'$userID);
  383.         $deleteStmt->execute();
  384.     }
  385.     public function generateToken(): string
  386.     {
  387.         $now = new DateTime();
  388.         $str $now->format('d-m-Y H:i:s ');
  389.         $str .= 'berufsreisetoken';
  390.         $str .= rand(01000);
  391.         $hashAlgo 'sha256';
  392.         return hash($hashAlgo$str);
  393.     }
  394.     public function toggleUserActive(User $user): User
  395.     {
  396.         $currentState $user->getIsActive();
  397.         $user->setIsActive(!$currentState);
  398.         $this->em->persist($user);
  399.         $this->em->flush();
  400.         return $user;
  401.     }
  402.     public function createUserSetting(User $user null): ?UserSetting
  403.     {
  404.         if (empty($user)) {
  405.             return null;
  406.         }
  407.         $userSetting = new UserSetting();
  408.         $userSetting->setUser($user);
  409.         $selectedUserRole $this->menuHelper->getDefaultUserRole($user);
  410.         $userSetting->setSelectedUserRole($selectedUserRole);
  411.         $userSetting->setCreatedAt(new DateTime());
  412.         $this->em->persist($userSetting);
  413.         $this->em->flush();
  414.         return $userSetting;
  415.     }
  416.     /**
  417.      * @throws Exception
  418.      */
  419.     public function addUserRole(User $user nullstring $roleText '')
  420.     {
  421.         if (empty($user)) {
  422.             return null;
  423.         }
  424.         $userID $user->getId();
  425.         $hasRole $user->hasRole($roleText);
  426.         if ($hasRole) {
  427.             return null;
  428.         }
  429.         /* @var $role UserRole */
  430.         $role $this->getRoleByName($roleText);
  431.         if (empty($role)) {
  432.             return null;
  433.         }
  434.         $roleID $role->getId();
  435.         $connection $this->em->getConnection();
  436.         $insertSQL "INSERT INTO user_role_mapping (user_id, user_role_id) VALUES(:userID, :roleID)";
  437.         $stmt $connection->prepare($insertSQL);
  438.         $stmt->bindValue('userID'$userID);
  439.         $stmt->bindValue('roleID'$roleID);
  440.         $stmt->execute();
  441.     }
  442.     /**
  443.      * @throws Exception
  444.      */
  445.     public function removeUserRole(User $user nullstring $roleText '')
  446.     {
  447.         if (empty($user)) {
  448.             return null;
  449.         }
  450.         $userID $user->getId();
  451.         $hasRole $user->hasRole($roleText);
  452.         if (!$hasRole) {
  453.             return null;
  454.         }
  455.         /* @var $role UserRole */
  456.         $role $this->getRoleByName($roleText);
  457.         if (empty($role)) {
  458.             return null;
  459.         }
  460.         $roleID $role->getId();
  461.         $connection $this->em->getConnection();
  462.         $deleteSQL "DELETE FROM user_role_mapping WHERE user_id=:userID AND user_role_id=:roleID";
  463.         $stmt $connection->prepare($deleteSQL);
  464.         $stmt->bindValue('userID'$userID);
  465.         $stmt->bindValue('roleID'$roleID);
  466.         $stmt->execute();
  467.     }
  468.     public function isPasswordValid(User $user$plaintextPassword): bool
  469.     {
  470.         return $this->passwordHasher->isPasswordValid($user$plaintextPassword);
  471.     }
  472.     /**
  473.      * @throws Exception
  474.      */
  475.     public function updateLastLogin(?UserInterface $user)
  476.     {
  477.         if ($user == null) {
  478.             return;
  479.         }
  480.         $userId=$user->getId();
  481.         $updateSQL "UPDATE user SET last_login = NOW() WHERE id=:userID";
  482.         $stmt $this->connection->prepare($updateSQL);
  483.         $stmt->bindValue('userID'$userId);
  484.         $stmt->execute();
  485.     }
  486. }