safeLoad(); } $appEnv = getenv('APP_ENV') ?: 'production'; if ($appEnv !== 'production') { ini_set('display_errors', '1'); error_reporting(E_ALL); } else { ini_set('display_errors', '0'); } // --------------------------------------------------------------------------- // Migrations — cheap no-op when already current // --------------------------------------------------------------------------- try { $pdo = Connection::pdo(); (new Migrator($pdo))->migrate(); } catch (\Throwable $e) { http_response_code(500); header('Content-Type: text/plain; charset=utf-8'); echo "Database bootstrap failed.\n"; if ($appEnv !== 'production') { echo $e->getMessage() . "\n"; } exit; } // --------------------------------------------------------------------------- // Routing // --------------------------------------------------------------------------- $view = new View(APP_ROOT . '/views'); $router = new Router(); $router->get('/', function (Request $req) use ($view, $pdo): Response { $version = (int) $pdo->query('SELECT COALESCE(MAX(version), 0) FROM schema_version')->fetchColumn(); return Response::html($view->render('home', [ 'title' => 'Sprint Planner', 'schemaVersion' => $version, 'dbPath' => Connection::path(), 'appEnv' => $appEnv, ])); }); $router->get('/healthz', function (): Response { return Response::text('ok'); }); // --------------------------------------------------------------------------- // Dispatch // --------------------------------------------------------------------------- $request = Request::fromGlobals(); $response = $router->dispatch($request); $response->send();