diff --git a/api/app.py b/api/app.py index d1ca721..b793e2e 100644 --- a/api/app.py +++ b/api/app.py @@ -1,6 +1,6 @@ # api/__init__.py -from flask import Flask, jsonify, request +from flask import Flask, jsonify, request, render_template import logging from dotenv import load_dotenv from neo4j import GraphDatabase @@ -54,5 +54,9 @@ def sitemap(): }) return jsonify(routes) +@app.route('/render_member') +def render_member(): + return render_template('render_member.html') + if __name__ == '__main__': app.run(debug=True) diff --git a/api/endpoints/list_members.py b/api/endpoints/list_members.py index cb76009..fe8568b 100644 --- a/api/endpoints/list_members.py +++ b/api/endpoints/list_members.py @@ -5,9 +5,10 @@ from app import get_driver, neo4j_logger bp = Blueprint('list_members', __name__) +@bp.route('/list_members', methods=['GET']) @bp.route('/list_members', methods=['GET']) def list_members(): - member_name = request.form.get('member_name') + member_name = request.args.get('member_name') if not member_name: return jsonify({"error": "No member name provided"}), 400 @@ -18,31 +19,56 @@ def list_members(): with driver.session() as session: result = session.run(""" MATCH (m:Person {name: $memberName})-[*]-(n) - RETURN m, n, collect(DISTINCT (m)-[r]->(n)) + WITH m, n, COLLECT(DISTINCT (m)-[r]->(n)) AS rels + RETURN { + nodes: [ + m, + n + ], + links: [ + UNWIND rels AS rel + RETURN { + source: startNode(rel).id, + target: endNode(rel).id, + type: type(rel) + } + ] + } """, memberName=member_name) + record = result.single() + + if not record: + return jsonify({"error": "No data found for the provided member name"}), 404 + + # Extract nodes and links from the returned record + nodes_data = [] + links_data = [] + + nodes_record = record['nodes'] + links_record = record['links'] + + # Process nodes + for node in nodes_record: + nodes_data.append({ + "id": node.id, + "label": list(node.labels)[0] if node.labels else "", + "name": node.get("name", "") + }) + + # Process links + for link in links_record: + links_data.append({ + "source": link['source'], + "target": link['target'], + "type": link['type'] + }) + data = { - "nodes": [], - "links": [] + "nodes": nodes_data, + "links": links_data } - for record in result: - node1 = record["m"] - nodes = [record["n"]] - - # Add the first node - if {"id": node1.id, "label": node1.labels[0], "name": node1.get("name")} not in data["nodes"]: - data["nodes"].append({"id": node1.id, "label": node1.labels[0], "name": node1.get("name")}) - - # Add other nodes and links - for node2 in nodes: - if {"id": node2.id, "label": node2.labels[0], "name": node2.get("name")} not in data["nodes"]: - data["nodes"].append({"id": node2.id, "label": node2.labels[0], "name": node2.get("name")}) - - for rel in record[2]: - if {"source": rel.start_node.id, "target": rel.end_node.id, "type": rel.type} not in data["links"]: - data["links"].append({"source": rel.start_node.id, "target": rel.end_node.id, "type": rel.type}) - return jsonify(data) except Exception as e: diff --git a/api/templates/render_member.html b/api/templates/render_member.html index e125b5b..df448b4 100644 --- a/api/templates/render_member.html +++ b/api/templates/render_member.html @@ -25,7 +25,7 @@