custom/static-plugins/GlobusSW6/src/Service/App/AppService.php line 53

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace GlobusSW6\Service\App;
  3. use Doctrine\DBAL\Connection;
  4. use GlobusSW6\Core\Content\Devices\DeviceEntity;
  5. use Psr\Log\LoggerInterface;
  6. use Shopware\Core\Framework\Context;
  7. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  9. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  10. use Shopware\Core\Framework\Uuid\Uuid;
  11. use Symfony\Component\HttpFoundation\Session\Session;
  12. class AppService
  13. {
  14.     /** @var Connection */
  15.     private $connection;
  16.     /** @var EntityRepositoryInterface */
  17.     private $deviceRepository;
  18.     /** @var LoggerInterface */
  19.     private $logger;
  20.     /**
  21.      * @param Connection $connection
  22.      * @param EntityRepositoryInterface $deviceRepository
  23.      * @param LoggerInterface $logger
  24.      */
  25.     public function __construct(Connection $connectionEntityRepositoryInterface $deviceRepositoryLoggerInterface $logger)
  26.     {
  27.         $this->connection $connection;
  28.         $this->deviceRepository $deviceRepository;
  29.         $this->logger $logger;
  30.     }
  31.     public function getSalesChannelApiPayload(string $token)
  32.     {
  33.         $payload $this->connection->fetchAssoc('
  34.             SELECT payload
  35.             FROM sales_channel_api_context scac
  36.             WHERE scac.token = :token;
  37.         ', [
  38.             'token' => $token
  39.         ]);
  40.         return $payload;
  41.     }
  42.     public function isAppFromSession(Session $session): bool
  43.     {
  44.         return !is_null($session->get('ianeo_hitseller_app_device_id'));
  45.     }
  46.     /**
  47.      * @param string $token
  48.      * @return string|null
  49.      *
  50.      * Given a string token, this method checks if the token is listed in the sales_channel_api_context.
  51.      * If yes, it checks whether the payload contains the flag ianeoCurrentStore and returns the selected store for this user.
  52.      * Otherwise, null is returned.
  53.      */
  54.     public function getSelectedStoreInApp(string $token)
  55.     {
  56.         $payload $this->getSalesChannelApiPayload($token);
  57.         if (!$payload) {
  58.             return null;
  59.         }
  60.         $payloadArray json_decode((string)$payload['payload'], true);
  61.         if (!array_key_exists('ianeoCurrentStore'$payloadArray)) {
  62.             return null;
  63.         }
  64.         return $payloadArray['ianeoCurrentStore'];
  65.     }
  66.     /**
  67.      * @param string $deviceId
  68.      * @return DeviceEntity|null
  69.      */
  70.     public function getAppDeviceById(string $deviceId): ?DeviceEntity
  71.     {
  72.         $criteria = new Criteria();
  73.         $criteria->addFilter(new EqualsFilter('deviceId'$deviceId));
  74.         /** @var DeviceEntity $device */
  75.         return $this->deviceRepository->search($criteriaContext::createDefaultContext())->first();
  76.     }
  77.     public function saveDevice(string $deviceIdstring $token)
  78.     {
  79.         try {
  80.             // perfomance improvement from 0.099 (DAL) to 0,001 (SQL)
  81.             $device $this->connection->fetchAllAssociative('
  82.                 SELECT *
  83.                 FROM ianeo_device
  84.                 WHERE device_id = :deviceId
  85.                 LIMIT 1;
  86.             ', ['deviceId' => $deviceId]);
  87.             $deviceUuid Uuid::randomHex();
  88.             if (empty($device)) {
  89.                 $this->deviceRepository->upsert([
  90.                     [
  91.                         'id' => $deviceUuid,
  92.                         'deviceId' => $deviceId,
  93.                         'swContextToken' => $token
  94.                     ]
  95.                 ], Context::createDefaultContext());
  96.             }
  97.         } catch (\Throwable $t) {
  98.             $this->logger->info('Unable to upsert device in saveDevice() - DeviceId: ' $deviceId);
  99.             $this->logger->info('Unable to upsert device in saveDevice() - swContextToken: ' $token);
  100.             $this->logger->info('Unable to upsert device in saveDevice() - Reason: ' $t->getMessage());
  101.             throw new \Exception($t->getMessage());
  102.         }
  103.         return $deviceUuid;
  104.     }
  105.     public function saveStoreForDevice(string $contextTokenint $storeLegacyIdstring $deviceId)
  106.     {
  107.         // perfomance test showed 1/1000 second better performance with sql
  108.         $criteria = new Criteria();
  109.         $criteria->addFilter(new EqualsFilter('swContextToken'$contextToken));
  110.         $criteria->addFilter(new EqualsFilter('deviceId'$deviceId));
  111.         try {
  112.             /** @var DeviceEntity $device */
  113.             $deviceUuId $this->deviceRepository->searchIds($criteriaContext::createDefaultContext())->firstId();
  114.             if (is_null($deviceUuId)) {
  115.                 $this->logger->info('Unable to find id for device ' $deviceId);
  116.                 $this->logger->info('Unable to find id for device (token) ' $contextToken);
  117.                 $deviceUuId $this->saveDevice($deviceId$contextToken);
  118.             }
  119.             $this->connection->executeStatement("
  120.                 UPDATE ianeo_device idv
  121.                 SET idv.store_legacy_id = :storeId
  122.                 WHERE idv.device_id = :deviceId
  123.             ", ['storeId' => $storeLegacyId'deviceId' => $deviceId]);
  124.         } catch (\Throwable $t) {
  125.             $this->logger->info('Unable to upsert device in saveStoreForDevice() - DeviceUuid: ' $deviceUuId);
  126.             $this->logger->info('Unable to upsert device in saveStoreForDevice() - DeviceId: ' $deviceId);
  127.             $this->logger->info('Unable to upsert device in saveStoreForDevice() - swContextToken: ' $contextToken);
  128.             $this->logger->info('Unable to upsert device in saveStoreForDevice() - storeLegacyId: ' $storeLegacyId);
  129.             $this->logger->info('Unable to upsert device in saveStoreForDevice() - Reason: ' $t->getMessage());
  130.             throw new \Exception($t->getMessage());
  131.         }
  132.     }
  133.     public function saveCustomerForDevice(string $deviceIdstring $customerId)
  134.     {
  135.         $criteria = new Criteria();
  136.         $criteria->addFilter(new EqualsFilter('deviceId'$deviceId));
  137.         try {
  138.             /** @var DeviceEntity $device */
  139.             $deviceUuId $this->deviceRepository->searchIds($criteriaContext::createDefaultContext())->firstId();
  140.             $this->deviceRepository->update([
  141.                 [
  142.                     'id' => $deviceUuId,
  143.                     'customerId' => $customerId
  144.                 ]
  145.             ], Context::createDefaultContext());
  146.         } catch (\Throwable $t) {
  147.             $this->logger->info('Unable to upsert device in saveCustomerForDevice() - DeviceId: ' $deviceUuId);
  148.             $this->logger->info('Unable to upsert device in saveCustomerForDevice() - customerId: ' $customerId);
  149.             $this->logger->info('Unable to upsert device in saveCustomerForDevice() - Reason: ' $t->getMessage());
  150.             throw new \Exception($t->getMessage());
  151.         }
  152.     }
  153.     public function deleteToken(string $deviceId)
  154.     {
  155.         $criteria = new Criteria();
  156.         $criteria->addFilter(new EqualsFilter('deviceId'$deviceId));
  157.         try {
  158.             /** @var DeviceEntity $device */
  159.             $deviceUuId $this->deviceRepository->searchIds($criteriaContext::createDefaultContext())->firstId();
  160.             $this->deviceRepository->update([
  161.                 [
  162.                     'id' => $deviceUuId,
  163.                     'swContextToken' => null
  164.                 ]
  165.             ], Context::createDefaultContext());
  166.         } catch (\Throwable $t) {
  167.             $this->logger->info('Unable to update device in deleteToken() - DeviceId: ' $deviceUuId);
  168.             $this->logger->info('Unable to upsert device in deleteToken() - Reason: ' $t->getMessage());
  169.             throw new \Exception($t->getMessage());
  170.         }
  171.     }
  172.     public function setNewToken(string $deviceIdstring $token)
  173.     {
  174.         $criteria = new Criteria();
  175.         $criteria->addFilter(new EqualsFilter('deviceId'$deviceId));
  176.         try {
  177.             /** @var DeviceEntity $device */
  178.             $deviceUuId $this->deviceRepository->searchIds($criteriaContext::createDefaultContext())->firstId();
  179.             $this->deviceRepository->upsert([
  180.                 [
  181.                     'id' => $deviceUuId,
  182.                     'swContextToken' => $token
  183.                 ]
  184.             ], Context::createDefaultContext());
  185.         } catch (\Throwable $t) {
  186.             $this->logger->info('Unable to upsert device in setNewToken() - DeviceId: ' $deviceUuId);
  187.             $this->logger->info('Unable to upsert device in setNewToken() - swContextToken: ' $token);
  188.             $this->logger->info('Unable to upsert device in setNewToken() - Reason: ' $t->getMessage());
  189.             throw new \Exception($t->getMessage());
  190.         }
  191.     }
  192. }