From 1a257f336872bc9627206b1150313d04125168f9 Mon Sep 17 00:00:00 2001 From: Terence Tuhinanshu Date: Tue, 9 Dec 2025 16:27:55 -0500 Subject: [PATCH 1/4] Fix STAC search endpoint reference --- pygeoapi/api/stac.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pygeoapi/api/stac.py b/pygeoapi/api/stac.py index ebf86b6e8..f86bba2ac 100644 --- a/pygeoapi/api/stac.py +++ b/pygeoapi/api/stac.py @@ -284,7 +284,7 @@ def landing_page(api: API, 'rel': 'search', 'type': FORMAT_TYPES[F_JSON], 'title': l10n.translate('STAC API search', request.locale), - 'href': f"{api.base_url}/stac-api//search?f={F_JSON}" + 'href': f"{api.base_url}/stac-api/search?f={F_JSON}" }] return headers, status, to_json(content, api.pretty_print) From 3a260c1536c38fdae70a9377d2e4bb1240fae98f Mon Sep 17 00:00:00 2001 From: Terence Tuhinanshu Date: Tue, 9 Dec 2025 16:55:21 -0500 Subject: [PATCH 2/4] assets should be dict, not list --- pygeoapi/api/stac.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pygeoapi/api/stac.py b/pygeoapi/api/stac.py index f86bba2ac..a2a63c8ee 100644 --- a/pygeoapi/api/stac.py +++ b/pygeoapi/api/stac.py @@ -379,9 +379,11 @@ def search(api: API, request: Union[APIRequest, Any]) -> Tuple[dict, int, str]: geom = from_geojson(json.dumps(feature['geometry'])) feature['bbox'] = geom.bounds - for la in ['links', 'assets']: - if feature.get(la) is None: - feature[la] = [] + if feature.get('links') is None: + feature['links'] = [] + + if feature.get('assets') is None: + feature['assets'] = {} stac_api_response['numberReturned'] = len(stac_api_response['features']) From 765c2bd006a79fc45902ac66ed68f7c0015dfd25 Mon Sep 17 00:00:00 2001 From: Terence Tuhinanshu Date: Tue, 9 Dec 2025 17:14:23 -0500 Subject: [PATCH 3/4] Surface links, assets to top level --- pygeoapi/api/stac.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pygeoapi/api/stac.py b/pygeoapi/api/stac.py index a2a63c8ee..4e3cba3f0 100644 --- a/pygeoapi/api/stac.py +++ b/pygeoapi/api/stac.py @@ -380,10 +380,16 @@ def search(api: API, request: Union[APIRequest, Any]) -> Tuple[dict, int, str]: feature['bbox'] = geom.bounds if feature.get('links') is None: - feature['links'] = [] + feature['links'] = feature\ + .get('properties', {})\ + .get('content', {})\ + .get('links', []) if feature.get('assets') is None: - feature['assets'] = {} + feature['assets'] = feature\ + .get('properties', {})\ + .get('content', {})\ + .get('assets', {}) stac_api_response['numberReturned'] = len(stac_api_response['features']) From a33a862a06f46424bf70b203c91b8cf73a138ce9 Mon Sep 17 00:00:00 2001 From: Terence Tuhinanshu Date: Tue, 16 Dec 2025 16:22:30 -0500 Subject: [PATCH 4/4] Fix datetime response --- pygeoapi/api/stac.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pygeoapi/api/stac.py b/pygeoapi/api/stac.py index 4e3cba3f0..ef936def4 100644 --- a/pygeoapi/api/stac.py +++ b/pygeoapi/api/stac.py @@ -496,18 +496,20 @@ def get_temporal(feature: dict) -> dict: if datetime_ is None and None not in [start_datetime, end_datetime]: LOGGER.debug('Temporal range partially exists') elif datetime_ is not None: + value['datetime'] = datetime_ LOGGER.debug('Temporal instant exists') LOGGER.debug('Attempting to derive temporal from GeoJSON feature') LOGGER.debug(feature) - if feature.get('time') is not None: + if not value.get('datetime') and feature.get('time') is not None: if feature['time'].get('timestamp') is not None: value['datetime'] = feature['time']['timestamp'] if feature['time'].get('interval') is not None: value['start_datetime'] = feature['time']['interval'][0] value['end_datetime'] = feature['time']['interval'][1] - if feature['properties'].get('created') is not None: + if not value.get('datetime') \ + and feature['properties'].get('created') is not None: value['datetime'] = feature['properties']['created'] if not value: