custom/plugins/cnh-product-exporter-main/src/Services/Transport/CnhApiClient.php line 45

Open in your IDE?
  1. <?php
  2. namespace CnhProductExporter\Services\Transport;
  3. use GuzzleHttp\Client;
  4. use GuzzleHttp\Exception\ClientException;
  5. use Psr\Http\Message\ResponseInterface;
  6. use Psr\Log\LoggerInterface;
  7. use Shopware\Core\System\SystemConfig\SystemConfigService;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Throwable;
  11. class CnhApiClient
  12. {
  13.     const GET_TOKEN_LINK 'api-backend/Authenticate/GetToken';
  14.     const PRODUCT_UPSERT_LINK '/api-backend/Product/CreateOrUpdateProduct';
  15.     const ORDER_STATUS_UPDATE '/api-backend/OrderProcessing/ShipOrder';
  16.     const ORDER_CANCELLED_LINK '/api-backend/OrderProcessing/CancelOrder/%s?notifyCustomer=false';
  17.     private ?string $token null;
  18.     private array $pluginConfig;
  19.     /**
  20.      * @var \GuzzleHttp\Client
  21.      */
  22.     protected Client $httpClient;
  23.     /**
  24.      * @var \Psr\Log\LoggerInterface
  25.      */
  26.     private LoggerInterface $logger;
  27.     /**
  28.      * @param array $storeConfigs
  29.      */
  30.     public function __construct(
  31.         SystemConfigService $pluginConfig,
  32.         LoggerInterface $logger
  33.     ) {
  34.         $this->pluginConfig $pluginConfig->get('CnhProductExporter.config');
  35.         $this->logger $logger;
  36.         $this->httpClient = new Client(
  37.             ['base_uri' => $this->getApiHost(), "headers" => ['Content-Type' => 'application/json']]
  38.         );
  39.     }
  40.     public function sendOrder(string $orderJson)
  41.     {
  42.         $this->logger->info('Cancelling order: ' $orderJson);
  43.         return $this->call(self::ORDER_STATUS_UPDATE, [
  44.             'body' => $orderJson
  45.         ], Request::METHOD_POST);
  46.     }
  47.     public function sendProduct(string $productDatastring $productNumber): ?ResponseInterface
  48.     {
  49.         $this->logger->info('Sending product ' $productNumber);
  50.         $productArray json_decode($productDatatrue);
  51.         // Überprüfen Sie, ob das Produkt gelöscht werden soll
  52.         if (isset($productArray['customFields']['delete_on_chn']) && $productArray['customFields']['delete_on_chn']) {
  53.             $productArray['to_be_deleted'] = true;
  54.         } else {
  55.             $productArray['to_be_deleted'] = false;
  56.         }
  57.         $this->logger->info('Product data: ' json_encode($productArray));
  58.         $options = [
  59.             'body' => json_encode($productArray)
  60.         ];
  61.         $response $this->call(self::PRODUCT_UPSERT_LINK$optionsRequest::METHOD_POST);
  62.         return $response;
  63.     }
  64.     // Produktlöschung__________________________________________________________________________________________________
  65.     public function sendProductString(string $productDatastring $productNumber): ?ResponseInterface
  66.     {
  67.         $this->logger->info('Sending product ' $productNumber);
  68.         // Produktdaten vom JSON-String in ein Array konvertieren
  69.         $productArray json_decode($productDatatrue);
  70.         // Überprüfen Sie, ob das Produkt gelöscht werden soll
  71.         if (isset($productArray['customFields']['delete_on_chn']) && $productArray['customFields']['delete_on_chn']) {
  72.             $productArray['to_be_deleted'] = true;
  73.         } else {
  74.             $productArray['to_be_deleted'] = false;
  75.         }
  76.         $options = [
  77.             'body' => json_encode($productArray)
  78.         ];
  79.         $response $this->call(self::PRODUCT_UPSERT_LINK$optionsRequest::METHOD_POST);
  80.         return $response;
  81.     }
  82. //______________________________________________________________________________________________________________________
  83.     public function call(string $uri, array $optionsstring $method Request::METHOD_GET): ?ResponseInterface
  84.     {
  85.         $maxRetryCount 3;
  86.         $currentTry 1;
  87.         $latestError "";
  88.         if (!$this->token) {
  89.             $this->loadToken();
  90.         }
  91.         $response null;
  92.         while ($currentTry $maxRetryCount) {
  93.             try {
  94.                 $options array_merge(
  95.                     [
  96.                         'headers' => [
  97.                             'Authorization' => 'Bearer ' $this->token,
  98.                         ],
  99.                     ],
  100.                     $options
  101.                 );
  102.                 $response $this->httpClient->request($method$uri$options);
  103.             } catch (Throwable $exception) {
  104.                 if ($exception instanceof ClientException) {
  105.                     $response $exception->getResponse();
  106.                 } else {
  107.                     $latestError $exception->getMessage();
  108.                     $this->logger->alert(
  109.                         sprintf('Catched Error. Retrying %d time out of %d '$currentTry$maxRetryCount 1)
  110.                     );
  111.                 }
  112.             }
  113.             if ($response) {
  114.                 switch ($response->getStatusCode()) {
  115.                     case 200:
  116.                         return $response;
  117.                     case 204:
  118.                         return $response;
  119.                     case 401:
  120.                         $currentTry++;
  121.                         $this->loadToken();
  122.                         break;
  123.                     default:
  124.                         $latestError $response->getBody()->getContents();
  125.                 }
  126.             }
  127.             $this->logger->alert(sprintf('Trying %d time out of %d '$currentTry$maxRetryCount 1));
  128.             $currentTry++;
  129.         }
  130.         $this->logger->error(sprintf('Transport failed. Sent: %s Received:%s'json_encode($options), $latestError));
  131.         return $response;
  132.     }
  133.     private function loadToken(): void
  134.     {
  135.         $loginData = [
  136.             "email" => $this->getEmail(),
  137.             "password" => $this->getPassword(),
  138.         ];
  139.         $result $this->httpClient->post(self::GET_TOKEN_LINK, [
  140.             'body' => json_encode(
  141.                 $loginData
  142.             )
  143.         ]);
  144.         if ($result->getStatusCode() !== Response::HTTP_OK) {
  145.             $this->logger->critical(sprintf('Get Token failed: %'$result->getBody()->getContents()));
  146.         }
  147.         $res json_decode($result->getBody()->getContents(), true);
  148.         if (!array_key_exists('token'$res)) {
  149.             $this->logger->critical('Token aquirement failed');
  150.         }
  151.         $this->token $res['token'];
  152.     }
  153.     private function getEmail()
  154.     {
  155.         return $this->pluginConfig['apiEmail'] ?? "";
  156.     }
  157.     private function getPassword()
  158.     {
  159.         return $this->pluginConfig['apiPassword'] ?? "";
  160.     }
  161.     private function getApiHost(): string
  162.     {
  163.         return $this->pluginConfig['apiHost'] ?? "";
  164.     }
  165.     public function cancelOrder(string $orderId): ResponseInterface
  166.     {
  167.         $this->logger->info('Canceling order: ' $orderId);
  168.         return $this->call(
  169.             sprintf(self::ORDER_CANCELLED_LINK$orderId), []
  170.         );
  171.     }
  172. }