feat(modules) : expose GET /api/modules and module registry
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Shared\Domain\Module;
|
||||
|
||||
/**
|
||||
* Implemented by every `*Module` declaration class. The set of active modules
|
||||
* is listed in config/modules.php and exposed via GET /api/modules.
|
||||
*/
|
||||
interface ModuleInterface
|
||||
{
|
||||
public static function id(): string;
|
||||
|
||||
public static function label(): string;
|
||||
|
||||
public static function isRequired(): bool;
|
||||
|
||||
/**
|
||||
* @return list<array{code: string, label: string}>
|
||||
*/
|
||||
public static function permissions(): array;
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Shared\Domain\Module;
|
||||
|
||||
final class ModuleRegistry
|
||||
{
|
||||
/**
|
||||
* @param list<class-string> $moduleClasses
|
||||
*
|
||||
* @return list<string>
|
||||
*/
|
||||
public static function ids(array $moduleClasses): array
|
||||
{
|
||||
$ids = [];
|
||||
foreach ($moduleClasses as $moduleClass) {
|
||||
if (is_a($moduleClass, ModuleInterface::class, true)) {
|
||||
$ids[] = $moduleClass::id();
|
||||
}
|
||||
}
|
||||
|
||||
return $ids;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Shared\Infrastructure\ApiPlatform\Resource;
|
||||
|
||||
use ApiPlatform\Metadata\ApiResource;
|
||||
use ApiPlatform\Metadata\Get;
|
||||
use App\Shared\Infrastructure\ApiPlatform\State\ModulesProvider;
|
||||
use Symfony\Component\Serializer\Attribute\Groups;
|
||||
|
||||
#[ApiResource(
|
||||
operations: [
|
||||
new Get(
|
||||
uriTemplate: '/modules',
|
||||
normalizationContext: ['groups' => ['modules:read']],
|
||||
provider: ModulesProvider::class,
|
||||
),
|
||||
],
|
||||
)]
|
||||
final class ModulesResource
|
||||
{
|
||||
/**
|
||||
* @var list<string>
|
||||
*/
|
||||
#[Groups(['modules:read'])]
|
||||
public array $modules = [];
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Shared\Infrastructure\ApiPlatform\State;
|
||||
|
||||
use ApiPlatform\Metadata\Operation;
|
||||
use ApiPlatform\State\ProviderInterface;
|
||||
use App\Shared\Domain\Module\ModuleRegistry;
|
||||
use App\Shared\Infrastructure\ApiPlatform\Resource\ModulesResource;
|
||||
use Symfony\Component\DependencyInjection\Attribute\Autowire;
|
||||
|
||||
final readonly class ModulesProvider implements ProviderInterface
|
||||
{
|
||||
public function __construct(
|
||||
#[Autowire('%kernel.project_dir%')]
|
||||
private string $projectDir,
|
||||
) {}
|
||||
|
||||
public function provide(Operation $operation, array $uriVariables = [], array $context = []): ModulesResource
|
||||
{
|
||||
/** @var list<class-string> $classes */
|
||||
$classes = require $this->projectDir.'/config/modules.php';
|
||||
|
||||
$dto = new ModulesResource();
|
||||
$dto->modules = ModuleRegistry::ids($classes);
|
||||
|
||||
return $dto;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user