acquia_commercemanager-8.x-1.122/modules/acm_sku/src/Plugin/rest/resource/ProductStockSyncResource.php
modules/acm_sku/src/Plugin/rest/resource/ProductStockSyncResource.php
<?php
namespace Drupal\acm_sku\Plugin\rest\resource;
use Drupal\acm_sku\StockManager;
use Symfony\Component\HttpFoundation\Request;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\rest\Plugin\ResourceBase;
use Drupal\rest\ModifiedResourceResponse;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Class ProductStockSyncResource.
*
* @package Drupal\acm_sku\Plugin
*
* @ingroup acm_sku
*
* @RestResource(
* id = "acm_productstocksync",
* label = @Translation("Acquia Commerce Product Stock Sync"),
* uri_paths = {
* "canonical" = "/productstocksync",
* "https://www.drupal.org/link-relations/create" = "/productstocksync"
* }
* )
*/
class ProductStockSyncResource extends ResourceBase {
/**
* Drupal Config Factory Instance.
*
* @var \Drupal\Core\Config\ConfigFactoryInterface
*/
private $configFactory;
/**
* The stock manager.
*
* @var \Drupal\acm_sku\StockManager
*/
private $stockManager;
/**
* Current request.
*
* @var \Symfony\Component\HttpFoundation\Request
*/
private $currentRequest;
/**
* Construct.
*
* @param array $configuration
* A configuration array containing information about the plugin instance.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param mixed $plugin_definition
* The plugin implementation definition.
* @param array $serializer_formats
* The available serialization formats.
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The config factory.
* @param \Psr\Log\LoggerInterface $logger
* A logger instance.
* @param \Drupal\acm_sku\StockManager $stock_manager
* The stock manager.
* @param \Symfony\Component\HttpFoundation\Request $current_request
* The current request.
*/
public function __construct(array $configuration,
$plugin_id,
$plugin_definition,
array $serializer_formats,
ConfigFactoryInterface $config_factory,
LoggerInterface $logger,
StockManager $stock_manager,
Request $current_request
) {
parent::__construct(
$configuration,
$plugin_id,
$plugin_definition,
$serializer_formats,
$logger
);
$this->stockManager = $stock_manager;
$this->currentRequest = $current_request;
$this->configFactory = $config_factory;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->getParameter('serializer.formats'),
$container->get('config.factory'),
$container->get('logger.factory')->get('acm'),
$container->get('acm_sku.stock_manager'),
$container->get('request_stack')->getCurrentRequest()
);
}
/**
* Post.
*
* Handle Connector posting an array of stock data for product update.
*
* @param array $message
* Stock Data for single/multiple products.
*
* @return \Drupal\rest\ModifiedResourceResponse
* HTTP Response object.
*/
public function post(array $message) {
$this->logger->debug('Stock message received. @message', [
'@message' => json_encode($message),
]);
// Work with single message and array of messages.
$stockArray = array_key_exists('sku', $message) ? [$message] : $message;
$requestHeaders = $this->currentRequest->headers;
$storeId = $requestHeaders->has('X-ACM-UUID')
? $requestHeaders->get('X-ACM-UUID')
: '';
foreach ($stockArray as $stock) {
try {
$this->stockManager->processStockMessage($stock, $storeId);
}
catch (\Exception $e) {
$this->logger->error('Failed to process stock message: @message, exception: @exception', [
'@message' => json_encode($stock),
'@exception' => $e->getMessage(),
]);
}
catch (\Throwable $e) {
$this->logger->error('Failed to process stock message: @message, exception: @exception', [
'@message' => json_encode($stock),
'@exception' => $e->getMessage(),
]);
}
}
// Always return success to ACM.
// We already log invalid data or exceptions.
$response = ['success' => TRUE];
return (new ModifiedResourceResponse($response));
}
}
