"""REST API routes — JSON endpoints for programmatic access. Provides a REST API that Java I2P lacks, enabling external tools and scripts to query router state and update configuration. """ from __future__ import annotations from flask import Blueprint, jsonify, request, current_app bp = Blueprint("api", __name__, url_prefix="/api/v1") _VALID_ACTIONS = {"restart", "shutdown", "reseed"} @bp.route("/status") def status(): """Router status summary.""" ctx = current_app.config["CONSOLE_CONTEXT"] return jsonify({ **ctx.status, "network": ctx.network_status, }) @bp.route("/peers") def peers(): """Peer list.""" return jsonify({"peers": []}) @bp.route("/tunnels") def tunnels(): """Tunnel status.""" return jsonify({"tunnels": []}) @bp.route("/config", methods=["GET"]) def get_config(): """Get current configuration.""" ctx = current_app.config["CONSOLE_CONTEXT"] return jsonify(ctx.get_all_properties()) @bp.route("/config", methods=["POST"]) def set_config(): """Update configuration properties.""" ctx = current_app.config["CONSOLE_CONTEXT"] data = request.get_json(silent=True) or {} for key, value in data.items(): ctx.set_property(key, str(value)) return jsonify({"status": "ok", "updated": len(data)}) @bp.route("/router/", methods=["POST"]) def router_action(action: str): """Perform a router action (restart/shutdown/reseed).""" if action not in _VALID_ACTIONS: return jsonify({"error": f"Invalid action: {action}"}), 400 return jsonify({"status": "ok", "action": action})