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');