57 lines
1.6 KiB
Python
57 lines
1.6 KiB
Python
from __future__ import annotations
|
|
|
|
import os
|
|
from pathlib import Path
|
|
|
|
from flask import Flask, jsonify, request, send_from_directory
|
|
|
|
from compiler import CompileError, compile_graph
|
|
|
|
|
|
def create_app() -> Flask:
|
|
app = Flask(
|
|
__name__,
|
|
static_folder="static",
|
|
static_url_path="/",
|
|
)
|
|
|
|
@app.get("/")
|
|
def spa_index():
|
|
static_dir = Path(app.static_folder or "static")
|
|
return send_from_directory(static_dir, "index.html")
|
|
|
|
@app.get("/<path:path>")
|
|
def spa_assets(path: str):
|
|
static_dir = Path(app.static_folder or "static")
|
|
file_path = static_dir / path
|
|
if file_path.exists() and file_path.is_file():
|
|
return send_from_directory(static_dir, path)
|
|
return send_from_directory(static_dir, "index.html")
|
|
|
|
@app.post("/api/compile")
|
|
def api_compile():
|
|
payload = request.get_json(silent=True)
|
|
if not isinstance(payload, dict):
|
|
return jsonify({"ok": False, "error": "request body must be a JSON object"}), 400
|
|
|
|
graph = payload.get("graph")
|
|
if not isinstance(graph, dict):
|
|
return jsonify({"ok": False, "error": "missing 'graph' object"}), 400
|
|
|
|
try:
|
|
yml = compile_graph(graph)
|
|
except CompileError as e:
|
|
return jsonify({"ok": False, "error": str(e)}), 400
|
|
except Exception:
|
|
return jsonify({"ok": False, "error": "internal error"}), 500
|
|
|
|
return jsonify({"ok": True, "yaml": yml})
|
|
|
|
return app
|
|
|
|
|
|
if __name__ == "__main__":
|
|
port = int(os.environ.get("PORT", "7860"))
|
|
app = create_app()
|
|
app.run(host="0.0.0.0", port=port, debug=True)
|