"""Flask application factory for the I2P Router Console. Creates and configures the Flask app with Jinja2 templates, route blueprints, and the RouterContext adapter. Ported from net.i2p.router.web.RouterConsoleRunner. """ from __future__ import annotations import os from flask import Flask, jsonify from i2p_apps.console.context import ConsoleContext def create_app(config: dict | None = None) -> Flask: """Create the Flask console application.""" template_dir = os.path.join(os.path.dirname(__file__), "templates") app = Flask(__name__, template_folder=template_dir) if config: app.config.update(config) # Attach router context if "CONSOLE_CONTEXT" not in app.config: app.config["CONSOLE_CONTEXT"] = ConsoleContext() # Health endpoint @app.route("/health") def health(): return jsonify({"status": "ok"}) # Register blueprints from i2p_apps.console.routes.dashboard import bp as dashboard_bp from i2p_apps.console.routes.api import bp as api_bp from i2p_apps.console.routes.config import bp as config_bp from i2p_apps.console.routes.content import bp as content_bp from i2p_apps.console.routes.graphs import bp as graphs_bp app.register_blueprint(dashboard_bp) app.register_blueprint(api_bp) app.register_blueprint(config_bp) app.register_blueprint(content_bp) app.register_blueprint(graphs_bp) return app