diff options
Diffstat (limited to 'ick2/controllerapi.py')
-rw-r--r-- | ick2/controllerapi.py | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/ick2/controllerapi.py b/ick2/controllerapi.py new file mode 100644 index 0000000..c2b3213 --- /dev/null +++ b/ick2/controllerapi.py @@ -0,0 +1,120 @@ +# Copyright (C) 2017 Lars Wirzenius + + +import glob +import os + + +import apifw +import yaml + + +import ick2 + + +class ControllerAPI: + + def __init__(self): + self._state = ick2.ControllerState() + + def get_state_directory(self): + return self._state.get_state_directory() + + def set_state_directory(self, dirname): + self._state.set_state_directory(dirname) + + def load_projects(self): + return self._state.load_projects() + + def find_missing_route(self, path): # pragma: no cover + return [ + { + 'method': 'POST', + 'path': '/projects', + 'callback': self.post_callback(self.post_projects), + }, + { + 'method': 'GET', + 'path': '/projects', + 'callback': self.get_callback(self.get_projects), + }, + { + 'method': 'GET', + 'path': '/projects/<project>', + 'callback': self.get_callback(self.get_project), + }, + { + 'method': 'PUT', + 'path': '/projects/<project>', + 'callback': self.put_callback(self.put_projects), + }, + { + 'method': 'DELETE', + 'path': '/projects/<project>', + 'callback': self.get_callback(self.delete_projects), + }, + ] + + def get_callback(self, callback): # pragma: no cover + def wrapper(content_type, body, **kwargs): + try: + body = callback(**kwargs) + except ick2.NotFound as e: + return apifw.Response({ + 'status': apifw.HTTP_NOT_FOUND, + 'body': str(e), + 'headers': [], + }) + return apifw.Response({ + 'status': apifw.HTTP_OK, + 'body': body, + 'headers': { + 'Content-Type': 'application/json', + }, + }) + return wrapper + + def post_callback(self, callback): # pragma: no cover + def wrapper(content_type, body): + body = callback(body) + ick2.log.log('trace', msg_text='returned body', body=repr(body)) + return apifw.Response({ + 'status': apifw.HTTP_CREATED, + 'body': body, + 'headers': { + 'Content-Type': 'application/json', + }, + }) + return wrapper + + def put_callback(self, callback): # pragma: no cover + def wrapper(content_type, body, **kwargs): + body = callback(body, **kwargs) + ick2.log.log('trace', msg_text='returned body', body=repr(body)) + return apifw.Response({ + 'status': apifw.HTTP_OK, + 'body': body, + 'headers': { + 'Content-Type': 'application/json', + }, + }) + return wrapper + + def get_projects(self): + return { + 'projects': self._state.get_projects(), + } + + def get_project(self, project=None): + assert project is not None + return self._state.get_project(project) + + def post_projects(self, project): + return self._state.add_project(project) + + def put_projects(self, body, project=None): + assert project is not None + return self._state.update_project(project, body) + + def delete_projects(self, project): + self._state.remove_project(project) |