first commit
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
from . import (
|
||||
flow_node_add,
|
||||
flow_node_move,
|
||||
flow_node_delete,
|
||||
flow_edge_add,
|
||||
flow_edge_delete,
|
||||
flow_node_run_data,
|
||||
runtime_payload,
|
||||
)
|
||||
@@ -0,0 +1,17 @@
|
||||
from flask import request, jsonify
|
||||
|
||||
import screens
|
||||
|
||||
from core.flask_app import app
|
||||
|
||||
|
||||
@app.route("/game/<slug>/screens/<int:screen_id>/flow/edges/add", methods=["POST"])
|
||||
def flow_edge_add(slug, screen_id):
|
||||
payload = request.get_json(force=True) or {}
|
||||
try:
|
||||
from_node_id = int(payload["from_node_id"])
|
||||
to_node_id = int(payload["to_node_id"])
|
||||
except (KeyError, TypeError, ValueError):
|
||||
return jsonify({"error": "nœuds invalides"}), 400
|
||||
edge_id = screens.add_flow_edge(slug, screen_id, from_node_id, payload.get("from_port", "out"), to_node_id)
|
||||
return jsonify({"id": edge_id})
|
||||
@@ -0,0 +1,11 @@
|
||||
from flask import jsonify
|
||||
|
||||
import screens
|
||||
|
||||
from core.flask_app import app
|
||||
|
||||
|
||||
@app.route("/game/<slug>/flow/edges/<int:edge_id>/delete", methods=["POST"])
|
||||
def flow_edge_delete(slug, edge_id):
|
||||
screens.delete_flow_edge(slug, edge_id)
|
||||
return jsonify({"ok": True})
|
||||
@@ -0,0 +1,21 @@
|
||||
from flask import request, jsonify
|
||||
|
||||
import screens
|
||||
|
||||
from core.flask_app import app
|
||||
|
||||
|
||||
@app.route("/game/<slug>/screens/<int:screen_id>/flow/nodes/add", methods=["POST"])
|
||||
def flow_node_add(slug, screen_id):
|
||||
"""Ajoute un nœud (Déclencheur / Condition / Action) au graphe de
|
||||
logique de cet écran — appelé en AJAX depuis le panneau "Logique de la
|
||||
scène", pour que poser un nœud ne recharge jamais toute la page."""
|
||||
payload = request.get_json(force=True) or {}
|
||||
node_type = payload.get("node_type")
|
||||
if node_type not in ("trigger", "condition", "action"):
|
||||
return jsonify({"error": "type de nœud invalide"}), 400
|
||||
x = float(payload.get("x", 40))
|
||||
y = float(payload.get("y", 40))
|
||||
fields = {k: v for k, v in payload.items() if k not in ("node_type", "x", "y")}
|
||||
node_id = screens.add_flow_node(slug, screen_id, node_type, x=x, y=y, **fields)
|
||||
return jsonify(screens.get_flow_node(slug, node_id))
|
||||
@@ -0,0 +1,11 @@
|
||||
from flask import jsonify
|
||||
|
||||
import screens
|
||||
|
||||
from core.flask_app import app
|
||||
|
||||
|
||||
@app.route("/game/<slug>/flow/nodes/<int:node_id>/delete", methods=["POST"])
|
||||
def flow_node_delete(slug, node_id):
|
||||
screens.delete_flow_node(slug, node_id)
|
||||
return jsonify({"ok": True})
|
||||
@@ -0,0 +1,12 @@
|
||||
from flask import request, jsonify
|
||||
|
||||
import screens
|
||||
|
||||
from core.flask_app import app
|
||||
|
||||
|
||||
@app.route("/game/<slug>/flow/nodes/<int:node_id>/move", methods=["POST"])
|
||||
def flow_node_move(slug, node_id):
|
||||
payload = request.get_json(force=True) or {}
|
||||
screens.move_flow_node(slug, node_id, float(payload.get("x", 0)), float(payload.get("y", 0)))
|
||||
return jsonify({"ok": True})
|
||||
@@ -0,0 +1,18 @@
|
||||
from flask import jsonify
|
||||
|
||||
import screens
|
||||
|
||||
from core.flask_app import app
|
||||
|
||||
|
||||
@app.route("/game/<slug>/flow/nodes/<int:node_id>/run-data", methods=["POST"])
|
||||
def flow_node_run_data(slug, node_id):
|
||||
"""Exécuté côté serveur au moment du clic, en mode jouable, pour un nœud
|
||||
Action de type "Modifier une donnée d'un objet" — identique au
|
||||
fonctionnement de l'ancienne action_run_data, mais lit sa config depuis
|
||||
un nœud du graphe de logique plutôt que depuis la table _actions."""
|
||||
node = screens.get_flow_node(slug, node_id)
|
||||
if not node or node.get("node_type") != "action" or node.get("action_type") != "modifier_donnee":
|
||||
return jsonify({"ok": False}), 400
|
||||
ok = screens.apply_data_action(slug, node)
|
||||
return jsonify({"ok": ok})
|
||||
@@ -0,0 +1,13 @@
|
||||
from flask import jsonify
|
||||
|
||||
import screens
|
||||
|
||||
from core.flask_app import app
|
||||
|
||||
|
||||
@app.route("/game/<slug>/runtime-payload")
|
||||
def runtime_payload(slug):
|
||||
"""Utilisé par le mode jouable pour se remettre à jour après une action
|
||||
qui a modifié une donnée d'objet (ex: un Répéteur affichant cet objet
|
||||
doit refléter la nouvelle valeur sans recharger toute la page)."""
|
||||
return jsonify(screens.full_game_payload(slug))
|
||||
Reference in New Issue
Block a user