From 748289b61ae8d7ab7b860ee7a7aeba6ed38b3f48 Mon Sep 17 00:00:00 2001 From: Matthieu Date: Fri, 19 Jun 2026 14:33:53 +0200 Subject: [PATCH] feat(modules) : expose GET /api/modules and module registry --- config/modules.php | 11 +++ config/packages/security.yaml | 2 + src/Shared/Domain/Module/ModuleInterface.php | 23 ++++++ src/Shared/Domain/Module/ModuleRegistry.php | 25 ++++++ .../ApiPlatform/Resource/ModulesResource.php | 28 +++++++ .../ApiPlatform/State/ModulesProvider.php | 30 +++++++ .../Functional/Shared/ModulesEndpointTest.php | 24 ++++++ .../Unit/Shared/Module/ModuleRegistryTest.php | 81 +++++++++++++++++++ 8 files changed, 224 insertions(+) create mode 100644 config/modules.php create mode 100644 src/Shared/Domain/Module/ModuleInterface.php create mode 100644 src/Shared/Domain/Module/ModuleRegistry.php create mode 100644 src/Shared/Infrastructure/ApiPlatform/Resource/ModulesResource.php create mode 100644 src/Shared/Infrastructure/ApiPlatform/State/ModulesProvider.php create mode 100644 tests/Functional/Shared/ModulesEndpointTest.php create mode 100644 tests/Unit/Shared/Module/ModuleRegistryTest.php diff --git a/config/modules.php b/config/modules.php new file mode 100644 index 0000000..c6df2ac --- /dev/null +++ b/config/modules.php @@ -0,0 +1,11 @@ + + */ + public static function permissions(): array; +} diff --git a/src/Shared/Domain/Module/ModuleRegistry.php b/src/Shared/Domain/Module/ModuleRegistry.php new file mode 100644 index 0000000..894b6af --- /dev/null +++ b/src/Shared/Domain/Module/ModuleRegistry.php @@ -0,0 +1,25 @@ + $moduleClasses + * + * @return list + */ + public static function ids(array $moduleClasses): array + { + $ids = []; + foreach ($moduleClasses as $moduleClass) { + if (is_a($moduleClass, ModuleInterface::class, true)) { + $ids[] = $moduleClass::id(); + } + } + + return $ids; + } +} diff --git a/src/Shared/Infrastructure/ApiPlatform/Resource/ModulesResource.php b/src/Shared/Infrastructure/ApiPlatform/Resource/ModulesResource.php new file mode 100644 index 0000000..b00fd3a --- /dev/null +++ b/src/Shared/Infrastructure/ApiPlatform/Resource/ModulesResource.php @@ -0,0 +1,28 @@ + ['modules:read']], + provider: ModulesProvider::class, + ), + ], +)] +final class ModulesResource +{ + /** + * @var list + */ + #[Groups(['modules:read'])] + public array $modules = []; +} diff --git a/src/Shared/Infrastructure/ApiPlatform/State/ModulesProvider.php b/src/Shared/Infrastructure/ApiPlatform/State/ModulesProvider.php new file mode 100644 index 0000000..b5204b7 --- /dev/null +++ b/src/Shared/Infrastructure/ApiPlatform/State/ModulesProvider.php @@ -0,0 +1,30 @@ + $classes */ + $classes = require $this->projectDir.'/config/modules.php'; + + $dto = new ModulesResource(); + $dto->modules = ModuleRegistry::ids($classes); + + return $dto; + } +} diff --git a/tests/Functional/Shared/ModulesEndpointTest.php b/tests/Functional/Shared/ModulesEndpointTest.php new file mode 100644 index 0000000..9279ca5 --- /dev/null +++ b/tests/Functional/Shared/ModulesEndpointTest.php @@ -0,0 +1,24 @@ +request('GET', '/api/modules'); + + self::assertResponseIsSuccessful(); + $data = json_decode($client->getResponse()->getContent(), true); + self::assertArrayHasKey('modules', $data); + self::assertIsArray($data['modules']); + } +} diff --git a/tests/Unit/Shared/Module/ModuleRegistryTest.php b/tests/Unit/Shared/Module/ModuleRegistryTest.php new file mode 100644 index 0000000..a5ea1aa --- /dev/null +++ b/tests/Unit/Shared/Module/ModuleRegistryTest.php @@ -0,0 +1,81 @@ +