From 2582c8e9e49b0e8fae6f042871270e043b0080ff Mon Sep 17 00:00:00 2001 From: vmttn Date: Mon, 3 Jul 2023 20:14:25 +0200 Subject: [PATCH] refactor(api): log api request (#109) --- .../versions/2daaedf28c12_extended_request.py | 1 + api/src/data_inclusion/api/core/auth.py | 3 +++ api/src/data_inclusion/api/core/request/models.py | 1 + api/src/data_inclusion/api/core/request/services.py | 5 ++++- api/tests/core/test_request.py | 12 +++++++++++- 5 files changed, 20 insertions(+), 2 deletions(-) diff --git a/api/src/alembic/versions/2daaedf28c12_extended_request.py b/api/src/alembic/versions/2daaedf28c12_extended_request.py index f7db51c6..1bae35cf 100644 --- a/api/src/alembic/versions/2daaedf28c12_extended_request.py +++ b/api/src/alembic/versions/2daaedf28c12_extended_request.py @@ -33,6 +33,7 @@ def upgrade() -> None: ) op.add_column("api_request", sa.Column("client_host", sa.Text(), nullable=True)) op.add_column("api_request", sa.Column("client_port", sa.Integer(), nullable=True)) + op.add_column("api_request", sa.Column("endpoint_name", sa.Text(), nullable=True)) def downgrade() -> None: diff --git a/api/src/data_inclusion/api/core/auth.py b/api/src/data_inclusion/api/core/auth.py index 5399487f..88fbc870 100644 --- a/api/src/data_inclusion/api/core/auth.py +++ b/api/src/data_inclusion/api/core/auth.py @@ -16,6 +16,9 @@ def on_error(conn: HTTPConnection, exc: Exception) -> responses.Response: class AuthenticationBackend(authentication.AuthenticationBackend): async def authenticate(self, conn): + if "Authorization" not in conn.headers: + return + http_bearer_instance = HTTPBearer() try: diff --git a/api/src/data_inclusion/api/core/request/models.py b/api/src/data_inclusion/api/core/request/models.py index a6531cb9..4e39626a 100644 --- a/api/src/data_inclusion/api/core/request/models.py +++ b/api/src/data_inclusion/api/core/request/models.py @@ -23,3 +23,4 @@ class Request(Base): query_params = sqla.Column(JSONB) client_host = sqla.Column(sqla.Text) client_port = sqla.Column(sqla.Integer) + endpoint_name = sqla.Column(sqla.Text) diff --git a/api/src/data_inclusion/api/core/request/services.py b/api/src/data_inclusion/api/core/request/services.py index de1605dd..738edc8a 100644 --- a/api/src/data_inclusion/api/core/request/services.py +++ b/api/src/data_inclusion/api/core/request/services.py @@ -11,11 +11,14 @@ def save_request(request: requests.Request, response: responses.Response) -> Non method=request.method, path=request.url.path, base_url=str(request.base_url), - user=request.user.username, + user=request.user.username if request.user.is_authenticated else None, path_params=request.path_params, query_params=dict(request.query_params), client_host=request.client.host, client_port=request.client.port, + endpoint_name=request.scope["route"].name + if "route" in request.scope + else None, ) session.add(request_instance) session.commit() diff --git a/api/tests/core/test_request.py b/api/tests/core/test_request.py index 8abfb1df..78cce9f5 100644 --- a/api/tests/core/test_request.py +++ b/api/tests/core/test_request.py @@ -19,6 +19,7 @@ def test_save_api_request_with_token(api_client, db_session): assert request_instance.method == "GET" assert request_instance.path_params == {"source": "foo", "id": "bar"} assert request_instance.query_params == {"baz": "1"} + assert request_instance.endpoint_name == "retrieve_structure_endpoint" def test_save_api_request_without_token(api_client, db_session): @@ -27,4 +28,13 @@ def test_save_api_request_without_token(api_client, db_session): response = api_client.get(url) assert response.status_code == 403 - assert db_session.query(models.Request).count() == 0 + assert db_session.query(models.Request).count() == 1 + + request_instance = db_session.query(models.Request).first() + assert request_instance.status_code == 403 + assert request_instance.user is None + assert request_instance.path == "/api/v0/structures" + assert request_instance.method == "GET" + assert request_instance.path_params == {} + assert request_instance.query_params == {} + assert request_instance.endpoint_name == "list_structures_endpoint"