src/EventSubscriber/Doctrine/UserSubscriber.php line 84

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\Doctrine;
  3. use App\Enum\ActivityLogCategoryEnum;
  4. use App\Enum\ActivityLogMethodEnum;
  5. use App\Manager\UserRegisterManager;
  6. use App\Service\OrganizationUtils;
  7. use App\Service\SegmentAPI;
  8. use App\Traits\SentryNotifyTrait;
  9. use Doctrine\Common\EventSubscriber;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Doctrine\ORM\Event\PreUpdateEventArgs;
  12. use Doctrine\Persistence\Event\LifecycleEventArgs;
  13. use Evo\Infrastructure\MappingORM\ActivityLog;
  14. use Evo\Infrastructure\MappingORM\User;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\RequestStack;
  17. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  18. use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
  19. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  20. use Symfony\Component\Security\Core\Security;
  21. class UserSubscriber implements EventSubscriber
  22. {
  23.     use SentryNotifyTrait;
  24.     public const SERVICE_NAME '[USER SUBSCRIBER] :: ';
  25.     private SegmentAPI $segment;
  26.     private UserPasswordEncoderInterface $encoder;
  27.     private OrganizationUtils $organizationUtils;
  28.     private UserRegisterManager $userRegisterManager;
  29.     private EntityManagerInterface $em;
  30.     private Security $security;
  31.     private RequestStack $requestStack;
  32.     public function __construct(
  33.         SegmentAPI $segmentAPI,
  34.         OrganizationUtils $organizationUtils,
  35.         UserPasswordEncoderInterface $encoder,
  36.         UserRegisterManager $userRegisterManager,
  37.         EntityManagerInterface $em,
  38.         Security $security,
  39.         RequestStack $requestStack
  40.     ) {
  41.         $this->segment $segmentAPI;
  42.         $this->organizationUtils $organizationUtils;
  43.         $this->encoder $encoder;
  44.         $this->userRegisterManager $userRegisterManager;
  45.         $this->em $em;
  46.         $this->security $security;
  47.         $this->requestStack $requestStack;
  48.     }
  49.     public function getSubscribedEvents(): array
  50.     {
  51.         return [
  52.             'prePersist',
  53.             'postPersist',
  54.             'preUpdate',
  55.             'postUpdate',
  56.         ];
  57.     }
  58.     public function prePersist(LifecycleEventArgs $args): void
  59.     {
  60.         $entity $args->getObject();
  61.         if (!$entity instanceof User) {
  62.             return;
  63.         }
  64.         if ('admin@digidom.pro' === $entity->getEmail()) {
  65.             throw new NotFoundHttpException('User can\'t be updated.');
  66.         }
  67.         $entity->setPhoneNumber(str_replace(' '''$entity->getPhoneNumber()));
  68.         $encoded $this->encoder->encodePassword($entity$entity->getPassword());
  69.         $entity->setPassword($encoded);
  70.         if (!$entity->getUniqId()) {
  71.             $entity->setUniqId(uniqid());
  72.         }
  73.         $this->userRegisterManager->initHashToken($entity);
  74.     }
  75.     public function postPersist(LifecycleEventArgs $args): void
  76.     {
  77.         /** @var User $entity */
  78.         $entity $args->getObject();
  79.         if (!$entity instanceof User) {
  80.             return;
  81.         }
  82.         $this->updateContactOrganization($entity);
  83.         $this->segment->trackNewUser($entity);
  84.         $request $this->requestStack->getCurrentRequest();
  85.         $token $this->security->getToken();
  86.         $user null;
  87.         if ($request instanceof Request) {
  88.             if ($token instanceof SwitchUserToken) {
  89.                 $user $token->getOriginalToken()->getUser();
  90.             } else {
  91.                 $user $this->security->getUser();
  92.             }
  93.         }
  94.         foreach ($entity->getOrganizations() as $organization) {
  95.             $activityLog ActivityLog::create(
  96.                 $user,
  97.                 ActivityLogMethodEnum::CREATE,
  98.                 'AJOUT USER ID: '.$entity->getId(),
  99.                 ActivityLogCategoryEnum::USER,
  100.                 [],
  101.                 $organization,
  102.                 null,
  103.                 $entity->getFullName()
  104.             );
  105.             $this->em->persist($activityLog);
  106.         }
  107.         try {
  108.             $this->em->flush();
  109.         } catch (\Exception $e) {
  110.             $this->captureSentryException($e);
  111.         }
  112.     }
  113.     public function preUpdate(PreUpdateEventArgs $args): void
  114.     {
  115.         $entity $args->getObject();
  116.         if (!$entity instanceof User) {
  117.             return;
  118.         }
  119.         foreach ($entity->getOrganizations() as $orga) {
  120.             $orga->addUser($entity);
  121.             $this->em->persist($orga);
  122.         }
  123.         $entityChanged $args->getEntityChangeSet();
  124.         if (($args->hasChangedField('email') && 'admin@digidom.pro' === $args->getOldValue('email')) || 'admin@digidom.pro' === $entity->getEmail()) {
  125.             throw new NotFoundHttpException("User can't be updated");
  126.         }
  127.         $traits $this->preUpdateSegmentTraits($args->getEntityChangeSet());
  128.         if ([] !== $traits) {
  129.             $traits['userId'] = $entity->getUniqId();
  130.             $this->segment->identify([
  131.                 'userId' => $entity->getUniqId(),
  132.                 'traits' => $traits,
  133.             ]);
  134.         }
  135.         if (array_key_exists('password'$entityChanged)) {
  136.             $encodePassword $this->encoder->encodePassword($entity$entity->getPassword());
  137.             $entity->setPassword($encodePassword);
  138.         }
  139.         $entity->setPhoneNumber(str_replace(' '''$entity->getPhoneNumber()));
  140.         if (!$args->hasChangedField('resetToken')) {
  141.             $entity->setResetToken(null);
  142.             $entity->setResetTokenExpirationDate(null);
  143.         } else {
  144.             $this->segment->trackPasswordRequest($entity);
  145.         }
  146.     }
  147.     public function postUpdate(LifecycleEventArgs $args): void
  148.     {
  149.         /** @var User $entity */
  150.         $entity $args->getObject();
  151.         if (!$entity instanceof User) {
  152.             return;
  153.         }
  154.         $this->em $args->getObjectManager();
  155.         $uow $this->em->getUnitOfWork();
  156.         $uow->computeChangeSets();
  157.         $changeset $uow->getEntityChangeSet($entity);
  158.         if (isset($changeset['email']) || isset($changeset['phoneNumber'])) {
  159.             $this->updateContactOrganization($entity);
  160.         }
  161.         $organizations $entity->getOrganizations();
  162.         foreach ($organizations as $organization) {
  163.             $this->segment->trackNewOrganization($organizationfalse);
  164.         }
  165.         if (isset($changeset['codeConfirmation'])) {
  166.             $this->segment->trackDoubleAuthentication($entity);
  167.         }
  168.         if (isset($changeset['firstname']) || isset($changeset['lastname'])) {
  169.             $oldFirstName $changeset['firstname'][0] ?? '';
  170.             $oldLastName $changeset['lastname'][0] ?? '';
  171.             $oldFullName = ('' !== $oldFirstName $oldFirstName $entity->getFirstname()).' '.('' !== $oldLastName $oldLastName $entity->getLastname());
  172.             $request $this->requestStack->getCurrentRequest();
  173.             $token $this->security->getToken();
  174.             $user null;
  175.             if ($request instanceof Request) {
  176.                 if ($token instanceof SwitchUserToken) {
  177.                     $user $token->getOriginalToken()->getUser();
  178.                 } else {
  179.                     $user $this->security->getUser();
  180.                 }
  181.             }
  182.             $activityLogChangeSet = [
  183.                 'USER' => [
  184.                     $oldFullName => $entity->getFullName(),
  185.                 ],
  186.             ];
  187.             foreach ($entity->getOrganizations() as $organization) {
  188.                 $activityLog ActivityLog::create(
  189.                     $user,
  190.                     ActivityLogMethodEnum::UPDATE,
  191.                     'MODIFICATION USER ID: '.$entity->getId(),
  192.                     ActivityLogCategoryEnum::USER,
  193.                     $activityLogChangeSet,
  194.                     $organization,
  195.                     null,
  196.                     null
  197.                 );
  198.                 $this->em->persist($activityLog);
  199.             }
  200.             try {
  201.                 $this->em->flush();
  202.             } catch (\Exception $e) {
  203.                 $this->captureSentryException($e);
  204.             }
  205.         }
  206.     }
  207.     private function updateContactOrganization(User $user): void
  208.     {
  209.         if ([] === $user->getOrganizations()) {
  210.             return;
  211.         }
  212.         foreach ($user->getOrganizations() as $organization) {
  213.             $organization->setTelephone($user->getPhoneNumber());
  214.             $organization->setEmail($user->getEmail());
  215.             $this->em->persist($organization);
  216.         }
  217.         $orga $user->getOrganizations()[0]->addUser($user);
  218.         $this->em->persist($orga);
  219.         $this->em->flush();
  220.     }
  221.     private function preUpdateSegmentTraits($changeSetList): array
  222.     {
  223.         $traits = [];
  224.         $mapping = [
  225.             'email' => 'email',
  226.             'phoneNumber' => 'phone',
  227.             'lastname' => 'lastname',
  228.             'firstname' => 'firstname',
  229.             'createdAt' => 'created_at',
  230.             'honorificPrefix' => 'gender',
  231.         ];
  232.         foreach ($changeSetList as $property => $changeSet) {
  233.             if (array_key_exists($property$mapping)) {
  234.                 $traits[$mapping[$property]] = $changeSet[1];
  235.             }
  236.         }
  237.         if ([] !== $traits) {
  238.             $traits['idType'] = 'user';
  239.         }
  240.         return $traits;
  241.     }
  242. }