diff options
Diffstat (limited to 'apigateway/apigateway/api')
-rw-r--r-- | apigateway/apigateway/api/__init__.py | 0 | ||||
-rw-r--r-- | apigateway/apigateway/api/app.py | 37 | ||||
-rw-r--r-- | apigateway/apigateway/api/config.py | 18 | ||||
-rw-r--r-- | apigateway/apigateway/api/controllers/__init__.py | 0 | ||||
-rw-r--r-- | apigateway/apigateway/api/controllers/root.py | 26 | ||||
-rw-r--r-- | apigateway/apigateway/api/controllers/v1/__init__.py | 0 | ||||
-rw-r--r-- | apigateway/apigateway/api/controllers/v1/controller.py | 26 | ||||
-rw-r--r-- | apigateway/apigateway/api/controllers/v1/users.py | 81 | ||||
-rw-r--r-- | apigateway/apigateway/api/expose.py | 22 | ||||
-rw-r--r-- | apigateway/apigateway/api/hooks.py | 23 |
10 files changed, 233 insertions, 0 deletions
diff --git a/apigateway/apigateway/api/__init__.py b/apigateway/apigateway/api/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/apigateway/apigateway/api/__init__.py diff --git a/apigateway/apigateway/api/app.py b/apigateway/apigateway/api/app.py new file mode 100644 index 0000000..a8af22e --- /dev/null +++ b/apigateway/apigateway/api/app.py @@ -0,0 +1,37 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import pecan + +from apigateway.api import config as api_config +from apigateway.api import hooks + + +def get_pecan_config(): + filename = api_config.__file__.replace('.pyc', '.py') + return pecan.configuration.conf_from_file(filename) + + +def setup_app(): + config = get_pecan_config() + + app_hooks = [hooks.DBHook()] + app_conf = dict(config.app) + app = pecan.make_app( + app_conf.pop('root'), + logging=getattr(config, 'logging', {}), + hooks=app_hooks, + **app_conf + ) + + return app diff --git a/apigateway/apigateway/api/config.py b/apigateway/apigateway/api/config.py new file mode 100644 index 0000000..b76e681 --- /dev/null +++ b/apigateway/apigateway/api/config.py @@ -0,0 +1,18 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +app = { + 'root': 'apigateway.api.controllers.root.RootController', + 'modules': ['apigateway.api'], + 'debug': False, +} diff --git a/apigateway/apigateway/api/controllers/__init__.py b/apigateway/apigateway/api/controllers/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/apigateway/apigateway/api/controllers/__init__.py diff --git a/apigateway/apigateway/api/controllers/root.py b/apigateway/apigateway/api/controllers/root.py new file mode 100644 index 0000000..941b895 --- /dev/null +++ b/apigateway/apigateway/api/controllers/root.py @@ -0,0 +1,26 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from pecan import rest +from wsme import types as wtypes + +from apigateway.api.controllers.v1 import controller as v1_controller +from apigateway.api import expose + + +class RootController(rest.RestController): + v1 = v1_controller.V1Controller() + + @expose.expose(wtypes.text) + def get(self): + return "apigateway" diff --git a/apigateway/apigateway/api/controllers/v1/__init__.py b/apigateway/apigateway/api/controllers/v1/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/apigateway/apigateway/api/controllers/v1/__init__.py diff --git a/apigateway/apigateway/api/controllers/v1/controller.py b/apigateway/apigateway/api/controllers/v1/controller.py new file mode 100644 index 0000000..79b529b --- /dev/null +++ b/apigateway/apigateway/api/controllers/v1/controller.py @@ -0,0 +1,26 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from pecan import rest +from wsme import types as wtypes + +from apigateway.api.controllers.v1 import users as v1_users +from apigateway.api import expose + + +class V1Controller(rest.RestController): + users = v1_users.UsersController() + + @expose.expose(wtypes.text) + def get(self): + return 'apigateway v1controller' diff --git a/apigateway/apigateway/api/controllers/v1/users.py b/apigateway/apigateway/api/controllers/v1/users.py new file mode 100644 index 0000000..8cd2345 --- /dev/null +++ b/apigateway/apigateway/api/controllers/v1/users.py @@ -0,0 +1,81 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import pecan +from pecan import request +from pecan import rest +from wsme import types as wtypes + +from apigateway.api import expose + + +class User(wtypes.Base): + id = int + user_id = wtypes.text + name = wtypes.text + email = wtypes.text + + +class Users(wtypes.Base): + users = [User] + + +class UserController(rest.RestController): + + def __init__(self, user_id): + self.user_id = int(user_id) + + @expose.expose(User) + def get(self): + user_info = { + 'id': self.user_id, + 'name': 'parser', + } + return User(**user_info) + + @expose.expose(User, body=User) + def put(self, user): + user_info = { + 'id': self.user_id, + 'name': user.name, + } + return User(**user_info) + + @expose.expose() + def delete(self): + print('Delete user_id: %s' % self.user_id) + + +class UsersController(rest.RestController): + + @pecan.expose() + def _lookup(self, user_id, *remainder): + return UserController(user_id), remainder + + @expose.expose(Users) + def get(self): + db_conn = request.db_conn + users = db_conn.list_users() + users_list = [] + for user in users: + u = User() + u.id = user.id + u.user_id = user.user_id + u.name = user.name + u.email = user.email + users_list.append(u) + return Users(users=users_list) + + @expose.expose(None, body=User, status_code=201) + def post(self, user): + print(user) diff --git a/apigateway/apigateway/api/expose.py b/apigateway/apigateway/api/expose.py new file mode 100644 index 0000000..db30569 --- /dev/null +++ b/apigateway/apigateway/api/expose.py @@ -0,0 +1,22 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +import wsmeext.pecan as wsme_pecan + + +def expose(*args, **kwargs): + """Ensure that only JSON, and not XML, is supported.""" + if 'rest_content_types' not in kwargs: + kwargs['rest_content_types'] = ('json',) + + return wsme_pecan.wsexpose(*args, **kwargs) diff --git a/apigateway/apigateway/api/hooks.py b/apigateway/apigateway/api/hooks.py new file mode 100644 index 0000000..03cbd9e --- /dev/null +++ b/apigateway/apigateway/api/hooks.py @@ -0,0 +1,23 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from pecan import hooks + +from apigateway.db import api as db_api + + +class DBHook(hooks.PecanHook): + """Create a db connection instance before a request handle.""" + + def before(self, state): + state.request.db_conn = db_api.Connection() |