headless_cms-1.0.3/modules/headless_cms_preview/src/Controller/JsonApiEntityResource.php
modules/headless_cms_preview/src/Controller/JsonApiEntityResource.php
<?php
declare(strict_types=1);
namespace Drupal\headless_cms_preview\Controller;
use Drupal\Core\Cache\CacheableResponseInterface;
use Drupal\headless_cms_preview\JsonApi\PreviewIncludeResolver;
use Drupal\jsonapi\Controller\EntityResource as BaseEntityResource;
use Drupal\jsonapi\Exception\EntityAccessDeniedHttpException;
use Drupal\jsonapi\IncludeResolver;
use Drupal\jsonapi\JsonApiResource\NullIncludedData;
use Drupal\jsonapi\JsonApiResource\ResourceObject;
use Drupal\jsonapi\JsonApiResource\ResourceObjectData;
use Drupal\jsonapi\ResourceResponse;
use Drupal\node\NodeInterface;
use Symfony\Component\HttpFoundation\Request;
/**
* Process node preview requests.
*/
class JsonApiEntityResource extends BaseEntityResource {
/**
* The preview include resolver.
*/
protected ?PreviewIncludeResolver $previewIncludeResolver = NULL;
/**
* Set the preview include resolver.
*/
public function setPreviewIncludeResolver(PreviewIncludeResolver $previewIncludeResolver) {
$this->previewIncludeResolver = $previewIncludeResolver;
}
/**
* Gets the preview of a node.
*
* @param \Drupal\node\NodeInterface $node_preview
* The node being previewed.
* @param \Symfony\Component\HttpFoundation\Request $request
* The request object.
*
* @return \Drupal\jsonapi\ResourceResponse
* The response.
*
* @throws \Drupal\jsonapi\Exception\EntityAccessDeniedHttpException
* Thrown when access to the entity is not allowed.
* @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
*/
public function getIndividualNodePreview(NodeInterface $node_preview, Request $request): ResourceResponse {
// Avoid caching previews at all.
$node_preview->mergeCacheMaxAge(0);
// Check access.
$resourceObject = $this->entityAccessChecker->getAccessCheckedResourceObject($node_preview);
if ($resourceObject instanceof EntityAccessDeniedHttpException) {
throw $resourceObject;
}
$primaryData = new ResourceObjectData([$resourceObject], 1);
// Get includes in preview mode.
$response = $this->buildWrappedResponse($primaryData, $request, $this->getPreviewIncludes($request, $primaryData));
// Copy the cachability from the data to the response.
if ($response instanceof CacheableResponseInterface) {
$response->addCacheableDependency($primaryData);
}
return $response;
}
/**
* Gets the preview of a node.
*/
public function getPreviewIncludes(Request $request, mixed $data) {
assert($data instanceof ResourceObject || $data instanceof ResourceObjectData);
assert($this->includeResolver instanceof IncludeResolver);
if ($request->query->has('include') && ($include_parameter = $request->query->get('include')) && !empty($include_parameter)) {
return $this->previewIncludeResolver->resolve($data, $include_parameter);
}
return new NullIncludedData();
}
}
