diff --git a/jsonapi.permissions.yml b/jsonapi.permissions.yml new file mode 100644 index 0000000..f5e5908 --- /dev/null +++ b/jsonapi.permissions.yml @@ -0,0 +1,3 @@ +access jsonapi resource list: + description: 'Gives access to the list of resources served by the JSON API module.' + title: 'Access JSON API resource list' diff --git a/src/Controller/EntryPointController.php b/src/Controller/EntryPointController.php new file mode 100644 index 0000000..4a3a7d1 --- /dev/null +++ b/src/Controller/EntryPointController.php @@ -0,0 +1,62 @@ +resourcePluginManager = $resource_plugin_manager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + $resource_plugin_manager = $container->get('plugin.manager.resource.processor'); + return new static($resource_plugin_manager); + } + + /** + * Provides a list of available resources. + */ + public function entryPoint() { + $links = [ + 'self' => '/' . \Drupal::config('jsonapi.resource_info')->get('prefix'), + ]; + foreach ($this->resourcePluginManager->getDefinitions() as $plugin_id => $plugin_definition) { + if (empty($plugin_definition['enabled'])) { + continue; + } + $links[$plugin_definition['type']] = $plugin_definition['data']['partialPath']; + } + $data = [ + 'links' => $links, + 'meta' => [ + 'resourceList' => array_keys($links), + ], + ]; + return new JsonResponse($data); + } + +} diff --git a/src/Routing/Routes.php b/src/Routing/Routes.php index f405bd2..d668e8f 100644 --- a/src/Routing/Routes.php +++ b/src/Routing/Routes.php @@ -76,6 +76,16 @@ class Routes implements ContainerInjectionInterface { */ public function routes() { $collection = new RouteCollection(); + $api_base_path = \Drupal::config('jsonapi.resource_info')->get('prefix'); + $route_collection = (new Route($api_base_path)) + ->setRequirement('_format', 'api_json') + ->setRequirement('_permission', 'access jsonapi resource list') + ->setDefaults([ + '_controller' => '\Drupal\jsonapi\Controller\EntryPointController::entryPoint', + ]) + ->setMethods(['GET']); + $collection->add('jsonapi:entry-point', $route_collection); + foreach ($this->resourcePluginManager->getDefinitions() as $plugin_id => $plugin_definition) { if (empty($plugin_definition['enabled'])) { continue;