Skip to content

Commit 2c4ae12

Browse files
caurioljlahovnik
andauthored
fix: Pagination internal FDP providers (#79)
Fix pagination for spacenet and internal_fdp provider --------- Co-authored-by: jlahovnik <julia.lahovnik@csgroup.eu>
1 parent d395992 commit 2c4ae12

4 files changed

Lines changed: 19 additions & 16 deletions

File tree

stac_fastapi/eodag/app.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@
122122

123123
# item_collection extensions
124124
itm_col_extensions_map = {
125+
"query": QueryExtension(conformance_classes=[QueryConformanceClasses.COLLECTIONS]),
125126
"token": TokenPaginationExtension(),
126127
"sort": SortExtension(conformance_classes=[SortConformanceClasses.ITEMS]),
127128
"filter": FilterExtension(client=FiltersClient(stac_metadata_model=stac_metadata_model)),

stac_fastapi/eodag/core.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,7 @@ async def item_collection(
377377
filter_expr: Optional[str] = None,
378378
filter_lang: Optional[str] = "cql2-text",
379379
token: Optional[str] = None,
380+
query: Optional[str] = None,
380381
**kwargs: Any,
381382
) -> ItemCollection:
382383
"""
@@ -400,15 +401,11 @@ async def item_collection(
400401
# If collection does not exist, NotFoundError wil be raised
401402
await self.get_collection(collection_id, request=request)
402403

403-
base_args = {
404-
"collections": [collection_id],
405-
"bbox": bbox,
406-
"datetime": datetime,
407-
"limit": limit,
408-
"token": token,
409-
}
404+
base_args = {"collections": [collection_id], "bbox": bbox, "datetime": datetime, "limit": limit, "token": token}
410405

411-
clean = self._clean_search_args(base_args, sortby=sortby, filter_expr=filter_expr, filter_lang=filter_lang)
406+
clean = self._clean_search_args(
407+
base_args, sortby=sortby, filter_expr=filter_expr, filter_lang=filter_lang, query=query
408+
)
412409

413410
search_request = self.post_request_model.model_validate(clean)
414411
item_collection = self._search_base(search_request, request)

stac_fastapi/eodag/models/links.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"""link helpers."""
1919

2020
from typing import Any, Optional
21-
from urllib.parse import ParseResult, parse_qs, unquote, urlencode, urljoin, urlparse
21+
from urllib.parse import ParseResult, parse_qs, quote, unquote, urlencode, urljoin, urlparse
2222

2323
import attr
2424
import orjson
@@ -162,10 +162,12 @@ def link_next(self) -> Optional[dict[str, Any]]:
162162

163163
if method == "GET":
164164
params = {"token": [str(self.next)]}
165+
existing_query = {}
165166
if "query" in self.request.query_params:
166167
existing_query = orjson.loads(self.request.query_params["query"])
167-
combined_query = {**existing_query, **federation_filter.get("query", {})}
168-
params["query"] = [orjson.dumps(combined_query).decode("utf-8")]
168+
combined_query = {**existing_query, **federation_filter.get("query", {})}
169+
query_json = orjson.dumps(combined_query).decode()
170+
params["query"] = [quote(query_json)]
169171
link["href"] = merge_params(self.url, params)
170172

171173
if method == "POST":

tests/test_search.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
# limitations under the License.
1818
"""Search tests."""
1919

20+
from urllib.parse import unquote
21+
2022
import pytest
2123
from eodag import EOProduct, SearchResult
2224
from eodag.api.product.metadata_mapping import ONLINE_STATUS
@@ -844,10 +846,11 @@ async def test_pagination_with_federation_backend(request_valid, defaults, metho
844846
assert next_link["method"] == method
845847

846848
if method == "GET":
847-
assert f"token={backend_token}" in next_link["href"]
848-
assert "query=" in next_link["href"]
849-
assert "federation:backends" in next_link["href"]
850-
assert "test_provider" in next_link["href"]
849+
next_link_url = unquote(next_link["href"])
850+
assert f"token={backend_token}" in next_link_url
851+
assert "query=" in next_link_url
852+
assert "federation:backends" in next_link_url
853+
assert "test_provider" in next_link_url
851854
else: # POST
852855
assert "body" in next_link
853856
assert next_link["body"]["token"] == backend_token
@@ -869,7 +872,7 @@ async def test_pagination_limit_handling(request_valid, defaults, method, limit,
869872
"""Test that pagination respects limit parameter for both GET and POST."""
870873
# Create a mock search result
871874
search_result = SearchResult(
872-
[EOProduct("test_provider", {"id": "_", "collection": "_"})] * 10, next_page_token="limit_token_123"
875+
[EOProduct("creodias", {"id": "_", "collection": "_"})] * 10, next_page_token="limit_token_123"
873876
)
874877

875878
if method == "GET":

0 commit comments

Comments
 (0)