View source
<?php
namespace Drupal\jsonapi_extras\ResourceType;
use Drupal\Component\Plugin\Exception\PluginException;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Entity\EntityRepositoryInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\jsonapi\ResourceType\ResourceTypeRepository;
use Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerManager;
use Drupal\Core\Config\ConfigFactoryInterface;
class ConfigurableResourceTypeRepository extends ResourceTypeRepository {
protected $entityRepository;
protected $enhancerManager;
protected $configFactory;
protected $resourceTypes;
protected $enabledResourceTypes;
protected $resourceConfigs;
protected static function buildResourceConfigId($entity_type_id, $bundle) {
return sprintf('%s--%s', $entity_type_id, $bundle);
}
public function __construct(...$arguments) {
parent::__construct(...$arguments);
if (property_exists($this, 'cacheTags')) {
$this->cacheTags = array_merge($this->cacheTags, [
'config:jsonapi_extras.settings',
'config:jsonapi_resource_config_list',
]);
}
}
public function setEntityRepository(EntityRepositoryInterface $entity_repository) {
$this->entityRepository = $entity_repository;
}
public function setEnhancerManager(ResourceFieldEnhancerManager $enhancer_manager) {
$this->enhancerManager = $enhancer_manager;
}
public function setConfigFactory(ConfigFactoryInterface $config_factory) {
$this->configFactory = $config_factory;
}
protected function createResourceType(EntityTypeInterface $entity_type, $bundle) {
$resource_type = parent::createResourceType($entity_type, $bundle);
$configurable_resource_type = new ConfigurableResourceType($resource_type
->getEntityTypeId(), $resource_type
->getBundle(), $resource_type
->getDeserializationTargetClass(), $resource_type
->isInternal(), $resource_type
->isLocatable(), $resource_type
->isMutable(), $resource_type
->isVersionable(), $resource_type
->getFields());
$resource_config_id = static::buildResourceConfigId($entity_type
->id(), $bundle);
$resource_config = $this
->getResourceConfig($resource_config_id);
$configurable_resource_type
->setJsonapiResourceConfig($resource_config);
$configurable_resource_type
->setEnhancerManager($this->enhancerManager);
$configurable_resource_type
->setConfigFactory($this->configFactory);
return $configurable_resource_type;
}
protected function getResourceConfig($resource_config_id) {
$null_resource = new NullJsonapiResourceConfig([
'id' => $resource_config_id,
], 'jsonapi_resource_config');
try {
$resource_configs = $this
->getResourceConfigs();
return isset($resource_configs[$resource_config_id]) ? $resource_configs[$resource_config_id] : $null_resource;
} catch (PluginException $e) {
return $null_resource;
}
}
public function getResourceConfigs() {
if (!$this->resourceConfigs) {
$resource_config_ids = [];
foreach ($this
->getEntityTypeBundleTuples() as $tuple) {
list($entity_type_id, $bundle) = $tuple;
$resource_config_ids[] = static::buildResourceConfigId($entity_type_id, $bundle);
}
$this->resourceConfigs = $this->entityTypeManager
->getStorage('jsonapi_resource_config')
->loadMultiple($resource_config_ids);
}
return $this->resourceConfigs;
}
protected function getEntityTypeBundleTuples() {
$entity_type_ids = array_keys($this->entityTypeManager
->getDefinitions());
return array_reduce($entity_type_ids, function ($carry, $entity_type_id) {
$bundles = array_keys($this->entityTypeBundleInfo
->getBundleInfo($entity_type_id));
$tuples = array_map(function ($bundle) use ($entity_type_id) {
return [
$entity_type_id,
$bundle,
];
}, $bundles);
return array_merge($carry, $tuples);
}, []);
}
public function reset() {
$this->all = [];
$this->resourceConfigs = [];
}
public function getByTypeName($type_name) {
$resource_types = $this
->all();
if (isset($resource_types[$type_name])) {
return $resource_types[$type_name];
}
if (strpos($type_name, '--') !== FALSE) {
list($entity_type_id, $bundle) = explode('--', $type_name);
return static::lookupResourceType($resource_types, $entity_type_id, $bundle);
}
return NULL;
}
protected function getRelatableResourceTypesFromFieldDefinition(FieldDefinitionInterface $field_definition, array $resource_types) {
$item_definition = $field_definition
->getItemDefinition();
$entity_type_id = $item_definition
->getSetting('target_type');
$handler_settings = $item_definition
->getSetting('handler_settings');
$target_bundles = empty($handler_settings['target_bundles']) ? $this
->getAllBundlesForEntityType($entity_type_id) : $handler_settings['target_bundles'];
$relatable_resource_types = [];
foreach ($target_bundles as $target_bundle) {
if ($resource_type = static::lookupResourceType($resource_types, $entity_type_id, $target_bundle)) {
$relatable_resource_types[] = $resource_type;
}
else {
trigger_error(sprintf('The "%s" at "%s:%s" references the "%s:%s" entity type that does not exist. Please take action.', $field_definition
->getName(), $field_definition
->getTargetEntityTypeId(), $field_definition
->getTargetBundle(), $entity_type_id, $target_bundle), E_USER_WARNING);
}
}
return $relatable_resource_types;
}
protected function getAllBundlesForEntityType($entity_type_id) {
return array_map('strval', array_keys($this->entityTypeBundleInfo
->getBundleInfo($entity_type_id)));
}
protected static function lookupResourceType(array $resource_types, $entity_type_id, $bundle) {
if (isset($resource_types["{$entity_type_id}--{$bundle}"])) {
return $resource_types["{$entity_type_id}--{$bundle}"];
}
foreach ($resource_types as $resource_type) {
if ($resource_type
->getEntityTypeId() === $entity_type_id && $resource_type
->getBundle() === $bundle) {
return $resource_type;
}
}
return NULL;
}
}