server/sbin/hypothesis_proxy.py
changeset 0 5f4fcbc80b37
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/server/sbin/hypothesis_proxy.py	Fri Sep 14 17:57:34 2018 +0200
@@ -0,0 +1,85 @@
+'''
+Proxy server for getting hyperthesis annotation
+'''
+import os
+
+import bottle
+import requests
+from bottle import route, response
+
+app = application = bottle.Bottle()
+
+config_file_path = os.getenv('CONFIG_PATH', "hypothesis_proxy.conf")
+
+app.config.load_config(config_file_path)
+
+# From https://stackoverflow.com/a/17262900
+class EnableCors(object):
+    name = 'enable_cors'
+    api = 2
+
+    def apply(self, fn, context):
+        def _enable_cors(*args, **kwargs):
+            # set CORS headers
+            response.headers['Access-Control-Allow-Origin'] = '*'
+            response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, OPTIONS'
+            response.headers['Access-Control-Allow-Headers'] = 'Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token'
+
+            if bottle.request.method != 'OPTIONS':
+                # actual request; reply with the actual response
+                return fn(*args, **kwargs)
+
+        return _enable_cors
+
+app.install(EnableCors())
+
+@app.route('/annotations')
+def query_hypothesis():
+    '''
+    query hypothesis
+    '''
+
+    annotations_json = app.config.get('proxy.annotations_json', None)
+
+    if annotations_json and os.path.isfile(annotations_json):
+        import json
+        with open(annotations_json, 'r') as f:
+            return json.load(f)
+
+    url = app.config.get('proxy.url', 'https://h.projet-episteme.org/api/search')
+    headers = {}
+    token = app.config.get('proxy.token')
+    if token is not None:
+        headers["Authorization"] = "Bearer " + token
+
+    params = {}
+    for config_tag in ['group', 'user', 'tag', 'limit']:
+        config_val = app.config.get('proxy.%s' % config_tag)
+        if config_val is not None:
+            params[config_tag] = config_val
+
+    offset = 0
+    total = -1
+
+    rows = []
+
+    while total < 0 or offset < total:
+        #TODO: handle errors
+        res = requests.get(url, params=params, headers=headers)
+        res_json = res.json()
+        total = int(res_json['total'])
+        rows += res_json['rows']
+        offset = len(rows)
+        params['offset'] = offset
+
+    return {
+        'rows': rows,
+        'total': len(rows)
+    }
+
+
+if __name__ == "__main__":
+    app.run(
+        host=app.config.get('proxy.host', '127.0.0.1'),
+        port=int(app.config.get('proxy.port', 8888))
+    )