custom/plugins/ResChannableConnector/src/ResChannableConnector.php line 23

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Res\ResChannableConnector;
  3. use Shopware\Core\Framework\Api\Util\AccessKeyHelper;
  4. use Shopware\Core\Framework\Context;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting;
  9. use Shopware\Core\Framework\Plugin;
  10. use Shopware\Core\Framework\Plugin\Context\InstallContext;
  11. use Shopware\Core\Framework\Plugin\Context\UpdateContext;
  12. use Shopware\Core\Framework\Uuid\Uuid;
  13. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  14. use Shopware\Core\System\User\UserEntity;
  15. use Symfony\Component\Config\FileLocator;
  16. use Symfony\Component\DependencyInjection\ContainerBuilder;
  17. use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
  18. use function explode;
  19. class ResChannableConnector extends Plugin
  20. {
  21.     /**
  22.      * {@inheritdoc}
  23.      */
  24.     public function build(ContainerBuilder $container): void
  25.     {
  26.         parent::build($container);
  27.         $loader = new XmlFileLoader($container, new FileLocator(__DIR__ '/DependencyInjection/'));
  28.         $loader->load('setting.xml');
  29.     }
  30.     public function install(InstallContext $context): void
  31.     {
  32.         $this->createApiUser($context->getContext());
  33.     }
  34.     public function update(UpdateContext $context): void
  35.     {
  36.         $this->updateApiUser($context->getContext());
  37.     }
  38.     /**
  39.      * Update the api user
  40.      */
  41.     private function updateApiUser(Context $context): void
  42.     {
  43.         $user $this->getApiUser($context);
  44.         if ( !$user->count() ) {
  45.             return;
  46.         }
  47.         /** @var EntityRepositoryInterface $userRepository */
  48.         $userRepository $this->container->get('user.repository');
  49.         # Create system context because of write protection
  50.         $systemContext Context::createDefaultContext();
  51.         $user $user->getEntities()->first();
  52.         $userRepository->update([
  53.                 [
  54.                     'id' => $user->getId(),
  55.                     'admin' => false
  56.                 ]
  57.             ],
  58.             $systemContext
  59.         );
  60.     }
  61.     /**
  62.      * Check api user exist
  63.      */
  64.     private function checkApiUser(Context $context): bool
  65.     {
  66.         return ($this->getApiUser($context)->count() > 0);
  67.     }
  68.     /**
  69.      * Check api user exist
  70.      */
  71.     private function getApiUser(Context $context): EntitySearchResult
  72.     {
  73.         $criteria = new Criteria();
  74.         $criteria->addFilter(new EqualsFilter('username''ChannableApiUser'));
  75.         /** @var EntityRepositoryInterface $userRepository */
  76.         $userRepository $this->container->get('user.repository');
  77.         return $userRepository->search($criteria,$context);
  78.     }
  79.     /**
  80.      * Creates the api user
  81.      */
  82.     private function createApiUser(Context $context): void
  83.     {
  84.         if ( $this->checkApiUser($context) ) {
  85.             $this->updateApiUser($context);
  86.             return;
  87.         }
  88.         $userEntityId Uuid::randomHex();
  89.         $criteria = new Criteria();
  90.         $criteria->addSorting(new FieldSorting('createdAt'FieldSorting::ASCENDING));
  91.         $criteria->setLimit(1);
  92.         /** @var EntityRepositoryInterface $userRepository */
  93.         $userRepository $this->container->get('user.repository');
  94.         /** @var UserEntity|null $shopUser */
  95.         $shopUser $userRepository->search($criteria$context)->getEntities()->first();
  96.         $userMail $shopUser->getEmail();
  97.         $userMail explode('@',$userMail);
  98.         $userMail $userEntityId.'@'.$userMail[1];
  99.         $accessKeyId Uuid::randomHex();
  100.         $accessKey AccessKeyHelper::generateAccessKey('user');
  101.         $secretAccessKey AccessKeyHelper::generateSecretAccessKey();
  102.         # Create system context because of write protection
  103.         $systemContext Context::createDefaultContext();
  104.         $access = [
  105.             'id' => $accessKeyId,
  106.             'writeAccess' => true,
  107.             'userId' => $userEntityId,
  108.             'label' => 'Channable integration',
  109.             'accessKey' => $accessKey,
  110.             'secretAccessKey' => $secretAccessKey,
  111.         ];
  112.         $newUser = [
  113.             'id' => $userEntityId,
  114.             'firstName' => 'Channable',
  115.             'lastName'  => 'API',
  116.             'password'  => $accessKey,
  117.             'username'  => 'ChannableApiUser',
  118.             'email'     => $userMail,
  119.             'localeId' => $shopUser->getLocaleId(),
  120.             'active' => true,
  121.             'admin' => false,
  122.             'avatarId' => $shopUser->getAvatarId(),
  123.             'accessKeys' => [$access]
  124.         ];
  125.         $userRepository->create([$newUser], $systemContext);
  126.     }
  127. }