vendor/ibexa/corporate-account/src/bundle/EventSubscriber/PageBuilder/SalesRepBlockSubscriber.php line 77

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\CorporateAccount\EventSubscriber\PageBuilder;
  8. use Ibexa\Contracts\Core\Exception\InvalidArgumentException;
  9. use Ibexa\Contracts\Core\Repository\LocationService;
  10. use Ibexa\Contracts\Core\Repository\PermissionResolver;
  11. use Ibexa\Contracts\Core\Repository\SearchService;
  12. use Ibexa\Contracts\Core\Repository\UserService;
  13. use Ibexa\Contracts\Core\Repository\Values\Content\Query;
  14. use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\ContentTypeIdentifier;
  15. use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\LogicalAnd;
  16. use Ibexa\Contracts\Core\Repository\Values\Content\Query\Criterion\ParentLocationId;
  17. use Ibexa\Contracts\Core\Repository\Values\Content\Query\SortClause\Random;
  18. use Ibexa\Contracts\Core\Repository\Values\User\User;
  19. use Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface;
  20. use Ibexa\Contracts\CorporateAccount\Permission\MemberResolver;
  21. use Ibexa\Contracts\CorporateAccount\Service\CompanyService;
  22. use Ibexa\CorporateAccount\Configuration\CorporateAccountConfiguration;
  23. use Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\BlockRenderEvents;
  24. use Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\Event\PreRenderEvent;
  25. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  26. final class SalesRepBlockSubscriber implements EventSubscriberInterface
  27. {
  28.     private const BLOCK_IDENTIFIER 'sales_rep';
  29.     private MemberResolver $memberResolver;
  30.     private CompanyService $companyService;
  31.     private PermissionResolver $permissionResolver;
  32.     private UserService $userService;
  33.     private SearchService $searchService;
  34.     private LocationService $locationService;
  35.     private CorporateAccountConfiguration $corporateAccountConfiguration;
  36.     private ConfigResolverInterface $configResolver;
  37.     public function __construct(
  38.         MemberResolver $memberResolver,
  39.         PermissionResolver $permissionResolver,
  40.         CompanyService $companyService,
  41.         UserService $userService,
  42.         SearchService $searchService,
  43.         LocationService $locationService,
  44.         CorporateAccountConfiguration $corporateAccountConfiguration,
  45.         ConfigResolverInterface $configResolver
  46.     ) {
  47.         $this->memberResolver $memberResolver;
  48.         $this->companyService $companyService;
  49.         $this->permissionResolver $permissionResolver;
  50.         $this->userService $userService;
  51.         $this->searchService $searchService;
  52.         $this->locationService $locationService;
  53.         $this->corporateAccountConfiguration $corporateAccountConfiguration;
  54.         $this->configResolver $configResolver;
  55.     }
  56.     public static function getSubscribedEvents(): array
  57.     {
  58.         return [
  59.             BlockRenderEvents::getBlockPreRenderEventName(self::BLOCK_IDENTIFIER) => 'onBlockPreRender',
  60.         ];
  61.     }
  62.     public function onBlockPreRender(PreRenderEvent $event): void
  63.     {
  64.         /** @var \Ibexa\FieldTypePage\FieldType\Page\Block\Renderer\Twig\TwigRenderRequest $renderRequest */
  65.         $renderRequest $event->getRenderRequest();
  66.         $parameters $renderRequest->getParameters();
  67.         try {
  68.             $currentMember $this->memberResolver->getCurrentMember();
  69.             $salesRep $this->companyService->getCompanySalesRepresentative(
  70.                 $currentMember->getCompany()
  71.             );
  72.         } catch (InvalidArgumentException $exception) {
  73.             $salesRep $this->getPreviewSalesRep();
  74.             $renderRequest->setTemplate(
  75.                 '@ibexadesign/customer_portal/page_builder/blocks/no_sales_rep_context.html.twig'
  76.             );
  77.         }
  78.         $parameters['sales_rep'] = $salesRep;
  79.         $renderRequest->setParameters($parameters);
  80.     }
  81.     private function getPreviewSalesRep(): User
  82.     {
  83.         $salesRepGroup $this->locationService->loadLocationByRemoteId(
  84.             $this->corporateAccountConfiguration->getSalesRepUserGroupRemoteId()
  85.         );
  86.         $userContentTypes $this->configResolver->getParameter('user_content_type_identifier');
  87.         $filter = new LogicalAnd(
  88.             [new ContentTypeIdentifier($userContentTypes), new ParentLocationId($salesRepGroup->id)]
  89.         );
  90.         $query = new Query([
  91.             'filter' => $filter,
  92.             'limit' => 1,
  93.             'sortClauses' => [new Random()],
  94.         ]);
  95.         $randomSalesRep $this->searchService->findContent(
  96.             $query
  97.         );
  98.         $salesRepContent null;
  99.         if ($randomSalesRep->totalCount 0) {
  100.             /** @var \Ibexa\Contracts\Core\Repository\Values\Content\Content $salesRepContent */
  101.             $salesRepContent $randomSalesRep->searchHits[0]->valueObject;
  102.         }
  103.         return $this->userService->loadUser(
  104.             $salesRepContent !== null
  105.                 $salesRepContent->id
  106.                 $this->permissionResolver->getCurrentUserReference()->getUserId()
  107.         );
  108.     }
  109. }