diff --git a/app/__init__.py b/app/__init__.py index 7395965b8..1914a4adb 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -8,6 +8,7 @@ from flask_login import LoginManager from flask_wtf import CsrfProtect from werkzeug.exceptions import abort from app.notify_client.api_client import NotificationsAdminAPIClient +from app.notify_client.api_key_api_client import ApiKeyApiClient from app.notify_client.user_api_client import UserApiClient from app.its_dangerous_session import ItsdangerousSessionInterface import app.proxy_fix @@ -20,6 +21,7 @@ csrf = CsrfProtect() notifications_api_client = NotificationsAdminAPIClient() user_api_client = UserApiClient() +api_key_api_client = ApiKeyApiClient() def create_app(config_name, config_overrides=None): @@ -34,6 +36,7 @@ def create_app(config_name, config_overrides=None): notifications_api_client.init_app(application) user_api_client.init_app(application) + api_key_api_client.init_app(application) login_manager.init_app(application) login_manager.login_view = 'main.sign_in' diff --git a/app/main/views/api_keys.py b/app/main/views/api_keys.py index 74a5abab4..d32332a2b 100644 --- a/app/main/views/api_keys.py +++ b/app/main/views/api_keys.py @@ -2,6 +2,7 @@ from flask import request, render_template, redirect, url_for, flash from flask_login import login_required from app.main import main from app.main.forms import CreateKeyForm +from app import api_key_api_client @main.route("/services//documentation") @@ -16,15 +17,7 @@ def api_keys(service_id): return render_template( 'views/api-keys.html', service_id=service_id, - keys=[ - {'name': 'Test key 1', 'last_used': '12 January 2016, 10:01AM', 'id': 1}, - {'name': 'Test key 2', 'last_used': '12 January 2016, 9:50AM', 'id': 1}, - {'name': 'Test key 3', 'last_used': '12 January 2016, 9:49AM', 'id': 1}, - { - 'name': 'My first key', 'last_used': '25 December 2015, 09:49AM', 'id': 1, - 'revoked': '4 January 2016, 6:00PM' - } - ] + keys=api_key_api_client.get_api_keys(service_id=service_id)['apiKeys'] ) @@ -33,7 +26,9 @@ def api_keys(service_id): def create_api_key(service_id): form = CreateKeyForm() if form.validate_on_submit(): - return redirect(url_for('.show_api_key', service_id=service_id)) + secret = api_key_api_client.create_api_key(service_id=service_id, key_name=form.key_name.data) + return render_template('views/api-keys/show.html', service_id=service_id, secret=secret, + key_name=form.key_name.data) return render_template( 'views/api-keys/create.html', service_id=service_id, @@ -53,5 +48,6 @@ def revoke_api_key(service_id, key_id): if request.method == 'GET': return render_template('views/api-keys/revoke.html', service_id=service_id) elif request.method == 'POST': + api_key_api_client.revoke_api_key(service_id=service_id, key_id=key_id) flash('‘Test key 1’ was revoked') return redirect(url_for('.api_keys', service_id=service_id)) diff --git a/app/notify_client/api_key_api_client.py b/app/notify_client/api_key_api_client.py new file mode 100644 index 000000000..d538cb816 --- /dev/null +++ b/app/notify_client/api_key_api_client.py @@ -0,0 +1,24 @@ +from client.base import BaseAPIClient + + +class ApiKeyApiClient(BaseAPIClient): + def __init__(self, base_url=None, client_id=None, secret=None): + super(self.__class__, self).__init__(base_url=base_url or 'base_url', + client_id=client_id or 'client_id', + secret=secret or 'secret') + + def init_app(self, app): + self.base_url = app.config['API_HOST_NAME'] + self.client_id = app.config['ADMIN_CLIENT_USER_NAME'] + self.secret = app.config['ADMIN_CLIENT_SECRET'] + + def get_api_keys(self, service_id, *params): + return self.get(url='/service/{}/api-keys'.format(service_id)) + + def create_api_key(self, service_id, key_name, *params): + data = {"name": key_name} + key = self.post(url='/service/{}/api-key'.format(service_id), data=data) + return key['data'] + + def revoke_api_key(self, service_id, key_id, *params): + return self.post(url='/service/{0}/api-key/revoke/{1}'.format(service_id, key_id), data=None) \ No newline at end of file diff --git a/app/templates/views/api-keys.html b/app/templates/views/api-keys.html index 601deead0..dbd48cab0 100644 --- a/app/templates/views/api-keys.html +++ b/app/templates/views/api-keys.html @@ -35,21 +35,18 @@ empty_message="You haven’t created any API keys yet", caption="API keys", caption_visible=False, - field_headings=['Key name', 'Created at', hidden_field_heading('Action')] + field_headings=['Key name', hidden_field_heading('Action')] ) %} {% call field() %} {{ item.name }} {% endcall %} - {% call field() %} - {{ item.last_used }} - {% endcall %} - {% if item.revoked %} + {% if item.expiry_date %} {% call field(align='right', status='default') %} - Revoked {{ item.revoked }} + Revoked {{ item.expiry_date }} {% endcall %} {% else %} {% call field(align='right', status='error') %} - Revoke + Revoke {% endcall %} {% endif %} {% endcall %} diff --git a/app/templates/views/api-keys/show.html b/app/templates/views/api-keys/show.html index fca59852d..a19a038b2 100644 --- a/app/templates/views/api-keys/show.html +++ b/app/templates/views/api-keys/show.html @@ -20,7 +20,7 @@ once you leave this page.

- {{ api_key('d30512af92e1386d63b90e5973b49a10', 'CRM application') }} + {{ api_key(secret, key_name) }} diff --git a/tests/conftest.py b/tests/conftest.py index ab4890253..7bbf805d8 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -210,3 +210,7 @@ def mock_register_user(mocker, user_data): mock_class = mocker.patch('app.user_api_client.register_user') mock_class.return_value = user return mock_class + + +def mock_create_api_key(mocker, key_name): + mock_class = mocker.patch('app.api')