first commit
Build and deploy / build-and-push (push) Successful in 17s
Build and deploy / deploy (push) Successful in 10s

This commit is contained in:
william
2026-08-21 16:23:49 +02:00
committed by william
commit 3f4ebc4527
248 changed files with 10180 additions and 0 deletions
+9
View File
@@ -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,
)
+17
View File
@@ -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})
+11
View File
@@ -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})
+21
View File
@@ -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))
+11
View File
@@ -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})
+12
View File
@@ -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})
+18
View File
@@ -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})
+13
View File
@@ -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))