From c1a7c441d24a600a41b110d2e6a90b4d2494f483682c7fa691e96b9a23d83693 Mon Sep 17 00:00:00 2001 From: Moses Rolston <moses.rolston@gmail.com> Date: Wed, 12 Mar 2025 16:18:30 -0700 Subject: [PATCH] i don't remember making any changes --- api/app.py | 6 ++- api/endpoints/list_members.py | 68 ++++++++++++++++++++++---------- api/templates/render_member.html | 4 +- 3 files changed, 54 insertions(+), 24 deletions(-) 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 @@ <script> // Fetch member names from Neo4j - fetch('/list_members/get_member_names') + fetch('/get_member_names') .then(response => response.json()) .then(members => { const select = document.getElementById('memberSelect'); @@ -42,7 +42,7 @@ console.log("Member selected:", this.value); // Log the selected member name const selectedMember = this.value; - fetch(`/list_members/render_member?member_name=${encodeURIComponent(selectedMember)}`, { + fetch(`/list_members?member_name=${encodeURIComponent(selectedMember)}`, { method: 'GET', }) .then(response => response.json())