From c051034d0d97c0d9dca1a972a00d3ad1898aeaaa Mon Sep 17 00:00:00 2001 From: amber Date: Thu, 27 Aug 2026 14:53:43 +1000 Subject: [PATCH] feat: whitelist creation,revision,citation,license in collections properties filter --- .../core/model/enumeration/CQLFields.java | 20 +++++++++++++++++++ .../model/enumeration/StacBasicField.java | 4 +++- .../core/model/enumeration/StacSummeries.java | 2 ++ .../server/service/ElasticSearchTest.java | 18 +++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/CQLFields.java b/server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/CQLFields.java index bda8d334..17a41318 100644 --- a/server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/CQLFields.java +++ b/server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/CQLFields.java @@ -282,6 +282,26 @@ public enum CQLFields implements CQLFieldsInterface { StacSummeries.Statement.displayField, null, null), + creation( + StacSummeries.Creation.searchField, + StacSummeries.Creation.displayField, + null, + null), + revision( + StacSummeries.Revision.searchField, + StacSummeries.Revision.displayField, + null, + null), + citation( + StacBasicField.Citation.searchField, + StacBasicField.Citation.displayField, + null, + null), + license( + StacBasicField.License.searchField, + StacBasicField.License.displayField, + null, + null), ; private final String searchField; diff --git a/server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/StacBasicField.java b/server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/StacBasicField.java index 8556e1bc..a8b16a5b 100644 --- a/server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/StacBasicField.java +++ b/server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/StacBasicField.java @@ -25,7 +25,9 @@ public enum StacBasicField { LinksAiRole("links.ai:role", "links.ai:role"), Collection("collection", "collection", "collection.keyword"), AssetsSummary("assets", "assets"), - Themes("themes", "themes") + Themes("themes", "themes"), + License("license", "license"), + Citation("sci:citation", "sci:citation") ; // Field that use to do sort, elastic search treat FieldData (searchField) differently, a searchField is not diff --git a/server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/StacSummeries.java b/server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/StacSummeries.java index 842ab4d6..4cdb30bc 100644 --- a/server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/StacSummeries.java +++ b/server/src/main/java/au/org/aodn/ogcapi/server/core/model/enumeration/StacSummeries.java @@ -9,6 +9,8 @@ public enum StacSummeries { TemporalStart("summaries.temporal.start", ""), TemporalEnd("summaries.temporal.end", ""), Temporal("summaries.temporal", "extent.temporal", "summaries.temporal", List.of(TemporalStart, TemporalEnd)), + Creation("summaries.creation", "summaries.creation"), + Revision("summaries.revision", "summaries.revision"), UpdateFrequency("summaries.update_frequency", "summaries.update_frequency"), AiUpdateFrequency("summaries.ai:update_frequency", "summaries.ai:update_frequency"), DatasetProvider("summaries.dataset_provider", "summaries.dataset_provider"), diff --git a/server/src/test/java/au/org/aodn/ogcapi/server/service/ElasticSearchTest.java b/server/src/test/java/au/org/aodn/ogcapi/server/service/ElasticSearchTest.java index fe75737b..7cb3dbef 100644 --- a/server/src/test/java/au/org/aodn/ogcapi/server/service/ElasticSearchTest.java +++ b/server/src/test/java/au/org/aodn/ogcapi/server/service/ElasticSearchTest.java @@ -58,6 +58,24 @@ public void searchByParametersWithoutDoubleQuote() throws Exception { assertTrue(capturingSearch.should.get(0).isMatch(), "fuzzy_title should be MatchQuery"); } + // The portal SEO pipeline requests these in bulk to build Dataset JSON-LD + @Test + public void seoPropertiesMapToStacFields() throws Exception { + CapturingElasticSearch capturingSearch = new CapturingElasticSearch(mockClient); + + capturingSearch.searchByParameters( + List.of("temperature"), + null, + List.of("id", "title", "description", "bbox", "temporal", "themes", + "providers", "creation", "revision", "citation", "license"), + "-score,-rank", + CQLCrsType.EPSG4326); + + List includes = capturingSearch.normalRequest.source().filter().includes(); + assertTrue(includes.containsAll(List.of( + "summaries.creation", "summaries.revision", "sci:citation", "license"))); + } + @Test public void emptySearchByParametersMatchesSearchAllCollections() throws Exception { CapturingElasticSearch capturingSearch = new CapturingElasticSearch(mockClient);