| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- <?php
- declare(strict_types=1);
- namespace App\App;
- use App\Application\Admin\MeController;
- use App\Application\Auth\AuthController;
- use App\Domain\Auth\Role;
- use App\Domain\Auth\TokenHasher;
- use App\Domain\Auth\TokenIssuer;
- use App\Infrastructure\Auth\RoleMappingRepository;
- use App\Infrastructure\Auth\ServiceTokenBootstrap;
- use App\Infrastructure\Auth\TokenRepository;
- use App\Infrastructure\Auth\UserRepository;
- use App\Infrastructure\Db\ConnectionFactory;
- use App\Infrastructure\Http\JsonErrorHandler;
- use App\Infrastructure\Http\Middleware\ImpersonationMiddleware;
- use App\Infrastructure\Http\Middleware\TokenAuthenticationMiddleware;
- use function DI\autowire;
- use DI\ContainerBuilder;
- use function DI\factory;
- use Doctrine\DBAL\Connection;
- use Monolog\Formatter\JsonFormatter;
- use Monolog\Handler\StreamHandler;
- use Monolog\Logger;
- use Psr\Container\ContainerInterface;
- use Psr\Http\Message\ResponseFactoryInterface;
- use Psr\Log\LoggerInterface;
- use Slim\Psr7\Factory\ResponseFactory;
- /**
- * Builds the api's DI container.
- *
- * Adds in M03: token domain helpers, repositories, middlewares, the JSON
- * error handler, and the controllers. Wiring is autowire-friendly except
- * where we need to inject a primitive (the OIDC default Role) or pull a
- * value out of `settings`.
- */
- final class Container
- {
- /**
- * @param array<string, mixed>|null $settings Optional override (tests pass in fixtures).
- */
- public static function build(?array $settings = null): ContainerInterface
- {
- $settings ??= require __DIR__ . '/../../config/settings.php';
- $builder = new ContainerBuilder();
- $builder->useAutowiring(true);
- $builder->addDefinitions([
- 'settings' => $settings,
- 'settings.db' => $settings['db'],
- 'settings.ui_service_token' => $settings['ui_service_token'] ?? '',
- 'settings.app_env' => $settings['app_env'] ?? 'production',
- 'settings.log_level' => $settings['log_level'] ?? \Monolog\Level::Info,
- 'settings.oidc_default_role' => $settings['oidc_default_role'] ?? Role::Viewer,
- ConnectionFactory::class => factory(static function (ContainerInterface $c): ConnectionFactory {
- /** @var array{driver: string, sqlite_path: string, mysql_host: string, mysql_port: int, mysql_database: string, mysql_username: string, mysql_password: string} $db */
- $db = $c->get('settings.db');
- return new ConnectionFactory($db);
- }),
- Connection::class => factory(static function (ContainerInterface $c): Connection {
- /** @var ConnectionFactory $factory */
- $factory = $c->get(ConnectionFactory::class);
- return $factory->create();
- }),
- LoggerInterface::class => factory(static function (ContainerInterface $c): LoggerInterface {
- $logger = new Logger('api');
- /** @var \Monolog\Level $level */
- $level = $c->get('settings.log_level');
- $handler = new StreamHandler('php://stdout', $level);
- $handler->setFormatter(new JsonFormatter());
- $logger->pushHandler($handler);
- return $logger;
- }),
- ResponseFactoryInterface::class => autowire(ResponseFactory::class),
- TokenHasher::class => autowire(),
- TokenIssuer::class => autowire(),
- TokenRepository::class => autowire(),
- RoleMappingRepository::class => autowire(),
- UserRepository::class => autowire(),
- ServiceTokenBootstrap::class => autowire(),
- TokenAuthenticationMiddleware::class => autowire(),
- ImpersonationMiddleware::class => autowire(),
- JsonErrorHandler::class => factory(static function (ContainerInterface $c): JsonErrorHandler {
- /** @var ResponseFactoryInterface $factory */
- $factory = $c->get(ResponseFactoryInterface::class);
- /** @var LoggerInterface $logger */
- $logger = $c->get(LoggerInterface::class);
- return new JsonErrorHandler(
- $factory,
- $logger,
- $c->get('settings.app_env') === 'development',
- );
- }),
- AuthController::class => factory(static function (ContainerInterface $c): AuthController {
- /** @var Role|null $role */
- $role = $c->get('settings.oidc_default_role');
- /** @var UserRepository $users */
- $users = $c->get(UserRepository::class);
- return new AuthController($users, $role ?? Role::Viewer);
- }),
- MeController::class => autowire(),
- ]);
- return $builder->build();
- }
- }
|