Files
KSP_project/topology_api/routes/snapshot.py
T
ArmorandClaude 772f0f78f6 feat(topology): M2 - API-driven demo page with layout tables and dynamic rendering
- Add diagram_layouts and diagram_nodes tables
- Seed layout coordinates extracted from SVG
- Extend snapshot API to return layout data
- Rewrite demo page to fetch from API dynamically
- Support ?mission= and ?at= URL parameters
- Modal details populated from database component data
- Show/hide nodes based on component existence at snapshot time

Co-Authored-By: Claude <noreply@anthropic.com>
2026-07-09 21:06:13 +08:00

66 lines
2.0 KiB
Python

# topology_api/routes/snapshot.py
from flask import Blueprint, request, jsonify
from topology_api.queries.snapshot_queries import (
resolve_snapshot_time, fetch_snapshot, fetch_layout,
)
snapshot_bp = Blueprint("snapshot", __name__)
@snapshot_bp.route("/api/v1/bases/<base_code>/snapshot")
def get_snapshot(base_code):
if base_code != "guanghan":
return jsonify({
"error": "base_not_found",
"message": f"Base '{base_code}' not found. Only 'guanghan' is available.",
}), 404
requested_mission = request.args.get("mission")
requested_at = request.args.get("at")
snapshot_at, anchor_source = resolve_snapshot_time(
requested_mission=requested_mission,
requested_at=requested_at,
)
if anchor_source == "mission_not_found":
return jsonify({
"error": "mission_not_found",
"message": f"Mission '{requested_mission}' not found.",
}), 404
if anchor_source == "mission_has_no_timed_event":
return jsonify({
"error": "mission_has_no_timed_event",
"message": f"Mission '{requested_mission}' has no timed events.",
}), 409
if anchor_source == "no_events":
return jsonify({
"base": {"code": "guanghan", "name": "广寒基地"},
"query": {
"requestedAt": requested_at,
"requestedMission": requested_mission,
"snapshotAt": None,
"anchorSource": "no_events",
},
"components": [],
"connections": [],
})
data = fetch_snapshot(snapshot_at)
layout = fetch_layout()
return jsonify({
"base": data["base"],
"query": {
"requestedAt": requested_at,
"requestedMission": requested_mission,
"snapshotAt": snapshot_at,
"anchorSource": anchor_source,
},
"components": data["components"],
"connections": data["connections"],
"layout": layout,
})