From 66bbd08a3f06bfe4e36bd0ba54cb5b89bd55ac26 Mon Sep 17 00:00:00 2001 From: feger <marc.feger@hhu.de> Date: Tue, 26 Feb 2019 20:27:11 +0100 Subject: [PATCH] Add route to load discussion-graph of live-version by slug --- api/graph.py | 13 ++++++++ api/graphql/__init__.py | 0 api/graphql/graphql.py | 72 +++++++++++++++++++++++++++++++++++++++++ api/requirements.txt | 3 +- api/server.py | 16 +++++++-- 5 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 api/graphql/__init__.py create mode 100644 api/graphql/graphql.py diff --git a/api/graph.py b/api/graph.py index 1507555..378057c 100644 --- a/api/graph.py +++ b/api/graph.py @@ -1,6 +1,8 @@ from neo4j import GraphDatabase import time +from api.graphql.graphql import Discussion + URL = 'jdbc:postgresql://db/discussion?user=postgres&password=FooBar' @@ -158,3 +160,14 @@ class Graph(object): "DETACH DELETE a" ) return result + + @staticmethod + def _load_discussion(tx, slug): + result = tx.run( + Discussion( + protocol='https', + host='dbas.cs.uni-duesseldorf.de', + port=443 + ).to_cypher(slug) + ) + return result diff --git a/api/graphql/__init__.py b/api/graphql/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/api/graphql/graphql.py b/api/graphql/graphql.py new file mode 100644 index 0000000..266c7aa --- /dev/null +++ b/api/graphql/graphql.py @@ -0,0 +1,72 @@ +import json +import logging +import time + +import requests +from neo4j import GraphDatabase + + +class GraphQl(object): + + def __init__(self, protocol, host, port): + self.protocol = protocol + self.host = host + self.port = port + + @staticmethod + def _json_to_dict(col): + if isinstance(col, dict): + return col + elif isinstance(col, bytes): + col = col.decode("utf-8") + return json.loads(col) + + def request(self, query): + url = "{}://{}:{}/api/v2/query?q={}".format(self.protocol, self.host, self.port, query) + try: + response = requests.get(url) + except requests.exceptions.ConnectionError: + logging.error("Connection Error") + return {} + + ret = self._json_to_dict(response.content) + return ret + + +class Discussion(GraphQl): + + def __init__(self, protocol, host, port, uri, user, password): + super().__init__(protocol, host, port) + self._driver = GraphDatabase.driver(uri, auth=(user, password)) + + def close(self): + self._driver.close() + + @staticmethod + def _cypher_query(slug): + return """ + query{{ + issue(slug: "{0}"){{ + completeGraphCypher + }} + }} + """.format(slug) + + def to_cypher(self, slug): + result = super().request(query=self._cypher_query(slug)) + return result['issue']['completeGraphCypher'] + + @staticmethod + def _create_discussion(tx, query): + result = tx.run( + query + ) + return result + + def inject_to_neo(self, slug): + t1 = time.time() + query = self.to_cypher(slug) + + with self._driver.session() as session: + session.write_transaction(self._create_discussion, query) + return {"total": time.time() - t1} diff --git a/api/requirements.txt b/api/requirements.txt index 5c69b29..2ad5b7c 100644 --- a/api/requirements.txt +++ b/api/requirements.txt @@ -1,3 +1,4 @@ Flask==0.10.1 flask-cors==3.0.7 -neo4j==1.7.1 \ No newline at end of file +neo4j==1.7.1 +requests==2.18.4 \ No newline at end of file diff --git a/api/server.py b/api/server.py index 6d5ede2..14b271e 100644 --- a/api/server.py +++ b/api/server.py @@ -2,20 +2,32 @@ from flask import Flask, render_template, jsonify from flask_cors import CORS from api.graph import Graph +from api.graphql.graphql import Discussion app = Flask(__name__, template_folder='.') CORS(app) @app.route('/<file>') -def root(file): +def load_html(file): return render_template('html/' + file) @app.route('/load') -def test(): +def load_graph(): return jsonify(Graph(uri='bolt://neo:7687', user='neo4j', password='neo4j').load()) +@app.route('/load/<slug>') +def load_discussion(slug): + result = Discussion(protocol='https', + host='dbas.cs.uni-duesseldorf.de', + port='443', + uri='bolt://neo:7687', + user='neo4j', + password='neo4j').inject_to_neo(slug) + return jsonify(result) + + if __name__ == '__main__': app.run(debug=True, host="0.0.0.0", port=5000) -- GitLab