summaryrefslogtreecommitdiff
path: root/src/server/rz_api_rest.py
diff options
context:
space:
mode:
authorLV-426 <lv-426@taproot.org.il>2015-01-04 17:16:12 +0200
committerLV-426 <lv-426@taproot.org.il>2015-01-04 17:16:12 +0200
commitf5494d9233d6f9967c614eef23dee1f29af056c9 (patch)
tree763da6c98efe56acb342aa09d8c4866624c6f32a /src/server/rz_api_rest.py
parentf1dd537689307329dfe42c88ee2e8fda3355eb84 (diff)
rhizi_api breakup: common, rest & websocket files
Diffstat (limited to 'src/server/rz_api_rest.py')
-rw-r--r--src/server/rz_api_rest.py116
1 files changed, 116 insertions, 0 deletions
diff --git a/src/server/rz_api_rest.py b/src/server/rz_api_rest.py
new file mode 100644
index 00000000..bb5542d2
--- /dev/null
+++ b/src/server/rz_api_rest.py
@@ -0,0 +1,116 @@
+"""
+Rhizi REST web API:
+ - make use of rz_kernel for core logic execution
+ - make use of rz_api_common for common API logic
+
+"""
+from flask import Flask
+from flask import escape
+from flask import jsonify
+from flask import make_response
+from flask import redirect
+from flask import render_template
+from flask import request
+from flask import send_from_directory
+from flask import session
+from flask import url_for
+import flask
+import logging
+import traceback
+
+from model.graph import Attr_Diff
+from model.graph import Topo_Diff
+from rz_api_common import sanitize_input__attr_diff
+from rz_api_common import sanitize_input__topo_diff
+from rz_api_common import validate_obj__attr_diff
+
+
+log = logging.getLogger('rhizi')
+
+db_ctl = None # injected: DB controller
+
+def __response_wrap(data=None, error=None):
+ """
+ wrap response data/errors as dict - this should always be used when returning
+ data to allow easy return of list objects, assist in error case distinction, etc.
+ """
+ return dict(data=data, error=error)
+
+def __common_resp_handle(data=None, error=None):
+ """
+ provide common response handling
+
+ @data must be json serializable
+ @error will be serialized with str()
+ """
+ error_str = str(error) # convert any Exception objects to serializable form
+ ret_data = __response_wrap(data, error_str)
+ resp = jsonify(ret_data) # this will create a Flask Response object
+
+ resp.headers['Access-Control-Allow-Origin'] = '*'
+
+ # more response processing
+
+ return resp
+
+def diff_commit__topo():
+ """
+ REST API wrapper around diff_commit__topo():
+ - extract topo_diff from request
+ - handle success/error outcomes
+ """
+ def sanitize_input(req):
+ topo_diff_dict = request.get_json()['topo_diff']
+ topo_diff = Topo_Diff.from_json_dict(topo_diff_dict)
+
+ sanitize_input__topo_diff(topo_diff)
+ return topo_diff;
+
+ try:
+ topo_diff = sanitize_input(request)
+ except Exception as e:
+ return __common_resp_handle(error='malformed input')
+
+ try:
+ kernel = flask.current_app.kernel
+ topo_diff = kernel.diff_commit__topo(db_ctl, topo_diff)
+ topo_diff_json = topo_diff.to_json_dict()
+ return __common_resp_handle(data=topo_diff_json)
+ except Exception as e:
+ log.error(e.message)
+ log.error(traceback.print_exc())
+ return __common_resp_handle(error=e)
+
+def diff_commit__attr():
+ """
+ commit a graph attribute diff
+ """
+ def sanitize_input(req):
+ attr_diff_dict = request.get_json()['attr_diff']
+ attr_diff = Attr_Diff.from_json_dict(attr_diff_dict)
+
+ sanitize_input__attr_diff(attr_diff)
+ return attr_diff;
+
+ def on_error(e):
+ # handle DB ERRORS, eg. name attr change error
+ return __common_resp_handle(error='error occurred')
+
+ try:
+ attr_diff = sanitize_input(request)
+ validate_obj__attr_diff(attr_diff)
+ except Exception as e:
+ return __common_resp_handle(error='malformed input')
+
+ try:
+ kernel = flask.current_app.kernel
+ attr_diff = kernel.diff_commit__attr(db_ctl, attr_diff)
+ return __common_resp_handle(data=attr_diff)
+ except Exception as e:
+ log.error(e.message)
+ log.error(traceback.print_exc())
+ return __common_resp_handle(error=e)
+
+def diff_commit__vis():
+ pass
+