policymap/api/endpoints/nodes.py

71 lines
2.2 KiB
Python

# endpoints/nodes.py
from flask import Blueprint, request, jsonify
from app import get_driver, neo4j_logger
bp = Blueprint('nodes', __name__)
@bp.route('/nodes', methods=['GET', 'POST'])
def nodes():
if request.method == 'GET':
return get_nodes()
elif request.method == 'POST':
return create_node()
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
]
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})
return jsonify({"nodes": nodes_list})
def create_node():
data = request.get_json()
if not data:
return jsonify({"error": "No data provided"}), 400
node_type = data.pop('type', None)
if not node_type:
return jsonify({"error": "Node type is required in JSON data"}), 400
properties = ', '.join([f'{key}: "${key}"' for key in data])
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)
# 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()}
}
return jsonify(new_node), 201