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 @@ +