From f9db89603e2c5f866087f6fef5eb8a11a933c565 Mon Sep 17 00:00:00 2001 From: bramjanssen Date: Thu, 28 May 2026 11:29:08 +0200 Subject: [PATCH 1/4] fix: added support for passing bbox parameters --- app/platforms/implementations/openeo.py | 16 +++- tests/platforms/test_openeo_platform.py | 117 ++++++++++++++++++++++++ 2 files changed, 128 insertions(+), 5 deletions(-) diff --git a/app/platforms/implementations/openeo.py b/app/platforms/implementations/openeo.py index 74b508c..1fec37d 100644 --- a/app/platforms/implementations/openeo.py +++ b/app/platforms/implementations/openeo.py @@ -473,9 +473,12 @@ async def _transform_parameters( for param in service_params: if param.type == ParamTypeEnum.BOUNDING_BOX and param.name in parameters: # Transform GeoJSON to bounding box - geojson = parameters[param.name] - if geojson.get("type") == "Polygon": - coordinates = geojson.get("coordinates", []) + value = parameters[param.name] + logger.debug( + f"Transforming parameter {param.name} from GeoJSON to bounding box: {sorted(value.keys())}" + ) + if value.get("type") == "Polygon": + coordinates = value.get("coordinates", []) if coordinates and isinstance(coordinates, list): # Assuming the first set of coordinates defines the polygon polygon_coords = coordinates[0] @@ -489,12 +492,15 @@ async def _transform_parameters( } else: raise ValueError( - f"Invalid GeoJSON geometry for parameter {param.name}: {geojson}" + f"Invalid GeoJSON geometry for parameter {param.name}: {value}" ) + elif ["east", "north", "south", "west"] == sorted(value.keys()): + # Already in bounding box format, no transformation needed + transformed_parameters[param.name] = value else: raise ValueError( f"Unsupported GeoJSON type for parameter {param.name}: " - f"{geojson.get('type')}" + f"{value.get('type')}" ) logger.debug(f"Transformed parameters for openEO: {transformed_parameters}") return transformed_parameters diff --git a/tests/platforms/test_openeo_platform.py b/tests/platforms/test_openeo_platform.py index 7610516..c9f66cc 100644 --- a/tests/platforms/test_openeo_platform.py +++ b/tests/platforms/test_openeo_platform.py @@ -1053,6 +1053,37 @@ async def test_transform_parameters_passthrough_when_not_applicable( assert result == parameters +@pytest.mark.asyncio +@patch.object(OpenEOPlatform, "get_service_parameters", new_callable=AsyncMock) +async def test_transform_parameters_bbox_passthrough_when_already_bbox( + mock_get_service_parameters, platform, service_details +): + mock_get_service_parameters.return_value = [ + Parameter( + name="area", + description="Area of interest", + type=ParamTypeEnum.BOUNDING_BOX, + optional=False, + ) + ] + + parameters = { + "area": { + "north": 52.0, + "west": 3.0, + "east": 5.0, + "south": 50.0, + }, + "other": "untouched", + } + + result = await platform._transform_parameters( + user_token="fake-token", details=service_details, parameters=parameters + ) + + assert result == parameters + + @pytest.mark.asyncio @patch.object(OpenEOPlatform, "get_service_parameters", new_callable=AsyncMock) async def test_transform_parameters_raises_for_unsupported_geojson_type( @@ -1105,3 +1136,89 @@ async def test_transform_parameters_raises_for_invalid_polygon_coordinates( await platform._transform_parameters( user_token="fake-token", details=service_details, parameters=parameters ) + + +@pytest.mark.asyncio +@patch.object(OpenEOPlatform, "get_service_parameters", new_callable=AsyncMock) +async def test_transform_parameters_raises_for_non_list_polygon_coordinates( + mock_get_service_parameters, platform, service_details +): + mock_get_service_parameters.return_value = [ + Parameter( + name="area", + description="Area of interest", + type=ParamTypeEnum.BOUNDING_BOX, + optional=False, + ) + ] + + parameters = { + "area": { + "type": "Polygon", + "coordinates": "not-a-list", + } + } + + with pytest.raises(ValueError, match="Invalid GeoJSON geometry"): + await platform._transform_parameters( + user_token="fake-token", details=service_details, parameters=parameters + ) + + +@pytest.mark.asyncio +@patch.object(OpenEOPlatform, "get_service_parameters", new_callable=AsyncMock) +async def test_transform_parameters_mixed_bbox_inputs( + mock_get_service_parameters, platform, service_details +): + mock_get_service_parameters.return_value = [ + Parameter( + name="area_polygon", + description="Polygon area", + type=ParamTypeEnum.BOUNDING_BOX, + optional=False, + ), + Parameter( + name="area_bbox", + description="Bounding box area", + type=ParamTypeEnum.BOUNDING_BOX, + optional=False, + ), + Parameter( + name="date", + description="Date interval", + type=ParamTypeEnum.DATE_INTERVAL, + optional=True, + ), + ] + + parameters = { + "area_polygon": { + "type": "Polygon", + "coordinates": [ + [ + [3.0, 50.0], + [5.0, 50.0], + [5.0, 52.0], + [3.0, 52.0], + [3.0, 50.0], + ] + ], + }, + "area_bbox": { + "south": 49.0, + "east": 6.0, + "north": 53.0, + "west": 2.0, + }, + "date": ["2024-01-01", "2024-12-31"], + } + + result = await platform._transform_parameters( + user_token="fake-token", details=service_details, parameters=parameters + ) + + assert result == { + "area_polygon": {"west": 3.0, "south": 50.0, "east": 5.0, "north": 52.0}, + "area_bbox": {"south": 49.0, "east": 6.0, "north": 53.0, "west": 2.0}, + "date": ["2024-01-01", "2024-12-31"], + } From 9ee4b6462a94d1472eb19909370ac0f750c5b969 Mon Sep 17 00:00:00 2001 From: bramjanssen Date: Thu, 28 May 2026 12:47:03 +0200 Subject: [PATCH 2/4] fix: updated ogc api client dep --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 29cb296..afd66e0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,4 +30,4 @@ stac-pydantic types-requests types-shapely uvicorn[standard] -ogc-api-processes-client @ git+https://github.com/EOEPCA/ogc-api-processes-client.git@refactoring +ogc-api-processes-client==0.6.0 From fea273dcc4162ddbbed056a0072491cf816e9864 Mon Sep 17 00:00:00 2001 From: bramjanssen Date: Thu, 28 May 2026 12:49:08 +0200 Subject: [PATCH 3/4] fix: fixed lint error --- app/platforms/implementations/openeo.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/platforms/implementations/openeo.py b/app/platforms/implementations/openeo.py index 1fec37d..9822df6 100644 --- a/app/platforms/implementations/openeo.py +++ b/app/platforms/implementations/openeo.py @@ -474,9 +474,6 @@ async def _transform_parameters( if param.type == ParamTypeEnum.BOUNDING_BOX and param.name in parameters: # Transform GeoJSON to bounding box value = parameters[param.name] - logger.debug( - f"Transforming parameter {param.name} from GeoJSON to bounding box: {sorted(value.keys())}" - ) if value.get("type") == "Polygon": coordinates = value.get("coordinates", []) if coordinates and isinstance(coordinates, list): From f11f961abba7886c10c63205b81b15a078e50e70 Mon Sep 17 00:00:00 2001 From: bramjanssen Date: Thu, 28 May 2026 12:54:43 +0200 Subject: [PATCH 4/4] fix: updated ci pipeline env vars --- .github/workflows/ci.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8c16bed..63bfc88 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,9 @@ jobs: - name: Create .env file run: | echo "DATABASE_URL=sqlite:///:memory:" >> .env - + echo "KEYCLOAK_HOST=http://localhost" >> .env + echo "KEYCLOAK_REALM=apex" >> .env + echo "KEYCLOAK_CLIENT_ID=apex-dispatcher-api-local" >> .env - name: Install dependencies run: | python -m pip install --upgrade pip