diff --git a/admin_app.py b/admin_app.py new file mode 100644 index 0000000..6113645 --- /dev/null +++ b/admin_app.py @@ -0,0 +1,87 @@ +import yaml +from flask import Flask, jsonify, request, Response, abort + +import build # reuse your existing static builder logic + +app = Flask(__name__) + + +def list_pages(): + """ + Return a lightweight list of pages for a sidebar etc. + Uses build.load_pages() from the existing builder. + """ + pages = build.load_pages() + result = [] + for p in pages: + result.append({ + "slug": p.get("slug", ""), + "title": p.get("title", ""), + "language": p.get("language", "de"), + }) + result.sort(key=lambda x: x["slug"]) + return result + + +@app.get("/api/pages") +def api_list_pages(): + return jsonify(list_pages()) + + +@app.get("/api/pages/") +def api_get_page(slug): + try: + page, path = build.load_page_by_slug(slug) + except FileNotFoundError: + abort(404, description="Page not found") + return jsonify(page) + + +@app.put("/api/pages/") +def api_save_page(slug): + """ + Save page JSON back as YAML. For now we trust the structure, + since the admin UI is under our control. + """ + try: + _, path = build.load_page_by_slug(slug) + except FileNotFoundError: + abort(404, description="Page not found") + + new_page = request.get_json(force=True, silent=False) + if not isinstance(new_page, dict): + abort(400, description="Expected JSON object") + + # Ensure slug consistency + new_page.setdefault("slug", slug) + + with open(path, "w", encoding="utf-8") as f: + yaml.safe_dump( + new_page, + f, + allow_unicode=True, + sort_keys=False, + width=1000, + ) + + return ("", 204) + + +@app.get("/preview//") +def preview_page(slug): + """ + Render HTML for a single page using existing Jinja templates. + No disk write: we render directly from the current YAML content. + """ + try: + page, _ = build.load_page_by_slug(slug) + except FileNotFoundError: + abort(404, description="Page not found") + + html = build.render_page(page) + return Response(html, mimetype="text/html") + + +if __name__ == "__main__": + # For development; in production we'll run this with gunicorn and Caddy as reverse proxy. + app.run(host="127.0.0.1", port=8075, debug=True)