src/EventSubscriber/ProjectClosureSubscriber.php line 46

Open in your IDE?
  1. <?php
  2. namespace MedBrief\MSR\EventSubscriber;
  3. use ApiPlatform\Core\EventListener\EventPriorities;
  4. use MedBrief\MSR\Entity\Project;
  5. use MedBrief\MSR\Entity\ProjectClosure;
  6. use MedBrief\MSR\Service\Notification\UserNotificationService;
  7. use MedBrief\MSR\Service\ProjectClosure\AutoCancelServiceables;
  8. use Override;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpKernel\Event\ViewEvent;
  12. use Symfony\Component\HttpKernel\KernelEvents;
  13. /**
  14. * This code was inspired by the API platform examples.
  15. *
  16. * @see https://api-platform.com/docs/v2.1/core/events/
  17. *
  18. * We opted for using Symfony event subscribers, rather than doctrine event subscribers, as
  19. * they were causing weird issues when trying to invite an existing user to a matter.
  20. */
  21. final readonly class ProjectClosureSubscriber implements EventSubscriberInterface
  22. {
  23. public function __construct(private UserNotificationService $notificationService, private AutoCancelServiceables $autoCancelServiceables)
  24. {
  25. }
  26. /**
  27. * @inheritDoc
  28. */
  29. #[Override]
  30. public static function getSubscribedEvents()
  31. {
  32. return [
  33. // This event fires based on API platforms custom response generator, which hooks into the VIEW kernel event,
  34. // and we want to fire the email after the write operation has happened.
  35. KernelEvents::VIEW => [
  36. ['sendMatterClosureSubmissionNotification', EventPriorities::POST_WRITE],
  37. ['autoCancelServiceables', EventPriorities::POST_WRITE],
  38. ],
  39. ];
  40. }
  41. public function sendMatterClosureSubmissionNotification(ViewEvent $event): void
  42. {
  43. $projectClosure = $event->getControllerResult();
  44. $method = $event->getRequest()->getMethod();
  45. if (!$projectClosure instanceof ProjectClosure || $method !== Request::METHOD_POST || $projectClosure->getProject() === null) {
  46. return;
  47. }
  48. $this->notificationService->generateMatterClosureSubmissionUserNotification($projectClosure);
  49. }
  50. public function autoCancelServiceables(ViewEvent $event): void
  51. {
  52. $projectClosure = $event->getControllerResult();
  53. $method = $event->getRequest()->getMethod();
  54. if (!$projectClosure instanceof ProjectClosure || $method !== Request::METHOD_POST || $projectClosure->getProject() === null) {
  55. return;
  56. }
  57. // Important to note that the event must be in the exact state above before we can set the $project
  58. $project = $projectClosure->getProject();
  59. // Set all serviceables on the project that can be auto-cancelled to cancelled.
  60. $this->autoCancelServiceables->setAutoCancelledByProject($project);
  61. }
  62. }