1
0

index.php 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. <?php
  2. declare(strict_types=1);
  3. use Monolog\Formatter\JsonFormatter;
  4. use Monolog\Handler\StreamHandler;
  5. use Monolog\Logger;
  6. use Psr\Http\Message\ResponseInterface as Response;
  7. use Psr\Http\Message\ServerRequestInterface as Request;
  8. use Slim\Factory\AppFactory;
  9. use Slim\Views\Twig;
  10. use Slim\Views\TwigMiddleware;
  11. require __DIR__ . '/../vendor/autoload.php';
  12. $appEnv = getenv('APP_ENV') ?: 'production';
  13. $logLevelName = strtoupper((string) (getenv('LOG_LEVEL') ?: 'info'));
  14. $logLevel = match ($logLevelName) {
  15. 'DEBUG' => Monolog\Level::Debug,
  16. 'NOTICE' => Monolog\Level::Notice,
  17. 'WARNING' => Monolog\Level::Warning,
  18. 'ERROR' => Monolog\Level::Error,
  19. 'CRITICAL' => Monolog\Level::Critical,
  20. default => Monolog\Level::Info,
  21. };
  22. $logger = new Logger('ui');
  23. $handler = new StreamHandler('php://stdout', $logLevel);
  24. $handler->setFormatter(new JsonFormatter());
  25. $logger->pushHandler($handler);
  26. $app = AppFactory::create();
  27. $twig = Twig::create(__DIR__ . '/../resources/views', [
  28. 'cache' => false,
  29. 'auto_reload' => $appEnv === 'development',
  30. ]);
  31. $app->add(TwigMiddleware::create($app, $twig));
  32. $app->addRoutingMiddleware();
  33. $app->addBodyParsingMiddleware();
  34. $app->addErrorMiddleware($appEnv === 'development', true, true, $logger);
  35. $app->get('/', function (Request $request, Response $response) use ($twig): Response {
  36. return $twig->render($response, 'pages/hello.twig');
  37. });
  38. $app->get('/healthz', function (Request $request, Response $response): Response {
  39. // Stub healthcheck. Later milestones extend with real api reachability checks.
  40. $payload = [
  41. 'status' => 'ok',
  42. 'api_reachable' => null,
  43. 'last_api_check_at' => null,
  44. ];
  45. $response->getBody()->write((string) json_encode($payload));
  46. return $response->withHeader('Content-Type', 'application/json');
  47. });
  48. $app->map(
  49. ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
  50. '/{routes:.+}',
  51. function (Request $request, Response $response): Response {
  52. $response->getBody()->write((string) json_encode(['error' => 'not_found']));
  53. return $response
  54. ->withHeader('Content-Type', 'application/json')
  55. ->withStatus(404);
  56. }
  57. );
  58. $app->run();