diff --git a/api/app.py b/api/app.py index b793e2e..f45d87e 100644 --- a/api/app.py +++ b/api/app.py @@ -9,7 +9,7 @@ import os import importlib.util load_dotenv() -app = Flask(__name__) +app = Flask(__name__, static_folder='static', template_folder='templates') app.wsgi_app = ProxyFix(app.wsgi_app) logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') @@ -58,5 +58,9 @@ def sitemap(): def render_member(): return render_template('render_member.html') +@app.route('/render_network') +def render_network(): + return render_template('render_network.html') + if __name__ == '__main__': app.run(debug=True) diff --git a/api/endpoints/nodes.py b/api/endpoints/nodes.py index e71d76d..8a4f5d9 100644 --- a/api/endpoints/nodes.py +++ b/api/endpoints/nodes.py @@ -1,4 +1,3 @@ -# endpoints/nodes.py from flask import Blueprint, request, jsonify from app import get_driver, neo4j_logger @@ -13,35 +12,38 @@ def nodes(): def get_nodes(): node_type = request.args.get('type') - if not node_type: return jsonify({"error": "Node type is required"}), 400 - # Get the filter parameter filter_property = request.args.get('filter') - driver = get_driver() - with driver.session() as session: - query = f"MATCH (n:{node_type}) RETURN n" - neo4j_logger.info(f"Executing query: {query}") - nodes = session.run(query) - # Convert the nodes to a list of dictionaries - nodes_list = [ - { - 'id': record['n'].id, - 'labels': list(record['n'].labels), - **{key: value for key, value in record['n'].items()} - } - for record in nodes - ] + try: + with driver.session() as session: + query = f"MATCH (n:{node_type}) RETURN n" + neo4j_logger.info(f"Executing query: {query}") + nodes = session.run(query) + nodes_list = [ + { + 'id': record['n'].id, + 'labels': list(record['n'].labels), + **{key: value for key, value in record['n'].items()} + } + for record in nodes + ] - if filter_property: - # Filter the results to only include the specified property - filtered_nodes_list = [{filter_property: node.get(filter_property)} for node in nodes_list] - return jsonify({"nodes": filtered_nodes_list}) + if filter_property: + filtered_nodes_list = [] + for node in nodes_list: + if filter_property in node: + filtered_nodes_list.append({filter_property: node[filter_property]}) + return jsonify({"nodes": filtered_nodes_list}) - return jsonify({"nodes": nodes_list}) + return jsonify({"nodes": nodes_list}) + + except Exception as e: + neo4j_logger.error(f"Error interacting with Neo4j: {e}") + return jsonify({"error": "An error occurred while interacting with the database"}), 500 def create_node(): data = request.get_json() @@ -56,15 +58,19 @@ def create_node(): query = f"CREATE (n:{node_type} {{{properties}}}) RETURN n" driver = get_driver() - with driver.session() as session: - neo4j_logger.info(f"Executing query: {query} with data: {data}") - result = session.run(query, **data) + try: + with driver.session() as session: + neo4j_logger.info(f"Executing query: {query} with data: {data}") + result = session.run(query, **data) - # Convert the created node to a dictionary - new_node = { - 'id': result.single()['n'].id, - 'labels': list(result.single()['n'].labels), - **{key: value for key, value in result.single()['n'].items()} - } + new_node = { + 'id': result.single()['n'].id, + 'labels': list(result.single()['n'].labels), + **{key: value for key, value in result.single()['n'].items()} + } - return jsonify(new_node), 201 + return jsonify(new_node), 201 + + except Exception as e: + neo4j_logger.error(f"Error interacting with Neo4j: {e}") + return jsonify({"error": "An error occurred while interacting with the database"}), 500 diff --git a/api/endpoints/person_network.py b/api/endpoints/person_network.py new file mode 100644 index 0000000..84cdda6 --- /dev/null +++ b/api/endpoints/person_network.py @@ -0,0 +1,60 @@ +# endpoints/person_network.py + +from flask import Blueprint, jsonify +from app import get_driver, neo4j_logger + +bp = Blueprint('network', __name__) + +@bp.route('/person_network', methods=['GET']) +def person_network(): + driver = get_driver() + + try: + with driver.session() as session: + query = """ + MATCH (p:Person)-[r]->(n) + RETURN p, r, n + """ + result = session.run(query) + + nodes = {} + links = [] + + for record in result: + person_node = record['p'] + relationship = record['r'] + connected_node = record['n'] + + # Add Person node if not already added + person_id = person_node.id + if person_id not in nodes: + properties = {key: value for key, value in person_node.items()} + properties['id'] = person_id + nodes[person_id] = { + **properties, + "group": 1 # Group for Person + } + + # Add connected node if not already added + connected_id = connected_node.id + if connected_id not in nodes: + properties = {key: value for key, value in connected_node.items()} + properties['id'] = connected_id + nodes[connected_id] = { + **properties, + "group": 2 # Group for other nodes (e.g., Organization, Position) + } + + # Add link + links.append({ + "source": person_id, + "target": connected_id, + "type": relationship.type, + "rel_properties": {key: value for key, value in relationship.items()} + }) + + return jsonify({"nodes": list(nodes.values()), "links": links}) + + except Exception as e: + neo4j_logger.error(f"Error interacting with Neo4j: {e}") + return jsonify({"error": "An error occurred while interacting with the database"}), 500 diff --git a/api/endpoints/person_routes.py b/api/person_routes.py similarity index 100% rename from api/endpoints/person_routes.py rename to api/person_routes.py diff --git a/api/templates/render_member.html b/api/templates/render_member.html index df448b4..c53d6bc 100644 --- a/api/templates/render_member.html +++ b/api/templates/render_member.html @@ -1,128 +1,68 @@ -
-