vendor/ibexa/workflow/src/lib/Event/Subscriber/StageChangeSubscriber.php line 72

Open in your IDE?
  1. <?php
  2. /**
  3. * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4. * @license For full copyright and license information view LICENSE file distributed with this source code.
  5. */
  6. declare(strict_types=1);
  7. namespace Ibexa\Workflow\Event\Subscriber;
  8. use Ibexa\Contracts\Core\Repository\NotificationService;
  9. use Ibexa\Contracts\Core\Repository\PermissionResolver;
  10. use Ibexa\Contracts\Core\Repository\Repository;
  11. use Ibexa\Contracts\Core\Repository\UserService;
  12. use Ibexa\Contracts\Core\Repository\Values\Notification\CreateStruct;
  13. use Ibexa\Contracts\Workflow\Event\StageChangeEvent;
  14. use Ibexa\Contracts\Workflow\Event\WorkflowEvents;
  15. use Ibexa\Workflow\Registry\WorkflowDefinitionMetadataRegistry;
  16. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  17. class StageChangeSubscriber implements EventSubscriberInterface
  18. {
  19. /** @var \Ibexa\Contracts\Core\Repository\PermissionResolver */
  20. private $permissionResolver;
  21. /** @var \Ibexa\Workflow\Registry\WorkflowDefinitionMetadataRegistry */
  22. private $workflowMetadataRegistry;
  23. /** @var \Ibexa\Contracts\Core\Repository\UserService */
  24. private $userService;
  25. /** @var \Ibexa\Contracts\Core\Repository\Repository */
  26. private $repository;
  27. /** @var \Ibexa\Contracts\Core\Repository\NotificationService */
  28. private $notificationService;
  29. /**
  30. * @param \Ibexa\Contracts\Core\Repository\NotificationService $notificationService
  31. * @param \Ibexa\Contracts\Core\Repository\PermissionResolver $permissionResolver
  32. * @param \Ibexa\Contracts\Core\Repository\Repository $repository
  33. * @param \Ibexa\Contracts\Core\Repository\UserService $userService
  34. * @param \Ibexa\Workflow\Registry\WorkflowDefinitionMetadataRegistry $workflowMetadataRegistry
  35. */
  36. public function __construct(
  37. NotificationService $notificationService,
  38. PermissionResolver $permissionResolver,
  39. Repository $repository,
  40. UserService $userService,
  41. WorkflowDefinitionMetadataRegistry $workflowMetadataRegistry
  42. ) {
  43. $this->permissionResolver = $permissionResolver;
  44. $this->workflowMetadataRegistry = $workflowMetadataRegistry;
  45. $this->userService = $userService;
  46. $this->notificationService = $notificationService;
  47. $this->repository = $repository;
  48. }
  49. public static function getSubscribedEvents(): array
  50. {
  51. return [
  52. WorkflowEvents::WORKFLOW_STAGE_CHANGE => ['onStageChange', 0],
  53. ];
  54. }
  55. /**
  56. * @param \Ibexa\Contracts\Workflow\Event\StageChangeEvent $event
  57. *
  58. * @throws \Ibexa\Workflow\Exception\NotFoundException
  59. * @throws \Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException
  60. */
  61. public function onStageChange(StageChangeEvent $event): void
  62. {
  63. $workflowName = $event->getWorkflowMetadata()->name;
  64. if (!$this->workflowMetadataRegistry->hasWorkflowMetadata($workflowName)) {
  65. return;
  66. }
  67. $workflowDefinitionMetadata = $this->workflowMetadataRegistry->getWorkflowMetadata($workflowName);
  68. $transitionMetadata = $workflowDefinitionMetadata->getTransitionMetadata($event->getTransitionMetadata()->name);
  69. $notificationMetadata = $transitionMetadata->getNotificationMetadata();
  70. $users = [];
  71. $this->permissionResolver->sudo(function () use (&$users, $notificationMetadata) {
  72. foreach ($notificationMetadata->getUserGroups() as $userGroupId) {
  73. $groupUsers = $this->userService->loadUsersOfUserGroup($this->userService->loadUserGroup($userGroupId));
  74. foreach ($groupUsers as $groupUser) {
  75. $users[$groupUser->id] = $users[$groupUser->id] ?? $groupUser;
  76. }
  77. }
  78. foreach ($notificationMetadata->getUsers() as $userId) {
  79. $users[$userId] = $users[$userId] ?? $this->userService->loadUser($userId);
  80. }
  81. }, $this->repository);
  82. foreach ($users as $user) {
  83. $this->notificationService->createNotification(
  84. new CreateStruct([
  85. 'ownerId' => $user->id,
  86. 'type' => 'Workflow:StageChange',
  87. 'data' => [
  88. 'content_id' => $event->getWorkflowMetadata()->versionInfo->contentInfo->id,
  89. 'version_number' => $event->getWorkflowMetadata()->versionInfo->versionNo,
  90. 'language' => $event->getWorkflowMetadata()->versionInfo->initialLanguageCode,
  91. 'title' => $event->getWorkflowMetadata()->versionInfo->getName(),
  92. 'message' => $event->getTransitionMetadata()->message,
  93. 'sender_id' => $event->getTransitionMetadata()->userId,
  94. ],
  95. ])
  96. );
  97. }
  98. }
  99. }
  100. class_alias(StageChangeSubscriber::class, 'EzSystems\EzPlatformWorkflow\Event\Subscriber\StageChangeSubscriber');