diff --git a/src/Routing/Routes.php b/src/Routing/Routes.php index 764a35b..eeba4f0 100644 --- a/src/Routing/Routes.php +++ b/src/Routing/Routes.php @@ -232,19 +232,6 @@ class Routes implements ContainerInjectionInterface { } foreach ($resource_type->getRelatableResourceTypes() as $relationship_field_name => $target_resource_types) { - // Do not create routes for relationships that only target internal - // resource types. - if (!static::hasNonInternalTargetResourceTypes($target_resource_types)) { - continue; - } - - // Get an individual resource's related resources. - $related_route = new Route("/{$path}/{{$entity_type_id}}/{$relationship_field_name}"); - $related_route->setMethods(['GET']); - $related_route->addDefaults(['related' => $relationship_field_name]); - $related_route->setRequirement(RelationshipFieldAccess::ROUTE_REQUIREMENT_KEY, $relationship_field_name); - $routes->add(static::getRouteName($resource_type, "$relationship_field_name.related"), $related_route); - // Read, update, add, or remove an individual resources relationships to // other resources. $relationship_route = new Route("/{$path}/{{$entity_type_id}}/relationships/{$relationship_field_name}"); @@ -259,6 +246,17 @@ class Routes implements ContainerInjectionInterface { $relationship_route->setRequirement(RelationshipFieldAccess::ROUTE_REQUIREMENT_KEY, $relationship_field_name); $relationship_route->setRequirement('_csrf_request_header_token', 'TRUE'); $routes->add(static::getRouteName($resource_type, "$relationship_field_name.relationship"), $relationship_route); + + // Only create routes for related routes that target at least one + // non-internal resource type. + if (static::hasNonInternalTargetResourceTypes($target_resource_types)) { + // Get an individual resource's related resources. + $related_route = new Route("/{$path}/{{$entity_type_id}}/{$relationship_field_name}"); + $related_route->setMethods(['GET']); + $related_route->addDefaults(['related' => $relationship_field_name]); + $related_route->setRequirement(RelationshipFieldAccess::ROUTE_REQUIREMENT_KEY, $relationship_field_name); + $routes->add(static::getRouteName($resource_type, "$relationship_field_name.related"), $related_route); + } } // Add entity parameter conversion to every route. diff --git a/tests/src/Functional/JsonApiFunctionalTest.php b/tests/src/Functional/JsonApiFunctionalTest.php index 35a8566..d7f6bee 100644 --- a/tests/src/Functional/JsonApiFunctionalTest.php +++ b/tests/src/Functional/JsonApiFunctionalTest.php @@ -772,7 +772,7 @@ class JsonApiFunctionalTest extends JsonApiFunctionalTestBase { 'body' => Json::encode($body), 'headers' => ['Content-Type' => 'application/vnd.api+json'], ]); - $this->assertEquals(403, $response->getStatusCode()); + $this->assertEquals(401, $response->getStatusCode()); $response = $this->request('DELETE', $relationship_url, [ // Remove the existing relationship item. 'body' => Json::encode($body), diff --git a/tests/src/Functional/JsonApiRegressionTest.php b/tests/src/Functional/JsonApiRegressionTest.php index d8ad43b..61dfb20 100644 --- a/tests/src/Functional/JsonApiRegressionTest.php +++ b/tests/src/Functional/JsonApiRegressionTest.php @@ -5,6 +5,7 @@ namespace Drupal\Tests\jsonapi\Functional; use Drupal\comment\Entity\Comment; use Drupal\comment\Plugin\Field\FieldType\CommentItemInterface; use Drupal\comment\Tests\CommentTestTrait; +use Drupal\Component\Serialization\Json; use Drupal\Core\Field\FieldStorageDefinitionInterface; use Drupal\Core\Url; use Drupal\node\Entity\Node; @@ -71,8 +72,6 @@ class JsonApiRegressionTest extends JsonApiFunctionalTestBase { $this->addDefaultCommentField('node', 'article'); $this->addDefaultCommentField('taxonomy_term', 'tags', 'comment', CommentItemInterface::OPEN, 'tcomment'); $this->drupalCreateContentType(['type' => 'page']); - $this->rebuildAll(); - $this->createEntityReferenceField( 'node', 'page', @@ -88,6 +87,7 @@ class JsonApiRegressionTest extends JsonApiFunctionalTestBase { ], FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED ); + $this->rebuildAll(); // Create data. $node = Node::create([ diff --git a/tests/src/Unit/Routing/RoutesTest.php b/tests/src/Unit/Routing/RoutesTest.php index 726bd08..2b42603 100644 --- a/tests/src/Unit/Routing/RoutesTest.php +++ b/tests/src/Unit/Routing/RoutesTest.php @@ -71,10 +71,11 @@ class RoutesTest extends UnitTestCase { // type. // - 2 related routes; GET for the non-internal resource type relationships // fields: external & both. - // - 2 relationship routes; all HTTP methods handled by the one route for - // the non-internal resource type. + // - 3 relationship routes; All HTTP methods handled by the same route. + // `relationship` routes are generated even for internal target resource + // types (`related` routes are not). // - 1 for the JSON API entry point. - $this->assertEquals(10, $routes->count()); + $this->assertEquals(11, $routes->count()); $iterator = $routes->getIterator(); // Check the collection route.