from flask import Blueprint, request, jsonify from sqlalchemy.orm import Session import api from api import etag_response from db import get_db from db.models.Markdown import Markdown from db.models.Path import Path from api import limiter import logging logger = logging.getLogger(__name__) tree_bp = Blueprint('tree', __name__, url_prefix='/api/tree') def build_tree(db: Session, parent_id: int = None): path_nodes = db.query(Path).filter(Path.parent_id == parent_id).all() md_nodes = db.query( Markdown.id, Markdown.title, Markdown.order, Markdown.shortcut, Markdown.setting_id ).filter(Markdown.path_id == parent_id).all() t0 = [ { "id": node.id, "title": node.title, "order": node.order, "setting_id": node.setting_id, "type": "markdown" } for node in md_nodes ] t1 = [ {**node.to_dict(), "type": "path", "children": build_tree(db, node.id)} for node in path_nodes ] for node in t1: for child in node["children"]: if "title" in child.keys() and child["title"] == "index": node["index"] = True break return t0 + t1 @tree_bp.route('/', methods=['GET']) @limiter.limit(api.get_rate_limit) @etag_response def get_tree(): with get_db() as session: children = build_tree(session, 1) root = session.query(Path).get(1) return jsonify( { **root.to_dict(), "type": "path", "index": any("title" in child.keys() and child["title"] == "index" for child in children), "children": children } ), 200