vendor/ibexa/activity-log/src/bundle/EventSubscriber/PageBuilder/ActivityLogEventListener.php line 84

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\Bundle\ActivityLog\EventSubscriber\PageBuilder;
  8. use Ibexa\Contracts\ActivityLog\ActivityLogServiceInterface;
  9. use Ibexa\Contracts\ActivityLog\Values\ActivityLog\Criterion\LogicalOr;
  10. use Ibexa\Contracts\ActivityLog\Values\ActivityLog\Criterion\ObjectCriterion;
  11. use Ibexa\Contracts\ActivityLog\Values\ActivityLog\Criterion\UserCriterion;
  12. use Ibexa\Contracts\ActivityLog\Values\ActivityLog\ObjectClassInterface;
  13. use Ibexa\Contracts\ActivityLog\Values\ActivityLog\Query;
  14. use Ibexa\Contracts\ActivityLog\Values\ActivityLog\SortClause\LoggedAtSortClause;
  15. use Ibexa\Contracts\ActivityLog\Values\ActivityLog\SortClause\SortClauseInterface;
  16. use Ibexa\Contracts\Core\Repository\Values\User\User;
  17. use Ibexa\FieldTypePage\Event\PageEvents;
  18. use Ibexa\FieldTypePage\Event\PageFromPersistenceEvent;
  19. use Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\BlockRenderEvents;
  20. use Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\Event\PreRenderEvent;
  21. use Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\Twig\TwigRenderRequest;
  22. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  23. /**
  24.  * @phpstan-type TParameters array{
  25.  *     limit?: int,
  26.  *     user?: \Ibexa\Contracts\Core\Repository\Values\User\User|\Ibexa\Contracts\Core\Repository\Values\User\User[],
  27.  *     object_class?: \Ibexa\Contracts\ActivityLog\Values\ActivityLog\ObjectClassInterface<object>|\Ibexa\Contracts\ActivityLog\Values\ActivityLog\ObjectClassInterface<object>[]
  28.  * }
  29.  */
  30. final class ActivityLogEventListener implements EventSubscriberInterface
  31. {
  32.     public const IBEXA_ACTIVITY_LOG_BLOCK 'ibexa_activity_log_list';
  33.     public const IBEXA_ACTIVITY_LOG_ATTRIBUTE_LIMIT 'limit';
  34.     public const IBEXA_ACTIVITY_LOG_ATTRIBUTE_USER 'user';
  35.     public const IBEXA_ACTIVITY_LOG_ATTRIBUTE_OBJECT_CLASS 'object_class';
  36.     private ActivityLogServiceInterface $activityLogService;
  37.     public function __construct(
  38.         ActivityLogServiceInterface $activityLogService
  39.     ) {
  40.         $this->activityLogService $activityLogService;
  41.     }
  42.     public static function getSubscribedEvents(): array
  43.     {
  44.         return [
  45.             BlockRenderEvents::getBlockPreRenderEventName(self::IBEXA_ACTIVITY_LOG_BLOCK) => ['preRenderEvent', -10],
  46.             PageEvents::PERSISTENCE_FROM => ['onFromPersistence', -10],
  47.         ];
  48.     }
  49.     public function preRenderEvent(PreRenderEvent $event): void
  50.     {
  51.         $renderRequest $event->getRenderRequest();
  52.         if (!$renderRequest instanceof TwigRenderRequest) {
  53.             return;
  54.         }
  55.         $query = new Query();
  56.         $query->sortClauses = [new LoggedAtSortClause(SortClauseInterface::DESC)];
  57.         /** @phpstan-var TParameters $parameters */
  58.         $parameters $renderRequest->getParameters();
  59.         $this->handleUserFilter($parameters$query);
  60.         $this->handleObjectClassFilter($parameters$query);
  61.         if (isset($parameters[self::IBEXA_ACTIVITY_LOG_ATTRIBUTE_LIMIT])) {
  62.             $query->limit $parameters[self::IBEXA_ACTIVITY_LOG_ATTRIBUTE_LIMIT];
  63.         }
  64.         $list $this->activityLogService->findGroups($query);
  65.         $renderRequest->addParameter('activity_logs_groups'$list);
  66.     }
  67.     public function onFromPersistence(PageFromPersistenceEvent $event): void
  68.     {
  69.         $pageValue $event->getValue();
  70.         $page $pageValue->getPage();
  71.         if (null === $page) {
  72.             return;
  73.         }
  74.         foreach ($page->getZones() as $zone) {
  75.             foreach ($zone->getBlocks() as $blockValue) {
  76.                 if (self::IBEXA_ACTIVITY_LOG_BLOCK !== $blockValue->getType()) {
  77.                     continue;
  78.                 }
  79.                 $limitAttribute $blockValue->getAttribute(self::IBEXA_ACTIVITY_LOG_ATTRIBUTE_LIMIT);
  80.                 if (null === $limitAttribute) {
  81.                     continue;
  82.                 }
  83.                 $limitAttribute->setValue((int) $limitAttribute->getValue());
  84.             }
  85.         }
  86.     }
  87.     /**
  88.      * @phpstan-param TParameters $parameters
  89.      */
  90.     private function handleUserFilter(array $parametersQuery $query): void
  91.     {
  92.         if (!isset($parameters[self::IBEXA_ACTIVITY_LOG_ATTRIBUTE_USER])) {
  93.             return;
  94.         }
  95.         $users $parameters[self::IBEXA_ACTIVITY_LOG_ATTRIBUTE_USER];
  96.         if (!is_array($users)) {
  97.             $users = [$users];
  98.         }
  99.         if (count($users) === 0) {
  100.             return;
  101.         }
  102.         $ids array_map(static fn (User $user): int => $user->getUserId(), $users);
  103.         $query->criteria[] = new UserCriterion($ids);
  104.     }
  105.     /**
  106.      * @phpstan-param TParameters $parameters
  107.      */
  108.     private function handleObjectClassFilter(array $parametersQuery $query): void
  109.     {
  110.         if (!isset($parameters[self::IBEXA_ACTIVITY_LOG_ATTRIBUTE_OBJECT_CLASS])) {
  111.             return;
  112.         }
  113.         $objectClasses $parameters[self::IBEXA_ACTIVITY_LOG_ATTRIBUTE_OBJECT_CLASS];
  114.         if (!is_array($objectClasses)) {
  115.             $objectClasses = [$objectClasses];
  116.         }
  117.         if (count($objectClasses) === 0) {
  118.             return;
  119.         }
  120.         $query->criteria[] = new LogicalOr(array_map(
  121.             static fn (ObjectClassInterface $objectClass) => new ObjectCriterion($objectClass->getObjectClass()),
  122.             $objectClasses,
  123.         ));
  124.     }
  125. }