diff --git a/stac_fastapi/api/stac_fastapi/api/models.py b/stac_fastapi/api/stac_fastapi/api/models.py index 704cf6ed0..1a23add72 100644 --- a/stac_fastapi/api/stac_fastapi/api/models.py +++ b/stac_fastapi/api/stac_fastapi/api/models.py @@ -86,12 +86,12 @@ def create_get_request_model( def create_post_request_model( - extensions, base_model: BaseSearchPostRequest = BaseSearchGetRequest + extensions, base_model: BaseSearchPostRequest = BaseSearchPostRequest ): """Wrap create_request_model to create the POST request model.""" return create_request_model( "SearchPostRequest", - base_model=BaseSearchPostRequest, + base_model=base_model, extensions=extensions, request_type="POST", ) diff --git a/stac_fastapi/extensions/stac_fastapi/extensions/core/filter/request.py b/stac_fastapi/extensions/stac_fastapi/extensions/core/filter/request.py index afd5b947c..26e8b5797 100644 --- a/stac_fastapi/extensions/stac_fastapi/extensions/core/filter/request.py +++ b/stac_fastapi/extensions/stac_fastapi/extensions/core/filter/request.py @@ -1,13 +1,28 @@ """Filter extension request models.""" +from enum import Enum from typing import Any, Dict, Optional import attr -from pydantic import BaseModel +from pydantic import BaseModel, Field from stac_fastapi.types.search import APIRequest +class FilterLang(str, Enum): + """Choices for filter-lang value in a POST request. + + Based on https://github.com/radiantearth/stac-api-spec/tree/master/fragments/filter#queryables + + Note the addition of cql2-json, which is used by the pgstac backend, + but is not included in the spec above. + """ + + cql_json = "cql-json" + cql2_json = "cql2-json" + cql_text = "cql-text" + + @attr.s class FilterExtensionGetRequest(APIRequest): """Filter extension GET request model.""" @@ -19,3 +34,5 @@ class FilterExtensionPostRequest(BaseModel): """Filter extension POST request model.""" filter: Optional[Dict[str, Any]] = None + filter_crs: Optional[str] = Field(alias="filter-crs", default=None) + filter_lang: Optional[FilterLang] = Field(alias="filter-lang", default=None) diff --git a/stac_fastapi/pgstac/stac_fastapi/pgstac/core.py b/stac_fastapi/pgstac/stac_fastapi/pgstac/core.py index c0ba8e183..b05afce51 100644 --- a/stac_fastapi/pgstac/stac_fastapi/pgstac/core.py +++ b/stac_fastapi/pgstac/stac_fastapi/pgstac/core.py @@ -120,7 +120,7 @@ async def _search_base( pool = request.app.state.readpool # pool = kwargs["request"].app.state.readpool - req = search_request.json(exclude_none=True) + req = search_request.json(exclude_none=True, by_alias=True) try: async with pool.acquire() as conn: diff --git a/stac_fastapi/pgstac/stac_fastapi/pgstac/types/search.py b/stac_fastapi/pgstac/stac_fastapi/pgstac/types/search.py index a13126f1e..e64221830 100644 --- a/stac_fastapi/pgstac/stac_fastapi/pgstac/types/search.py +++ b/stac_fastapi/pgstac/stac_fastapi/pgstac/types/search.py @@ -1,6 +1,6 @@ """stac_fastapi.types.search module.""" -from typing import Optional +from typing import Dict, Optional from pydantic import validator @@ -14,6 +14,7 @@ class PgstacSearch(BaseSearchPostRequest): """ datetime: Optional[str] = None + conf: Optional[Dict] = None @validator("datetime") def validate_datetime(cls, v):