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