diff --git a/src/prozorro_sale/document_service/databridge/api.py b/src/prozorro_sale/document_service/databridge/api.py index e20d8db204527f89c441fc95dae5e33e307b87a0..759977ec0ea833e1c58865ecc130410b1162b22c 100644 --- a/src/prozorro_sale/document_service/databridge/api.py +++ b/src/prozorro_sale/document_service/databridge/api.py @@ -37,3 +37,11 @@ async def delete_document(request): if scope == sign.PRIVATE_ACCESS: sign.validate_token(get_token(request), doc_id) return await request.app.storage.delete(scope, doc_id, request) + + +async def get_document(request): + doc_id = request.match_info['doc_id'] + scope = request.match_info['scope'] + if scope == sign.PRIVATE_ACCESS: + sign.validate_token(get_token(request), doc_id) + return await request.app.storage.get(scope, doc_id, request) diff --git a/src/prozorro_sale/document_service/databridge/routes.py b/src/prozorro_sale/document_service/databridge/routes.py index 8a6b485fdbe5ae91678a00a109a3eab8d256a654..06effd4f30f4894cf07e283cabc3782f84d98fc3 100644 --- a/src/prozorro_sale/document_service/databridge/routes.py +++ b/src/prozorro_sale/document_service/databridge/routes.py @@ -1,10 +1,11 @@ from aiohttp import web -from .api import version, ping, upload_document, delete_document +from .api import version, ping, upload_document, delete_document, get_document def init_routes(app: web.Application) -> None: app.router.add_get('/api', version) app.router.add_get('/api/ping', ping) + app.router.add_get('/api/documents/{scope:(public|private)}/{doc_id}', get_document, allow_head=False) app.router.add_put('/api/documents/{scope:(public|private)}', upload_document) app.router.add_delete('/api/documents/{scope:(public|private)}/{doc_id}', delete_document) diff --git a/tests/integration/test_api.py b/tests/integration/test_api.py index 4e7f3326a33b35ec509778ed3af49f8243753b08..b8a9f202e97c22c5bdb7955e681379ac25035453 100644 --- a/tests/integration/test_api.py +++ b/tests/integration/test_api.py @@ -111,7 +111,7 @@ class TestApi: @pytest.mark.parametrize("storage_type", [ 'memory', - # 's3', + 's3', 'swift' ]) async def test_get_document_private(self, client, multipart_obj, storage_type): diff --git a/tests/integration/test_databridge.py b/tests/integration/test_databridge.py index e9bace5186fc6c8f33d76388dc6c32b242626f0b..ae5c5337386e109297efe48fd6df556b93eb0b23 100644 --- a/tests/integration/test_databridge.py +++ b/tests/integration/test_databridge.py @@ -86,3 +86,40 @@ class TestDataBridge: cl = await client_databridge(storage_type) resp = await cl.delete('/api/documents/public/doc_id') assert resp.status == 404 + + @pytest.mark.parametrize("storage_type", [ + 'memory', + 's3', + 'swift' + ]) + async def test_get_document_public(self, client_databridge, multipart_obj, storage_type): + cl = await client_databridge(storage_type) + response = await cl.put('/api/documents/public', data=multipart_obj, + headers={"Authorization": "auction_token"}) + data = await response.read() + token = sign._decode_token(data) + doc_id = token['id'] + response = await cl.get(f'/api/documents/public/{doc_id}') + data = await response.read() + assert response.status == 200 + assert response.content_type == 'plain/text' + assert data == b'bar' + + @pytest.mark.parametrize("storage_type", [ + 'memory', + # 's3', + 'swift' + ]) + async def test_get_document_private(self, client_databridge, multipart_obj, storage_type): + cl = await client_databridge(storage_type) + response = await cl.put('/api/documents/private', data=multipart_obj, + headers={"Authorization": "auction_token"}) + data = await response.read() + token = data.decode() + token_dict = sign._decode_token(data) + doc_id = token_dict['id'] + response = await cl.get(f'/api/documents/private/{doc_id}?token={token}') + data = await response.read() + assert response.status == 200 + assert response.content_type == 'plain/text' + assert data == b'bar'