"""Blog app fragment endpoints. Exposes HTML fragments at ``/internal/fragments/`` for consumption by other coop apps via the fragment client. """ from __future__ import annotations from quart import Blueprint, Response, g, render_template, request from shared.infrastructure.fragments import FRAGMENT_HEADER from shared.services.navigation import get_navigation_tree def register(): bp = Blueprint("fragments", __name__, url_prefix="/internal/fragments") # Registry of fragment handlers: type -> async callable returning HTML str _handlers: dict[str, object] = {} @bp.before_request async def _require_fragment_header(): if not request.headers.get(FRAGMENT_HEADER): return Response("", status=403) @bp.get("/") async def get_fragment(fragment_type: str): handler = _handlers.get(fragment_type) if handler is None: return Response("", status=200, content_type="text/html") html = await handler() return Response(html, status=200, content_type="text/html") # --- nav-tree fragment --- async def _nav_tree_handler(): app_name = request.args.get("app_name", "") path = request.args.get("path", "/") first_seg = path.strip("/").split("/")[0] menu_items = await get_navigation_tree(g.s) return await render_template( "fragments/nav_tree.html", menu_items=menu_items, frag_app_name=app_name, frag_first_seg=first_seg, ) _handlers["nav-tree"] = _nav_tree_handler # Store handlers dict on blueprint so app code can register handlers bp._fragment_handlers = _handlers return bp