Skip to content

Commit 52a0478

Browse files
authored
Merge pull request #186 from ecmwf-projects/COPDS-1706-normalise-request-exceptions
Implement exception handling for normalise_request
2 parents 56ec383 + 90ae679 commit 52a0478

File tree

3 files changed

+25
-3
lines changed

3 files changed

+25
-3
lines changed

cads_processing_api_service/clients.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import attrs
2323
import cacholote.extra_encoders
24+
import cads_adaptors.exceptions
2425
import cads_broker.database
2526
import cads_catalogue.config
2627
import cads_catalogue.database
@@ -37,7 +38,17 @@
3738
import sqlalchemy.sql.selectable
3839
import structlog
3940

40-
from . import adaptors, auth, config, db_utils, models, serializers, translators, utils
41+
from . import (
42+
adaptors,
43+
auth,
44+
config,
45+
db_utils,
46+
exceptions,
47+
models,
48+
serializers,
49+
translators,
50+
utils,
51+
)
4152
from .metrics import handle_download_metrics
4253

4354
logger: structlog.stdlib.BoundLogger = structlog.get_logger(__name__)
@@ -208,7 +219,10 @@ def post_process_execution(
208219
auth.verify_if_disabled(dataset.disabled_reason, user_role)
209220
adaptor_properties = adaptors.get_adaptor_properties(dataset)
210221
adaptor = adaptors.instantiate_adaptor(adaptor_properties=adaptor_properties)
211-
request_inputs = adaptor.normalise_request(request.get("inputs", {}))
222+
try:
223+
request_inputs = adaptor.normalise_request(request.get("inputs", {}))
224+
except cads_adaptors.exceptions.InvalidRequest as exc:
225+
raise exceptions.InvalidRequest(detail=str(exc)) from exc
212226
auth.verify_cost(request_inputs, adaptor_properties)
213227
licences = adaptor.get_licences(request_inputs)
214228
auth.validate_licences(accepted_licences, licences)

cads_processing_api_service/exceptions.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ class JobResultsExpired(ogc_api_processes_fastapi.exceptions.OGCAPIException):
4848
title: str = "results expired"
4949

5050

51+
@attrs.define
52+
class InvalidRequest(ogc_api_processes_fastapi.exceptions.OGCAPIException):
53+
type: str = "invalid request"
54+
status_code: int = fastapi.status.HTTP_400_BAD_REQUEST
55+
title: str = "invalid request"
56+
57+
5158
def format_exception_content(
5259
exc: ogc_api_processes_fastapi.exceptions.OGCAPIException,
5360
request: fastapi.Request | None = None,
@@ -188,6 +195,7 @@ def include_exception_handlers(app: fastapi.FastAPI) -> fastapi.FastAPI:
188195
"""
189196
app.add_exception_handler(PermissionDenied, exception_handler) # type: ignore
190197
app.add_exception_handler(InvalidParameter, exception_handler) # type: ignore
198+
app.add_exception_handler(InvalidRequest, exception_handler) # type: ignore
191199
app.add_exception_handler(JobResultsExpired, exception_handler) # type: ignore
192200
app.add_exception_handler(requests.exceptions.ReadTimeout, exception_handler) # type: ignore
193201
app.add_exception_handler(Exception, general_exception_handler)

cads_processing_api_service/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ def get_resource_properties(
152152
if isinstance(properties, str):
153153
properties = (properties,)
154154
properties_values = tuple(getattr(table, property) for property in properties)
155-
statement = sa.select(*properties_values).filter(table.resource_uid == resource_id) # type: ignore
155+
statement = sa.select(*properties_values).filter(table.resource_uid == resource_id)
156156
try:
157157
resource_properties = tuple(session.execute(statement).one())
158158
except sqlalchemy.exc.NoResultFound:

0 commit comments

Comments
 (0)