Skip to content

Commit 09491f0

Browse files
Yuri ZmytrakovYuri Zmytrakov
authored andcommitted
feat: Add env var ENV_MAX_LIMIT for items returned
This PR adds a environment variable ENV_MAX_LIMIT, which allows overriding the default MAX_LIMIT value, which controls the ?limit URL parameter used in STAC API queries, defining the maximum number of items and collections that can be returned in a single response.
1 parent d69f97f commit 09491f0

File tree

4 files changed

+37
-5
lines changed

4 files changed

+37
-5
lines changed

stac_fastapi/core/stac_fastapi/core/utilities.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,15 @@
1010

1111
from stac_fastapi.types.stac import Item
1212

13-
MAX_LIMIT = 10000
13+
14+
def get_max_limit():
15+
"""
16+
Retrieve a MAX_LIMIT value from an environment variable.
17+
18+
Returns:
19+
int: The int value parsed from the environment variable.
20+
"""
21+
return int(os.getenv("ENV_MAX_LIMIT", 10000))
1422

1523

1624
def get_bool_env(name: str, default: Union[bool, str] = False) -> bool:

stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/database_logic.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
from stac_fastapi.core.base_database_logic import BaseDatabaseLogic
1919
from stac_fastapi.core.serializers import CollectionSerializer, ItemSerializer
20-
from stac_fastapi.core.utilities import MAX_LIMIT, bbox2polygon
20+
from stac_fastapi.core.utilities import bbox2polygon, get_max_limit
2121
from stac_fastapi.elasticsearch.config import AsyncElasticsearchSettings
2222
from stac_fastapi.elasticsearch.config import (
2323
ElasticsearchSettings as SyncElasticsearchSettings,
@@ -543,7 +543,7 @@ async def execute_search(
543543
index_param = ITEM_INDICES
544544
query = add_collections_to_body(collection_ids, query)
545545

546-
max_result_window = MAX_LIMIT
546+
max_result_window = get_max_limit()
547547

548548
size_limit = min(limit + 1, max_result_window)
549549

stac_fastapi/opensearch/stac_fastapi/opensearch/database_logic.py

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

1717
from stac_fastapi.core.base_database_logic import BaseDatabaseLogic
1818
from stac_fastapi.core.serializers import CollectionSerializer, ItemSerializer
19-
from stac_fastapi.core.utilities import MAX_LIMIT, bbox2polygon
19+
from stac_fastapi.core.utilities import bbox2polygon, get_max_limit
2020
from stac_fastapi.extensions.core.transaction.request import (
2121
PartialCollection,
2222
PartialItem,
@@ -540,7 +540,7 @@ async def execute_search(
540540

541541
search_body["sort"] = sort if sort else DEFAULT_SORT
542542

543-
max_result_window = MAX_LIMIT
543+
max_result_window = get_max_limit()
544544

545545
size_limit = min(limit + 1, max_result_window)
546546

stac_fastapi/tests/api/test_api.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1540,3 +1540,27 @@ async def test_collection_items_limit_env_variable(
15401540
assert resp.status_code == 200
15411541
resp_json = resp.json()
15421542
assert int(limit) == len(resp_json["features"])
1543+
1544+
1545+
@pytest.mark.asyncio
1546+
async def test_search_max_item_limit(
1547+
app_client, load_test_data, txn_client, monkeypatch
1548+
):
1549+
limit = "10"
1550+
monkeypatch.setenv("ENV_MAX_LIMIT", limit)
1551+
1552+
test_collection = load_test_data("test_collection.json")
1553+
await create_collection(txn_client, test_collection)
1554+
1555+
item = load_test_data("test_item.json")
1556+
1557+
for i in range(20):
1558+
test_item = item.copy()
1559+
test_item["id"] = f"test-item-collection-{i}"
1560+
await create_item(txn_client, test_item)
1561+
1562+
resp = await app_client.get("/search", params={"limit": 20})
1563+
1564+
assert resp.status_code == 200
1565+
resp_json = resp.json()
1566+
assert int(limit) == len(resp_json["features"])

0 commit comments

Comments
 (0)