headless_cms-1.0.3/modules/headless_cms_preview/src/ParamConverter/HeadlessNodePreviewConverter.php
modules/headless_cms_preview/src/ParamConverter/HeadlessNodePreviewConverter.php
<?php
declare(strict_types=1);
namespace Drupal\headless_cms_preview\ParamConverter;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\PageCache\ResponsePolicy\KillSwitch;
use Drupal\Core\ParamConverter\ParamConverterInterface;
use Drupal\headless_cms_preview\PreviewToken\PreviewTokenNegotiator;
use Drupal\headless_cms_preview\TempStore\PreviewTempStoreFactory;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\Attribute\Autowire;
use Symfony\Component\Routing\Route;
/**
* Provides upcasting for a node entity in preview.
*/
class HeadlessNodePreviewConverter implements ParamConverterInterface {
public const TYPE_KEY = 'headless_node_preview';
/**
* Constructs a new NodePreviewConverter.
*/
public function __construct(
protected EntityTypeManagerInterface $entityTypeManager,
protected PreviewTokenNegotiator $negotiator,
protected PreviewTempStoreFactory $tempStoreFactory,
protected KillSwitch $killSwitch,
#[Autowire('@logger.channel.headless_cms_preview')]
protected LoggerInterface $logger,
) {}
/**
* {@inheritdoc}
*/
public function convert($value, $definition, $name, array $defaults) {
$previewToken = $this->negotiator->negotiateFromRequest();
if (!$previewToken) {
// Prevent caching of failed request.
$this->killSwitch->trigger();
$this->logger->warning('Node preview parameter not converted: no preview token set in request');
return NULL;
}
// Check the preview token matches the acutal uuid.
if ($value !== $previewToken->entityUuid) {
// Prevent caching of failed request.
$this->killSwitch->trigger();
$this->logger->warning('Node preview parameter not converted: uuid mismatch');
return NULL;
}
/** @var \Drupal\user\UserInterface $owner */
$owner = $this->entityTypeManager->getStorage('user')->load($previewToken->ownerUid);
if (!$owner) {
// Prevent caching of failed request.
$this->killSwitch->trigger();
$this->logger->warning('Node preview parameter not converted: no user could be loaded for uid @uid', [
'@uid' => $previewToken->ownerUid,
]);
return NULL;
}
$store = $this->tempStoreFactory->get('node_preview', $owner);
if ($form_state = $store->get($value)) {
return $form_state->getFormObject()->getEntity();
}
}
/**
* {@inheritdoc}
*/
public function applies($definition, $name, Route $route) {
if (!empty($definition['type']) && $definition['type'] == 'headless_node_preview') {
return TRUE;
}
return FALSE;
}
}
