src/EventSubscriber/Profile/ProfileSubscriber.php line 312

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\Profile;
  3. use App\Entity\Logs\EventLog;
  4. use App\Entity\Logs\ProfileHierarchyHistoryLog;
  5. use App\Entity\Package\PackageSongWriter;
  6. use App\Entity\Package\PackageTransaction;
  7. use App\Entity\Profile\Invitation;
  8. use App\Entity\Profile\PlatformIpiNumber;
  9. use App\Entity\Profile\Profile;
  10. use App\Entity\Profile\ProfileAccessLog;
  11. use App\Entity\Profile\ProfileRBAC;
  12. use App\Entity\Profile\ProfileSocialMedia;
  13. use App\Entity\Profile\Splits\DeliverySplits;
  14. use App\Entity\User\User;
  15. use App\Entity\User\UserProfile;
  16. use App\Enums\Constants;
  17. use App\Event\LogEvent;
  18. use App\Event\Profile\ProfileCreatedEvent;
  19. use App\Event\Profile\ProfileCreatedForUserEvent;
  20. use App\Event\Profile\ProfileDeletedEvent;
  21. use App\Event\Profile\ProfileEraisedEvent;
  22. use App\Event\Profile\ProfileRoyaltyTemplateEditEvent;
  23. use App\Event\Profile\UserInvitedToProfileEvent;
  24. use App\Repository\Logs\ProfileHierarchyHistoryLogRepository;
  25. use App\Repository\Package\InvoiceRepository;
  26. use App\Repository\Package\PackageSongwriterRepository;
  27. use App\Repository\Package\PackageTransactionRepository;
  28. use App\Repository\Profile\InvitationRepository;
  29. use App\Repository\Profile\PlatformIpiNumberRepository;
  30. use App\Repository\Profile\ProfileAccessLogRepository;
  31. use App\Repository\Profile\ProfileInformationRepository;
  32. use App\Repository\Profile\ProfileRBACRepository;
  33. use App\Repository\Profile\ProfileRepository;
  34. use App\Repository\Profile\ProfileSocialMediaRepository;
  35. use App\Repository\Profile\Splits\DeliverySplitsRepository;
  36. use App\Repository\Publishing\PlatformRepository;
  37. use App\Repository\User\RoleRepository;
  38. use App\Repository\User\UserProfileRepository;
  39. use App\Repository\User\UserRepository;
  40. use App\Service\AuthenticationService;
  41. use App\Service\Mailer\ProfileMailer;
  42. use App\Service\ProfileService;
  43. use Ramsey\Uuid\Uuid;
  44. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  45. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  46. use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
  47. class ProfileSubscriber implements EventSubscriberInterface
  48. {
  49.     /**
  50.      * @var RoleRepository
  51.      */
  52.     private $roleRepository;
  53.     /**
  54.      * @var ProfileSocialMediaRepository
  55.      */
  56.     private $profileSocialMediaRepository;
  57.     /**
  58.      * @var ProfileHierarchyHistoryLogRepository
  59.      */
  60.     private $profileHierarchyHistoryLogRepository;
  61.     /**
  62.      * @var UserRepository
  63.      */
  64.     private $userRepository;
  65.     /**
  66.      * @var ProfileMailer
  67.      */
  68.     private $profileMailer;
  69.     /**
  70.      * @var InvitationRepository
  71.      */
  72.     private $invitationRepository;
  73.     /**
  74.      * @var PlatformRepository
  75.      */
  76.     private $platformRepository;
  77.     /**
  78.      * @var PlatformIpiNumberRepository
  79.      */
  80.     private $platformIpiNumberRepository;
  81.     /**
  82.      * @var DeliverySplitsRepository
  83.      */
  84.     private $deliverySplitsRepository;
  85.     /**
  86.      * @var ProfileService
  87.      */
  88.     private $profileService;
  89.     /**
  90.      * @var ProfileRepository
  91.      */
  92.     private $profileRepository;
  93.     /** @var ProfileInformationRepository */
  94.     private $profileInformationRepository;
  95.     /** @var ProfileRBACRepository */
  96.     private $profileRBACRepository;
  97.     /** @var UserProfileRepository */
  98.     private $userProfileRepository;
  99.     /** @var ProfileAccessLogRepository */
  100.     private $profileAccessLogRepository;
  101.     /** @var PackageTransactionRepository */
  102.     private $packageTransactionRepository;
  103.     /** @var PackageSongwriterRepository */
  104.     private $packageSongwriterRepository;
  105.     /** @var InvoiceRepository */
  106.     private $invoiceRepository;
  107.     /**
  108.      * @var EventDispatcherInterface
  109.      */
  110.     private $eventDispatcher;
  111.     /**
  112.      * @var AuthenticationService
  113.      */
  114.     private $authenticationService;
  115.     public function __construct(
  116.         ProfileSocialMediaRepository $profileSocialMediaRepository,
  117.         ProfileHierarchyHistoryLogRepository $profileHierarchyHistoryLogRepository,
  118.         UserRepository $userRepository,
  119.         ProfileMailer $profileMailer,
  120.         InvitationRepository $invitationRepository,
  121.         RoleRepository $roleRepository,
  122.         PlatformRepository $platformRepository,
  123.         PlatformIpiNumberRepository $platformIpiNumberRepository,
  124.         DeliverySplitsRepository $deliverySplitsRepository,
  125.         ProfileService $profileService,
  126.         ProfileRepository $profileRepository,
  127.         ProfileInformationRepository $profileInformationRepository,
  128.         ProfileRBACRepository $profileRBACRepository,
  129.         UserProfileRepository $userProfileRepository,
  130.         ProfileAccessLogRepository $profileAccessLogRepository,
  131.         PackageTransactionRepository $packageTransactionRepository,
  132.         PackageSongwriterRepository $packageSongwriterRepository,
  133.         InvoiceRepository $invoiceRepository,
  134.         EventDispatcherInterface $eventDispatcher,
  135.         AuthenticationService $authenticationService
  136.     )
  137.     {
  138.         $this->profileSocialMediaRepository $profileSocialMediaRepository;
  139.         $this->profileHierarchyHistoryLogRepository $profileHierarchyHistoryLogRepository;
  140.         $this->userRepository $userRepository;
  141.         $this->profileMailer $profileMailer;
  142.         $this->invitationRepository $invitationRepository;
  143.         $this->roleRepository $roleRepository;
  144.         $this->platformRepository $platformRepository;
  145.         $this->platformIpiNumberRepository $platformIpiNumberRepository;
  146.         $this->deliverySplitsRepository $deliverySplitsRepository;
  147.         $this->profileService $profileService;
  148.         $this->profileRepository $profileRepository;
  149.         $this->profileInformationRepository $profileInformationRepository;
  150.         $this->profileRBACRepository $profileRBACRepository;
  151.         $this->userProfileRepository $userProfileRepository;
  152.         $this->profileAccessLogRepository $profileAccessLogRepository;
  153.         $this->packageTransactionRepository $packageTransactionRepository;
  154.         $this->packageSongwriterRepository $packageSongwriterRepository;
  155.         $this->invoiceRepository $invoiceRepository;
  156.         $this->eventDispatcher $eventDispatcher;
  157.         $this->authenticationService $authenticationService;
  158.     }
  159.     /**
  160.      * @inheritDoc
  161.      */
  162.     public static function getSubscribedEvents(): array
  163.     {
  164.         return [
  165.             ProfileCreatedEvent::class              => 'onProfileCreatedEvent',
  166.             ProfileCreatedForUserEvent::class       => 'onProfileCreatedForUserEvent',
  167.             ProfileDeletedEvent::class              => 'onProfileDeletedEvent',
  168.             UserInvitedToProfileEvent::class        => 'onUserInvitedToProfileEvent',
  169.             ProfileEraisedEvent::class              => 'onProfileEraisedEvent',
  170.             ProfileRoyaltyTemplateEditEvent::class  => 'onProfileRoyaltyTemplateEditEvent',
  171.         ];
  172.     }
  173.     /**
  174.      * @param ProfileCreatedEvent $event
  175.      * @throws TransportExceptionInterface
  176.      */
  177.     public function onProfileCreatedEvent(ProfileCreatedEvent $event): void
  178.     {
  179.         // Generate and send profile invitation
  180.         /** @var Profile $parent */
  181.         $parent $event->getProfile()->getParent();
  182.         /** @var Profile $profile */
  183.         $profile $event->getProfile();
  184.         /** @var User $owner */
  185.         $owner $this->getOrCreateUser($profile);
  186.         // Generate Works Prefix
  187.         $confirmationToken Uuid::uuid4()->toString();
  188.         $prefix $this->profileService->generateWorksPrefix($event->getProfile());
  189.         $profile->setWorksPrefix($prefix);
  190.         $profile->setConfirmationToken($confirmationToken);
  191.         $this->profileRepository->save($profile);
  192.         // Generate Platform IPI Numbers
  193.         /**if (
  194.             $event->getProfile()->getProfileType()->getName() === Constants::PROFILE_TYPE_PUBLISHER_ADMINISTRATOR ||
  195.             $event->getProfile()->getProfileType()->getName() === Constants::PROFILE_TYPE_PUBLISHER
  196.         ) {
  197.             $platforms = $this->platformRepository->findAll();
  198.             foreach ($platforms as $platform) {
  199.                 $platformIpiNumber = (new PlatformIpiNumber())
  200.                     ->setProfile($event->getProfile())
  201.                     ->setPlatform($platform);
  202.                 $this->platformIpiNumberRepository->save($platformIpiNumber);
  203.             }
  204.         }**/
  205.         // Generate profile social media
  206.         $profileSocialMedia = (new ProfileSocialMedia())
  207.             ->setProfile($event->getProfile());
  208.         $this->profileSocialMediaRepository->save($profileSocialMedia);
  209.         // Generate profile hierarchy history log
  210.         $profileHierarchyHistoryLog = (new ProfileHierarchyHistoryLog())
  211.             ->setProfile($event->getProfile())
  212.             ->setParent($event->getProfile()->getParent());
  213.         $this->profileHierarchyHistoryLogRepository->save($profileHierarchyHistoryLog);
  214.         // Generate delivery splits for profile
  215.         $deliverySplits = (new DeliverySplits())
  216.             ->setProfile($event->getProfile());
  217.         $this->profileService->processToCreateRoyaltySplits($profile);
  218.         $this->deliverySplitsRepository->save($deliverySplits);
  219.         // Set Minimum Payment of the profile
  220.         $this->profileService->processToSetMinimumPayment($profile);
  221.         if($parent->getProfileType()->getName() === Constants::PROFILE_TYPE_PUBLISHER){
  222.             $profileRBAC = (new ProfileRBAC())
  223.                 ->setProfile($event->getProfile())
  224.                 ->setRole($this->roleRepository->findOneBy(['name' => Constants::PROFILE_ROLE_NAME_OWNER]))
  225.                 ->setUser($parent->getOwner());
  226.             $this->profileRBACRepository->save($profileRBAC);
  227.             $invitation = (new Invitation())
  228.                 ->setProfile($event->getProfile())
  229.                 ->setEmail($event->getProfile()->getProfileInformation()->getEmail())
  230.                 ->setLastName("user")
  231.                 ->setFirstName("user")
  232.                 ->setRole($this->roleRepository->findOneByName(Constants::PROFILE_ROLE_NAME_ADMIN))
  233.                 ->setToken($confirmationToken)
  234.                 ->setUser($owner);
  235.             $this->invitationRepository->save($invitation);
  236.         }else{
  237.             $invitation = (new Invitation())
  238.                 ->setProfile($event->getProfile())
  239.                 ->setEmail($event->getProfile()->getProfileInformation()->getEmail())
  240.                 ->setLastName("user")
  241.                 ->setFirstName("user")
  242.                 ->setRole($this->roleRepository->findOneByName(Constants::PROFILE_ROLE_NAME_OWNER))
  243.                 ->setToken($confirmationToken)
  244.                 ->setUser($owner);
  245.             $this->invitationRepository->save($invitation);
  246.         }
  247.         if($event->getFrom() === Constants::MMPZ_REFERER){
  248.             $this->profileMailer->sendProfileCreatedEmail($invitation);
  249.         }
  250.         if($parent->getProfileType()->getName() === Constants::PROFILE_TYPE_PUBLISHER){
  251.             $this->profileService->updateProfilePackageSongwriterAfterCreateSubProfile($parent);
  252.         }
  253.     }
  254.     /**
  255.      * @param ProfileCreatedForUserEvent $event
  256.      * @throws TransportExceptionInterface
  257.      */
  258.     public function onProfileCreatedForUserEvent(ProfileCreatedForUserEvent $event): void
  259.     {
  260.         $this->profileMailer->sendProfileNotificationEmail($event->getUser(), $event->getMessage());
  261.     }
  262.     /**
  263.      * @param ProfileCreatedForUserEvent $event
  264.      * @throws TransportExceptionInterface
  265.      */
  266.     public function onProfileDeletedEvent(ProfileDeletedEvent $event): void
  267.     {
  268.         $this->profileMailer->sendProfileNotificationEmail($event->getUser(), $event->getMessage());
  269.     }
  270.     /**
  271.      * @param ProfileEraisedEvent $event
  272.      * @throws TransportExceptionInterface
  273.      */
  274.     public function onProfileEraisedEvent(ProfileEraisedEvent $event): void
  275.     {
  276.         /** @var Profile $profile */
  277.         $profile $event->getProfile();
  278.         $this->eventDispatcher->dispatch(new LogEvent(
  279.             $profile,
  280.             $this->authenticationService->getUser(),
  281.             EventLog::TYPE_PROFILE_ERASED
  282.         ));
  283.         if(!is_null($profile->getProfileInformation())){
  284.             $this->profileInformationRepository->remove($profile->getProfileInformation());
  285.             $this->profileInformationRepository->flush();
  286.         }
  287.         $invitations $this->invitationRepository->findBy(['profile' => $profile]);
  288.         if(count($invitations)){
  289.             foreach ($invitations as $invitation){
  290.                 $this->invitationRepository->remove($invitation);
  291.             }
  292.             $this->invitationRepository->flush();
  293.         }
  294.         if($profile->getPlatformIpiNumbers()->count() > 0){
  295.             /** @var PlatformIpiNumber $platformIpiNumber */
  296.             foreach ($profile->getPlatformIpiNumbers() as $platformIpiNumber){
  297.                 $this->platformIpiNumberRepository->remove($platformIpiNumber);
  298.             }
  299.             $this->platformIpiNumberRepository->flush();
  300.         }
  301.         /** @var ProfileRBAC $profileRBAC */
  302.         foreach($profile->getProfileRBAC() as $profileRBAC){
  303.             $user $profileRBAC->getUser();
  304.             $this->profileRBACRepository->remove($profileRBAC);;
  305.             $this->profileRBACRepository->flush();
  306.             if($event->getFlag() === 'user'){
  307.                 $this->eventDispatcher->dispatch(new LogEvent(
  308.                     $user,
  309.                     $this->authenticationService->getUser(),
  310.                     EventLog::TYPE_USER_ERASED
  311.                 ));
  312.                 $this->eventDispatcher->dispatch(new LogEvent(
  313.                     $profile,
  314.                     $this->authenticationService->getUser(),
  315.                     EventLog::TYPE_PROFILE_AND_USERS_ERASED
  316.                 ));
  317.                 $this->userProfileRepository->remove($user->getUserProfile());
  318.                 $this->userProfileRepository->flush();
  319.                 $this->userRepository->remove($user);
  320.                 $this->userRepository->flush();
  321.             }
  322.         }
  323.         if($event->getFlag() === 'user'){
  324.             //this is when the user and the profile don't have an established relation
  325.             $this->deleteUserWithoutAssociationforProfile($profile);
  326.         }
  327.         /** @var ProfileAccessLog $profileAccessLog */
  328.         foreach ($this->profileAccessLogRepository->findBy(['profile' => $profile]) as $profileAccessLog){
  329.             $this->profileAccessLogRepository->remove($profileAccessLog);
  330.             $this->profileAccessLogRepository->flush();
  331.         }
  332.         if($profile->getPackageSongWriters()->count() > 0){
  333.             /** @var PackageSongWriter $packageSongWriter */
  334.             foreach ($profile->getPackageSongWriters() as $packageSongWriter){
  335.                 foreach ($packageSongWriter->getInvoices() as $invoice){
  336.                     $this->invoiceRepository->remove($invoice);
  337.                     $this->invoiceRepository->flush();
  338.                 }
  339.                 $this->packageSongwriterRepository->remove($packageSongWriter);
  340.                 $this->packageSongwriterRepository->flush();
  341.             }
  342.         }
  343.         $this->profileMailer->sendProfileNotificationEmail($event->getUser(), $event->getMessage());
  344.     }
  345.     /**
  346.      * @param UserInvitedToProfileEvent $event
  347.      * @throws TransportExceptionInterface
  348.      */
  349.     public function onUserInvitedToProfileEvent(UserInvitedToProfileEvent $event): void
  350.     {
  351.         $invitation $event->getInvitation();
  352.         $this->profileMailer->sendUserInvitedToProfileMail($invitation);
  353.     }
  354.     /**
  355.      * @param ProfileRoyaltyTemplateEditEvent $event
  356.      * @return void
  357.      */
  358.     public function onProfileRoyaltyTemplateEditEvent(ProfileRoyaltyTemplateEditEvent $event)
  359.     {
  360.         $this->profileService->processToEditARoyaltyTemplate($event->getRoyaltySplitsTemplate());
  361.     }
  362.     /**   PRIVATE FUNCTIONS */
  363.     /**
  364.      * This function is used in the creation Profile process to get the owner user for the new profile or to create once
  365.      *
  366.      * @param Profile $profile
  367.      *
  368.      * @return User
  369.      */
  370.     private function getOrCreateUser($profile)
  371.     {
  372.         /** @var User $user */
  373.         $user $this->userRepository->findOneBy(['email' => $profile->getProfileInformation()->getEmail()]);
  374.         /*if(is_null($user)){
  375.             $user  = (new User())
  376.                 ->setEmail($profile->getProfileInformation()->getEmail())
  377.                 ->setEnabled(true);
  378.             $this->userRepository->save($user);
  379.             $userProfile = (new UserProfile())
  380.                 ->setUser($user)
  381.                 ->setFirstName($profile->getProfileInformation()->getFirstName())
  382.                 ->setLastName($profile->getProfileInformation()->getLastName());
  383.             $this->userProfileRepository->save($userProfile);
  384.             $user = $this->userRepository->findOneBy(['email' => $profile->getProfileInformation()->getEmail()]);
  385.         }*/
  386.         return $user;
  387.     }
  388.     /**
  389.      * this function is used in de erased profile process to delete a profile created with this user without association
  390.      *
  391.      * @param Profile $profile
  392.      * @return bool
  393.      */
  394.     private function deleteUserWithoutAssociationforProfile(Profile $profile): bool
  395.     {
  396.         /** @var User $user */
  397.         $user $this->userRepository->findOneBy(['email' => $profile->getProfileInformation()->getEmail()]);
  398.         if(is_null($user)){
  399.             return false;
  400.         }else{
  401.             $profiles $this->profileService->findMainProfilesForUser($user);
  402.             if(count($profiles) > 0){
  403.                 return false;
  404.             }else{
  405.                 $this->eventDispatcher->dispatch(new LogEvent(
  406.                     $user,
  407.                     $this->authenticationService->getUser(),
  408.                     EventLog::TYPE_USER_ERASED
  409.                 ));
  410.                 $this->eventDispatcher->dispatch(new LogEvent(
  411.                     $profile,
  412.                     $this->authenticationService->getUser(),
  413.                     EventLog::TYPE_PROFILE_AND_USERS_ERASED
  414.                 ));
  415.                 $this->userProfileRepository->remove($user->getUserProfile());
  416.                 $this->userProfileRepository->flush();
  417.                 $this->userRepository->remove($user);
  418.                 $this->userRepository->flush();
  419.                 return true;
  420.             }
  421.         }
  422.     }
  423. }