From b15450d459136226a49f93ad648a3c8f890d9895 Mon Sep 17 00:00:00 2001 From: Valentin Matton Date: Mon, 3 Jul 2023 18:05:57 +0200 Subject: [PATCH 1/2] feat(api): add endpoint name to request log --- api/src/alembic/versions/2daaedf28c12_extended_request.py | 1 + api/src/data_inclusion/api/core/request/models.py | 1 + api/src/data_inclusion/api/core/request/services.py | 3 +++ api/tests/core/test_request.py | 1 + 4 files changed, 6 insertions(+) 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/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..8cdf7e5f 100644 --- a/api/src/data_inclusion/api/core/request/services.py +++ b/api/src/data_inclusion/api/core/request/services.py @@ -16,6 +16,9 @@ def save_request(request: requests.Request, response: responses.Response) -> Non 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..150fb0cb 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): From 7827dbce40feddaef2d021963de670cdd22f4aef Mon Sep 17 00:00:00 2001 From: Valentin Matton Date: Mon, 3 Jul 2023 18:08:53 +0200 Subject: [PATCH 2/2] refactor(api) --- api/src/data_inclusion/api/core/auth.py | 3 +++ api/src/data_inclusion/api/core/request/services.py | 2 +- api/tests/core/test_request.py | 11 ++++++++++- 3 files changed, 14 insertions(+), 2 deletions(-) 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/services.py b/api/src/data_inclusion/api/core/request/services.py index 8cdf7e5f..738edc8a 100644 --- a/api/src/data_inclusion/api/core/request/services.py +++ b/api/src/data_inclusion/api/core/request/services.py @@ -11,7 +11,7 @@ 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, diff --git a/api/tests/core/test_request.py b/api/tests/core/test_request.py index 150fb0cb..78cce9f5 100644 --- a/api/tests/core/test_request.py +++ b/api/tests/core/test_request.py @@ -28,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"