diff --git a/bigchaindb/web/routes.py b/bigchaindb/web/routes.py index d2b5649a..cf60fe35 100644 --- a/bigchaindb/web/routes.py +++ b/bigchaindb/web/routes.py @@ -17,6 +17,7 @@ def r(*args, **kwargs): ROUTES_API_V1 = [ + r('/', info.ApiV1Index), r('transactions/', tx.TransactionApi), r('transactions//status', tx.TransactionStatusApi), r('transactions', tx.TransactionListApi), @@ -25,6 +26,6 @@ ROUTES_API_V1 = [ API_SECTIONS = [ - (None, [r('/', info.IndexApi)]), + (None, [r('/', info.RootIndex)]), ('/api/v1/', ROUTES_API_V1), ] diff --git a/bigchaindb/web/views/base.py b/bigchaindb/web/views/base.py index 9282b5b9..f0e5dc69 100644 --- a/bigchaindb/web/views/base.py +++ b/bigchaindb/web/views/base.py @@ -1,8 +1,11 @@ -from flask import jsonify +""" +Common classes and methods for API handlers +""" + +from flask import jsonify, request def make_error(status_code, message=None): - if status_code == 404 and message is None: message = 'Not found' @@ -12,3 +15,8 @@ def make_error(status_code, message=None): }) response.status_code = status_code return response + + +def base_url(): + return '%s://%s/' % (request.environ['wsgi.url_scheme'], + request.environ['HTTP_HOST']) diff --git a/bigchaindb/web/views/info.py b/bigchaindb/web/views/info.py index 1a8f1715..4b0b3f0b 100644 --- a/bigchaindb/web/views/info.py +++ b/bigchaindb/web/views/info.py @@ -4,10 +4,11 @@ import flask from flask_restful import Resource import bigchaindb +from bigchaindb.web.views.base import base_url from bigchaindb import version -class IndexApi(Resource): +class RootIndex(Resource): def get(self): return flask.jsonify({ 'software': 'BigchainDB', @@ -15,3 +16,21 @@ class IndexApi(Resource): 'public_key': bigchaindb.config['keypair']['public'], 'keyring': bigchaindb.config['keyring'] }) + + +class ApiV1Index(Resource): + def get(self): + api_root = base_url() + 'api/v1/' + docs_url = ['https://docs.bigchaindb.com/projects/server/en/', + version.__short_version__, + '/drivers-clients/http-client-server-api.html', + ] + + return { + "_links": { + "docs": {"href": ''.join(docs_url)}, + "self": {"href": api_root}, + "statuses": {"href": api_root + "statuses/"}, + "transactions": {"href": api_root + "transactions/"}, + }, + } diff --git a/tests/web/test_info.py b/tests/web/test_info.py index 4956bd29..be753ed0 100644 --- a/tests/web/test_info.py +++ b/tests/web/test_info.py @@ -1,5 +1,25 @@ +from unittest import mock + + def test_api_root_url_shows_basic_info(client): from bigchaindb import version res = client.get('/') assert res.json['software'] == 'BigchainDB' assert res.json['version'] == version.__version__ + + +def test_api_v1_endpoint(client): + with mock.patch('bigchaindb.version.__short_version__', 'tst'): + res = client.get('/api/v1') + docs_url = ['https://docs.bigchaindb.com/projects/server/en/', + 'tst', + '/drivers-clients/http-client-server-api.html', + ] + assert res.json == { + '_links': { + 'docs': {'href': ''.join(docs_url)}, + 'self': {'href': 'http://localhost/api/v1/'}, + 'statuses': {'href': 'http://localhost/api/v1/statuses/'}, + 'transactions': {'href': 'http://localhost/api/v1/transactions/'} + } + }