src/EventSubscriber/Release/ReleaseSubscriber.php line 37

  1. <?php
  2. namespace App\EventSubscriber\Release;
  3. use ApiPlatform\Api\IriConverterInterface;
  4. use App\Entity\Message\Message;
  5. use App\Entity\Release\Release;
  6. use App\Entity\Text\LongText;
  7. use App\Service\TaggedTypesService;
  8. use Doctrine\Common\EventSubscriber;
  9. use Doctrine\ORM\Event\LifecycleEventArgs;
  10. use Doctrine\ORM\Event\PostRemoveEventArgs;
  11. use Doctrine\ORM\Event\PreRemoveEventArgs;
  12. use Doctrine\ORM\Events;
  13. use Doctrine\ORM\UnitOfWork;
  14. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  15. use Symfony\Component\Mailer\MailerInterface;
  16. use Symfony\Component\Mime\Email;
  17. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  18. use Symfony\Component\Security\Core\Security;
  19. class ReleaseSubscriber implements EventSubscriber
  20. {
  21.     private TaggedTypesService $taggedTypesService;
  22.     private string $supportsClass;
  23.     private Security $security;
  24.     public function __construct(TaggedTypesService $taggedTypesService, Security $security, MailerInterface $mailer, ParameterBagInterface $params, UrlGeneratorInterface $router, IriConverterInterface $iriConverter)
  25.     {
  26.         $this->taggedTypesService = $taggedTypesService;
  27.         $this->siteFromEmail = $params->get('site_from_email');
  28.         $this->siteShortTitle = $params->get('site_short_title');
  29.         $this->siteUi = $params->get('site_ui');
  30.         $this->mailer = $mailer;
  31.         $this->router = $router;
  32.         $this->security = $security;
  33.         $this->iriConverter = $iriConverter;
  34.         $this->taggedTypesService = $taggedTypesService;
  35.         $this->supportsClass = Release::class;
  36.     }
  37.     public function getSubscribedEvents(): array
  38.     {
  39.         return [
  40.             Events::prePersist,
  41.             Events::postRemove
  42.         ];
  43.     }
  44.     public function prePersist(LifecycleEventArgs $args): void
  45.     {
  46.         $entity = $args->getEntity();
  47.         if (in_array(get_class($entity), $this->taggedTypesService->getCurrentOrChildEntitiesForEntity($this->supportsClass))) {
  48.             if ($this->security->getuser()) {
  49.                 $entity->setCreator($this->security->getUser());
  50.             }
  51.         }
  52.     }
  53.     public function postRemove(PostRemoveEventArgs $args): void
  54.     {
  55.         $entity = $args->getEntity();
  56.         if (in_array(get_class($entity), $this->taggedTypesService->getCurrentOrChildEntitiesForEntity($this->supportsClass))) {
  57.             $newMessage = new Message();
  58.             $newMessage->setCreator($entity->getCreator());
  59.             $newMessage->setRecipient($entity->getRecipient());
  60.             $newMessage->setPreventNotification(true);
  61.             $newText = new LongText();
  62.             $recipientUsername = $entity->getRecipient()->getUsername();
  63.             // this can happen when you remove a release from the primitive side, it's removed before its accessed here
  64.             $primitiveLabel = $entity->getPrimitive() ? $entity->getPrimitive()->getLabel() : $args->getEntityManager()->getUnitOfWork()->getEntityChangeSet($entity)['primitive'][0]->getLabel();
  65.             $messageText = "<p>Kia ora $recipientUsername,</p>"
  66.                 . "<p>You have lost access to $primitiveLabel, this is ether because your access has expired - or the owner has removed it.</p>"
  67.                 . "<p>If you believe this is in error, please contact the owner again to request access reinstatement.</p>";
  68.             $newText->setContent($messageText);
  69.             $newMessage->setValue($newText);
  70.             $args->getEntityManager()->persist($newMessage);
  71.             $args->getEntityManager()->flush();
  72.             if ($entity->getRecipient() && $entity->getRecipient()->getContact() && $entity->getRecipient()->getEmail()) {
  73.                 $email = (new Email())
  74.                     ->from($this->siteFromEmail)
  75.                     ->to($entity->getRecipient()->getEmail())
  76.                     ->subject('You have lost access to ' . $primitiveLabel)
  77.                     ->html($messageText);
  78.                 $this->mailer->send($email);
  79.             }
  80.         }
  81.     }
  82. }