View source
<?php
namespace Drupal\jsonapi_resources_test\Resource;
use Drupal\Core\Access\CsrfRequestHeaderAccessCheck;
use Drupal\Core\Access\CsrfTokenGenerator;
use Drupal\Core\Cache\CacheableMetadata;
use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\jsonapi\JsonApiResource\LinkCollection;
use Drupal\jsonapi\JsonApiResource\ResourceObject;
use Drupal\jsonapi\JsonApiResource\ResourceObjectData;
use Drupal\jsonapi\ResourceType\ResourceType;
use Drupal\jsonapi\ResourceType\ResourceTypeAttribute;
use Drupal\jsonapi_resources\Resource\ResourceBase;
use Drupal\user\UserInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Route;
class CurrentUserInfo extends ResourceBase implements ContainerInjectionInterface {
protected $entityTypeManager;
protected $currentUser;
protected $tokenGenerator;
public function __construct(EntityTypeManagerInterface $entity_type_manager, AccountInterface $account, CsrfTokenGenerator $token_generator) {
$this->entityTypeManager = $entity_type_manager;
$this->currentUser = $account;
$this->tokenGenerator = $token_generator;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('entity_type.manager'), $container
->get('current_user'), $container
->get('csrf_token'));
}
public function process(Request $request, array $resource_types) {
$user_storage = $this->entityTypeManager
->getStorage('user');
$current_user = $user_storage
->load($this->currentUser
->id());
assert($current_user instanceof UserInterface);
$resource_type = reset($resource_types);
$links = new LinkCollection([]);
$primary_data = new ResourceObject($current_user, $resource_type, $current_user
->uuid(), NULL, [
'displayName' => $current_user
->getDisplayName(),
'roles' => $current_user
->getRoles(TRUE),
'token' => $this->tokenGenerator
->get(CsrfRequestHeaderAccessCheck::TOKEN_KEY),
], $links);
$top_level_data = new ResourceObjectData([
$primary_data,
], 1);
$response = $this
->createJsonapiResponse($top_level_data, $request);
$response
->addCacheableDependency((new CacheableMetadata())
->addCacheContexts([
'user',
]));
return $response;
}
public function getRouteResourceTypes(Route $route, string $route_name) : array {
$fields = [
'displayName' => new ResourceTypeAttribute('displayName'),
'roles' => new ResourceTypeAttribute('roles', NULL, TRUE, FALSE),
'token' => new ResourceTypeAttribute('token'),
];
$resource_type = new ResourceType('current_user', 'current_user', NULL, FALSE, TRUE, TRUE, FALSE, $fields);
$resource_type
->setRelatableResourceTypes([]);
return [
$resource_type,
];
}
}