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. }