src/User/DeleteUser.php line 121

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Harmonizely\User;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Harmonizely\Background\Data\DirectoryDeleteCompanyData;
  6. use Harmonizely\Core\BackgroundWork\Contract\IClient;
  7. use Harmonizely\Core\Validation\Contract\IDTOValidator;
  8. use Harmonizely\Integration\Simplypay\Contract\SimplypayGetIntegrationConfigInterface;
  9. use Harmonizely\Model\UserInterface;
  10. use Harmonizely\Repository\Company\Contract\ICalendarServiceRepository;
  11. use Harmonizely\Repository\Company\Contract\IEventRepository;
  12. use Harmonizely\Service\Core\Contract\ICompanySelector;
  13. use Harmonizely\Service\Simplypay\Contract\CommonApiClientInterface;
  14. use Harmonizely\Service\Simplypay\DTO\Common\Request\BlockMerchantRequestDTO;
  15. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
  16. final class DeleteUser
  17. {
  18.     private IDTOValidator $validator;
  19.     private EntityManagerInterface $entityManager;
  20.     private EventDispatcherInterface $eventDispatcher;
  21.     /**
  22.      * @var IClient
  23.      */
  24.     private IClient $backgroundClient;
  25.     /**
  26.      * @var ICalendarServiceRepository
  27.      */
  28.     private ICalendarServiceRepository $calendarServiceRepository;
  29.     /**
  30.      * @var CommonApiClientInterface
  31.      */
  32.     private CommonApiClientInterface $simplepayCommonApiClient;
  33.     /**
  34.      * @var SimplypayGetIntegrationConfigInterface
  35.      */
  36.     private SimplypayGetIntegrationConfigInterface $getIntegrationConfig;
  37.     /**
  38.      * @var ICompanySelector
  39.      */
  40.     private ICompanySelector $companySelector;
  41.     /**
  42.      * @var IEventRepository
  43.      */
  44.     private IEventRepository $eventRepository;
  45.     /**
  46.      * @param IDTOValidator $validator
  47.      * @param EntityManagerInterface $entityManager
  48.      * @param EventDispatcherInterface $eventDispatcher
  49.      * @param IClient $backgroundClient
  50.      * @param ICalendarServiceRepository $calendarServiceRepository
  51.      * @param CommonApiClientInterface $simplepayCommonApiClient
  52.      * @param SimplypayGetIntegrationConfigInterface $getIntegrationConfig
  53.      * @param ICompanySelector $companySelector
  54.      * @param IEventRepository $eventRepository
  55.      */
  56.     public function __construct(
  57.         IDTOValidator $validator,
  58.         EntityManagerInterface $entityManager,
  59.         EventDispatcherInterface $eventDispatcher,
  60.         IClient $backgroundClient,
  61.         ICalendarServiceRepository $calendarServiceRepository,
  62.         CommonApiClientInterface $simplepayCommonApiClient,
  63.         SimplypayGetIntegrationConfigInterface $getIntegrationConfig,
  64.         ICompanySelector $companySelector,
  65.         IEventRepository $eventRepository
  66.     )
  67.     {
  68.         $this->validator $validator;
  69.         $this->entityManager $entityManager;
  70.         $this->eventDispatcher $eventDispatcher;
  71.         $this->backgroundClient $backgroundClient;
  72.         $this->calendarServiceRepository $calendarServiceRepository;
  73.         $this->simplepayCommonApiClient $simplepayCommonApiClient;
  74.         $this->getIntegrationConfig $getIntegrationConfig;
  75.         $this->companySelector $companySelector;
  76.         $this->eventRepository $eventRepository;
  77.     }
  78.     public function __invoke(
  79.         UserInterface $user,
  80.         DeleteUserRequest $deleteUserRequest
  81.     ): void
  82.     {
  83.         $this->validator->validate($deleteUserRequest);
  84.         $userId $user->getId();
  85.         $userSimplypayConfig $this->getIntegrationConfig->perform($usertrue);
  86.         $organization $user->getDefaultOrganization();
  87.         $organizationSimplypayConfig null;
  88.         if ($organization && $organization->isOrganizationOwner($user) && count($organization->getEnabledOwners()) === 1) {
  89.             $organizationSimplypayConfig $this->getIntegrationConfig->perform($userfalsetrue);
  90.         }
  91.         if ($deleteUserRequest->isDelete()) {
  92.             $user->clearOrganizationTag();
  93.             $user->clearUserCategories();
  94.             $this->eventRepository->deleteByUser($user);
  95.             $this->calendarServiceRepository->deleteByUser($user);
  96.             $this->entityManager->remove($user);
  97.         } else {
  98.             $user->setEnabled(false);
  99.         }
  100.         $this->entityManager->flush();
  101.         if ($userSimplypayConfig) {
  102.             $this->simplepayCommonApiClient->blockMerchant(new BlockMerchantRequestDTO(
  103.                 $userSimplypayConfig->getMerchant()
  104.             ));
  105.         }
  106.         if ($organizationSimplypayConfig) {
  107.             $this->simplepayCommonApiClient->blockMerchant(new BlockMerchantRequestDTO(
  108.                 $organizationSimplypayConfig->getMerchant()
  109.             ));
  110.         }
  111.         $this->backgroundClient->add(new DirectoryDeleteCompanyData($user->getDirectoryCompanyLogin(), $this->companySelector->getCompany()));
  112.         $this->backgroundClient->runJobs();
  113.         $userDeletedEvent = new UserDeletedEvent($user$userId$deleteUserRequest->getReason(), $deleteUserRequest->isDelete());
  114.         $this->eventDispatcher->dispatch($userDeletedEventUserDeletedEvent::NAME);
  115.     }
  116.     public function perform(
  117.         UserInterface $user,
  118.         DeleteUserRequest $deleteUserRequest
  119.     ): void
  120.     {
  121.         $this($user$deleteUserRequest);
  122.     }
  123. }