Skip to content
Snippets Groups Projects
Unverified Commit fd0c2e79 authored by Wim Leers's avatar Wim Leers Committed by Mateu Aguiló Bosch
Browse files

Issue #2937797 by Wim Leers, huyby, gabesullice, e0ipso, mistermoper: Entity...

Issue #2937797 by Wim Leers, huyby, gabesullice, e0ipso, mistermoper: Entity UUID Converter performance
parent edaeb69c
No related branches found
No related tags found
No related merge requests found
......@@ -132,7 +132,7 @@ services:
jsonapi.entity.to_jsonapi:
class: Drupal\jsonapi\EntityToJsonApi
arguments: ['@jsonapi.serializer_do_not_use_removal_imminent', '@jsonapi.resource_type.repository', '@current_user']
arguments: ['@jsonapi.serializer_do_not_use_removal_imminent', '@jsonapi.resource_type.repository', '@current_user', '@request_stack']
logger.channel.jsonapi:
parent: logger.channel_base
......
......@@ -9,6 +9,7 @@ use Drupal\jsonapi\Resource\JsonApiDocumentTopLevel;
use Drupal\jsonapi\ResourceType\ResourceTypeRepositoryInterface;
use Drupal\jsonapi\Serializer\Serializer;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
/**
* Simplifies the process of generating a JSON API version of an entity.
......@@ -38,6 +39,13 @@ class EntityToJsonApi {
*/
protected $resourceTypeRepository;
/**
* The request stack.
*
* @var \Symfony\Component\HttpFoundation\RequestStack
*/
protected $requestStack;
/**
* EntityToJsonApi constructor.
*
......@@ -47,11 +55,14 @@ class EntityToJsonApi {
* The resource type repository.
* @param \Drupal\Core\Session\AccountInterface $current_user
* The currently logged in user.
* @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
* The request stack.
*/
public function __construct(Serializer $serializer, ResourceTypeRepositoryInterface $resource_type_repository, AccountInterface $current_user) {
public function __construct(Serializer $serializer, ResourceTypeRepositoryInterface $resource_type_repository, AccountInterface $current_user, RequestStack $request_stack) {
$this->serializer = $serializer;
$this->resourceTypeRepository = $resource_type_repository;
$this->currentUser = $current_user;
$this->requestStack = $request_stack;
}
/**
......@@ -105,7 +116,8 @@ class EntityToJsonApi {
);
$resource_path = $resource_type->getPath();
$path = sprintf('/%s/%s/%s', $path_prefix, $resource_path, $entity->uuid());
$request = Request::create($path, 'GET');
$master_request = $this->requestStack->getMasterRequest();
$request = Request::create($master_request->getSchemeAndHttpHost() . $master_request->getBaseUrl() . $path, 'GET');
return [
'account' => $this->currentUser,
'cacheable_metadata' => new CacheableMetadata(),
......
......@@ -3,9 +3,9 @@
namespace Drupal\jsonapi\LinkManager;
use Drupal\Core\Routing\UrlGeneratorInterface;
use Drupal\Core\Url;
use Drupal\jsonapi\ResourceType\ResourceType;
use Drupal\jsonapi\Query\OffsetPage;
use Symfony\Cmf\Component\Routing\RouteObjectInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
......@@ -17,13 +17,6 @@ use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
*/
class LinkManager {
/**
* Used to determine the route from a given request.
*
* @var \Symfony\Component\Routing\Matcher\RequestMatcherInterface
*/
protected $router;
/**
* Used to generate a link to a jsonapi representation of an entity.
*
......@@ -34,13 +27,12 @@ class LinkManager {
/**
* Instantiates a LinkManager object.
*
* @param \Symfony\Component\Routing\Matcher\RequestMatcherInterface $router
* The router.
* @param \Symfony\Component\Routing\Matcher\RequestMatcherInterface|null $_router
* Unused. Kept for backwards compatibility.
* @param \Drupal\Core\Routing\UrlGeneratorInterface $url_generator
* The Url generator.
*/
public function __construct(RequestMatcherInterface $router, UrlGeneratorInterface $url_generator) {
$this->router = $router;
public function __construct(RequestMatcherInterface $_router = NULL, UrlGeneratorInterface $url_generator) {
$this->urlGenerator = $url_generator;
}
......@@ -81,17 +73,12 @@ class LinkManager {
* The full URL.
*/
public function getRequestLink(Request $request, $query = NULL) {
$query = $query ?: (array) $request->query->getIterator();
$result = $this->router->matchRequest($request);
$route_name = $result[RouteObjectInterface::ROUTE_NAME];
/* @var \Symfony\Component\HttpFoundation\ParameterBag $raw_variables */
$raw_variables = $result['_raw_variables'];
$route_parameters = $raw_variables->all();
$options = [
'absolute' => TRUE,
'query' => $query,
];
return $this->urlGenerator->generateFromRoute($route_name, $route_parameters, $options);
if ($query === NULL) {
return $request->getUri();
}
$uri_without_query_string = $request->getSchemeAndHttpHost() . $request->getBaseUrl() . $request->getPathInfo();
return Url::fromUri($uri_without_query_string)->setOption('query', $query)->toString();
}
/**
......
......@@ -2,13 +2,15 @@
namespace Drupal\Tests\jsonapi\Unit\LinkManager;
use Drupal\Component\Utility\UrlHelper;
use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\Routing\UrlGeneratorInterface;
use Drupal\Core\Utility\UnroutedUrlAssemblerInterface;
use Drupal\jsonapi\LinkManager\LinkManager;
use Drupal\jsonapi\Query\OffsetPage;
use Drupal\Tests\UnitTestCase;
use Prophecy\Argument;
use Symfony\Cmf\Component\Routing\ChainRouterInterface;
use Symfony\Cmf\Component\Routing\RouteObjectInterface;
use Symfony\Component\HttpFoundation\ParameterBag;
use Symfony\Component\HttpFoundation\Request;
......@@ -33,10 +35,6 @@ class LinkManagerTest extends UnitTestCase {
protected function setUp() {
parent::setUp();
$router = $this->prophesize(ChainRouterInterface::class);
$router->matchRequest(Argument::type(Request::class))->willReturn([
RouteObjectInterface::ROUTE_NAME => 'fake',
'_raw_variables' => new ParameterBag(['lorem' => 'ipsum']),
]);
$url_generator = $this->prophesize(UrlGeneratorInterface::class);
$url_generator->generateFromRoute(Argument::cetera())->willReturnArgument(2);
$this->linkManager = new LinkManager($router->reveal(), $url_generator->reveal());
......@@ -47,10 +45,20 @@ class LinkManagerTest extends UnitTestCase {
* @dataProvider getPagerLinksProvider
*/
public function testGetPagerLinks($offset, $size, $has_next_page, $total, $include_count, array $pages) {
$assembler = $this->prophesize(UnroutedUrlAssemblerInterface::class);
$assembler->assemble(Argument::type('string'), Argument::type('array'), FALSE)
->will(function ($args) {
return $args[0] . '?' . UrlHelper::buildQuery($args[1]['query']);
});
$container = new ContainerBuilder();
$container->set('unrouted_url_assembler', $assembler->reveal());
\Drupal::setContainer($container);
// Add the extra stuff to the expected query.
$pages = array_filter($pages);
$pages = array_map(function ($page) {
return ['absolute' => TRUE, 'query' => ['page' => $page]];
return 'https://example.com/drupal/jsonapi/node/article/07c870e9-491b-4173-8e2b-4e059400af72?amet=pax&page%5Boffset%5D=' . $page['offset'] . '&page%5Blimit%5D=' . $page['limit'];
}, $pages);
$request = $this->prophesize(Request::class);
......@@ -58,8 +66,14 @@ class LinkManagerTest extends UnitTestCase {
$page_param = $this->prophesize(OffsetPage::class);
$page_param->getOffset()->willReturn($offset);
$page_param->getSize()->willReturn($size);
$request->getUri()->willReturn('https://example.com/drupal/jsonapi/node/article/07c870e9-491b-4173-8e2b-4e059400af72?amet=pax');
$request->getBaseUrl()->willReturn('/drupal');
$request->getPathInfo()->willReturn('');
$request->getSchemeAndHttpHost()->willReturn('https://example.com');
$request->getBaseUrl()->willReturn('/drupal');
$request->getPathInfo()->willReturn('/jsonapi/node/article/07c870e9-491b-4173-8e2b-4e059400af72');
$request->get('_json_api_params')->willReturn(['page' => $page_param->reveal()]);
$request->query = new ParameterBag();
$request->query = new ParameterBag(['amet' => 'pax']);
$context = ['has_next_page' => $has_next_page];
if ($include_count) {
......@@ -68,7 +82,9 @@ class LinkManagerTest extends UnitTestCase {
$links = $this->linkManager
->getPagerLinks($request->reveal(), $context);
$this->assertEquals($pages, $links);
ksort($pages);
ksort($links);
$this->assertSame($pages, $links);
}
/**
......@@ -165,25 +181,29 @@ class LinkManagerTest extends UnitTestCase {
* @covers ::getRequestLink
*/
public function testGetRequestLink() {
$assembler = $this->prophesize(UnroutedUrlAssemblerInterface::class);
$assembler->assemble(Argument::type('string'), ['external' => TRUE, 'query' => ['dolor' => 'sid']], FALSE)
->will(function ($args) {
return $args[0] . '?dolor=sid';
})
->shouldBeCalled();
$container = new ContainerBuilder();
$container->set('unrouted_url_assembler', $assembler->reveal());
\Drupal::setContainer($container);
$request = $this->prophesize(Request::class);
// Have the request return the desired page parameter.
$page_param = $this->prophesize(OffsetPage::class);
$page_param->getOffset()->willReturn(NULL);
$page_param->getSize()->willReturn(NULL);
$request->get('_json_api_params')->willReturn(['page' => $page_param->reveal()]);
$request->query = new ParameterBag(['amet' => 'pax']);
$request->getUri()->willReturn('https://example.com/drupal/jsonapi/node/article/07c870e9-491b-4173-8e2b-4e059400af72?amet=pax');
$request->getBaseUrl()->willReturn('/drupal');
$request->getPathInfo()->willReturn('');
$request->getSchemeAndHttpHost()->willReturn('https://example.com');
$request->getBaseUrl()->willReturn('/drupal');
$request->getPathInfo()->willReturn('/jsonapi/node/article/07c870e9-491b-4173-8e2b-4e059400af72');
$this->assertSame('https://example.com/drupal/jsonapi/node/article/07c870e9-491b-4173-8e2b-4e059400af72?dolor=sid', $this->linkManager->getRequestLink($request->reveal(), ['dolor' => 'sid']));
$query = $this->linkManager->getRequestLink($request->reveal(), ['dolor' => 'sid']);
$this->assertEquals([
'absolute' => TRUE,
'query' => ['dolor' => 'sid'],
], $query);
// Get the default query from the request object.
$query = $this->linkManager->getRequestLink($request->reveal());
$this->assertEquals([
'absolute' => TRUE,
'query' => ['amet' => 'pax'],
], $query);
$this->assertSame('https://example.com/drupal/jsonapi/node/article/07c870e9-491b-4173-8e2b-4e059400af72?amet=pax', $this->linkManager->getRequestLink($request->reveal()));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment