From 9ef1da53656e6ff6abc853d4cb72d180747aeda6 Mon Sep 17 00:00:00 2001
From: feger <marc.feger@hhu.de>
Date: Mon, 4 Mar 2019 14:00:33 +0100
Subject: [PATCH] Refactor GraphQl by abstracting a Adapter class

---
 api/graph.py                           |  2 +-
 api/{graphql => interface}/__init__.py |  0
 api/{graphql => interface}/graphql.py  | 36 +++++++++++++++-----------
 api/server.py                          |  5 ++--
 4 files changed, 25 insertions(+), 18 deletions(-)
 rename api/{graphql => interface}/__init__.py (100%)
 rename api/{graphql => interface}/graphql.py (71%)

diff --git a/api/graph.py b/api/graph.py
index 378057c..cffad49 100644
--- a/api/graph.py
+++ b/api/graph.py
@@ -1,7 +1,7 @@
 from neo4j import GraphDatabase
 import time
 
-from api.graphql.graphql import Discussion
+from api.interface.graphql import Discussion
 
 URL = 'jdbc:postgresql://db/discussion?user=postgres&password=FooBar'
 
diff --git a/api/graphql/__init__.py b/api/interface/__init__.py
similarity index 100%
rename from api/graphql/__init__.py
rename to api/interface/__init__.py
diff --git a/api/graphql/graphql.py b/api/interface/graphql.py
similarity index 71%
rename from api/graphql/graphql.py
rename to api/interface/graphql.py
index 266c7aa..1b854f7 100644
--- a/api/graphql/graphql.py
+++ b/api/interface/graphql.py
@@ -6,12 +6,9 @@ import requests
 from neo4j import GraphDatabase
 
 
-class GraphQl(object):
-
-    def __init__(self, protocol, host, port):
-        self.protocol = protocol
-        self.host = host
-        self.port = port
+class Adapter(object):
+    def __init__(self, url):
+        self.url = url
 
     @staticmethod
     def _json_to_dict(col):
@@ -21,10 +18,9 @@ class GraphQl(object):
             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)
+    def request(self):
         try:
-            response = requests.get(url)
+            response = requests.get(self.url)
         except requests.exceptions.ConnectionError:
             logging.error("Connection Error")
             return {}
@@ -33,10 +29,20 @@ class GraphQl(object):
         return ret
 
 
+class GraphQl(Adapter):
+
+    def __init__(self, protocol, host, port, query):
+        self.protocol = protocol
+        self.host = host
+        self.port = port
+        self.query = query
+        super().__init__("{}://{}:{}/api/v2/query?q={}".format(self.protocol, self.host, self.port, query))
+
+
 class Discussion(GraphQl):
 
-    def __init__(self, protocol, host, port, uri, user, password):
-        super().__init__(protocol, host, port)
+    def __init__(self, protocol, host, port, uri, user, password, slug):
+        super().__init__(protocol, host, port, query=self._cypher_query(slug))
         self._driver = GraphDatabase.driver(uri, auth=(user, password))
 
     def close(self):
@@ -52,8 +58,8 @@ class Discussion(GraphQl):
             }}
         """.format(slug)
 
-    def to_cypher(self, slug):
-        result = super().request(query=self._cypher_query(slug))
+    def to_cypher(self):
+        result = super().request()
         return result['issue']['completeGraphCypher']
 
     @staticmethod
@@ -63,9 +69,9 @@ class Discussion(GraphQl):
         )
         return result
 
-    def inject_to_neo(self, slug):
+    def inject_to_neo(self):
         t1 = time.time()
-        query = self.to_cypher(slug)
+        query = self.to_cypher()
 
         with self._driver.session() as session:
             session.write_transaction(self._create_discussion, query)
diff --git a/api/server.py b/api/server.py
index 14b271e..3920c23 100644
--- a/api/server.py
+++ b/api/server.py
@@ -2,7 +2,7 @@ from flask import Flask, render_template, jsonify
 from flask_cors import CORS
 
 from api.graph import Graph
-from api.graphql.graphql import Discussion
+from api.interface.graphql import Discussion
 
 app = Flask(__name__, template_folder='.')
 CORS(app)
@@ -25,7 +25,8 @@ def load_discussion(slug):
                         port='443',
                         uri='bolt://neo:7687',
                         user='neo4j',
-                        password='neo4j').inject_to_neo(slug)
+                        password='neo4j',
+                        slug=slug).inject_to_neo()
     return jsonify(result)
 
 
-- 
GitLab