diff --git a/server/src/main/java/au/org/aodn/ogcapi/server/core/mapper/Converter.java b/server/src/main/java/au/org/aodn/ogcapi/server/core/mapper/Converter.java index 40e5ffcf..592b5c5d 100644 --- a/server/src/main/java/au/org/aodn/ogcapi/server/core/mapper/Converter.java +++ b/server/src/main/java/au/org/aodn/ogcapi/server/core/mapper/Converter.java @@ -119,6 +119,7 @@ default Collection getCollection(D m, Filter fil .title(l.getTitle()) .description(l.getDescription()) .aiGroup(l.getAiGroup()) + .aiRole(l.getAiRole()) ) .toList() ); diff --git a/server/src/main/java/au/org/aodn/ogcapi/server/core/model/ExtendedLink.java b/server/src/main/java/au/org/aodn/ogcapi/server/core/model/ExtendedLink.java index 1dce4263..774e000b 100644 --- a/server/src/main/java/au/org/aodn/ogcapi/server/core/model/ExtendedLink.java +++ b/server/src/main/java/au/org/aodn/ogcapi/server/core/model/ExtendedLink.java @@ -5,6 +5,8 @@ import lombok.Getter; import lombok.Setter; +import java.util.List; + @Getter @Setter public class ExtendedLink extends Link { @@ -12,6 +14,9 @@ public class ExtendedLink extends Link { @JsonProperty("ai:group") private String aiGroup; + @JsonProperty("ai:role") + private List aiRole; + @JsonProperty("description") private String description; @@ -24,6 +29,11 @@ public ExtendedLink aiGroup(String aiGroup) { return this; } + public ExtendedLink aiRole(List aiRole) { + this.aiRole = aiRole; + return this; + } + public ExtendedLink description(String description) { this.description = description; return this; diff --git a/server/src/main/java/au/org/aodn/ogcapi/server/core/model/LinkModel.java b/server/src/main/java/au/org/aodn/ogcapi/server/core/model/LinkModel.java index 527b6d35..17533bdf 100644 --- a/server/src/main/java/au/org/aodn/ogcapi/server/core/model/LinkModel.java +++ b/server/src/main/java/au/org/aodn/ogcapi/server/core/model/LinkModel.java @@ -7,6 +7,8 @@ import lombok.Data; import lombok.NoArgsConstructor; +import java.util.List; + @Data @Builder @NoArgsConstructor @@ -20,6 +22,9 @@ public class LinkModel { @JsonProperty("ai:group") protected String aiGroup; + @JsonProperty("ai:role") + protected List aiRole; + @JsonProperty("description") protected String description; 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 d39c779c..6d18a300 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 @@ -194,6 +194,20 @@ public enum CQLFields implements CQLFieldsInterface { )._toQuery(), null ), + links_airole_contains( + StacBasicField.LinksAiRole.searchField, + StacBasicField.LinksAiRole.displayField, + (literal) -> NestedQuery.of(m -> m + .path(StacBasicField.Links.searchField) // "links" + .query(q -> q + .term(t -> t + .field(StacBasicField.LinksAiRole.searchField) // "links.ai:role" + .value(literal) + ) + ) + )._toQuery(), + null + ), credit_contains( StacSummeries.Credits.searchField, StacSummeries.Credits.displayField, 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 752cdcd0..8556e1bc 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 @@ -22,6 +22,7 @@ public enum StacBasicField { ), Links("links", "links"), LinksTitle("links.title", "links.title"), + LinksAiRole("links.ai:role", "links.ai:role"), Collection("collection", "collection", "collection.keyword"), AssetsSummary("assets", "assets"), Themes("themes", "themes") diff --git a/server/src/test/java/au/org/aodn/ogcapi/server/core/mapper/StacToCollectionTest.java b/server/src/test/java/au/org/aodn/ogcapi/server/core/mapper/StacToCollectionTest.java index 6a6c7339..5f258421 100644 --- a/server/src/test/java/au/org/aodn/ogcapi/server/core/mapper/StacToCollectionTest.java +++ b/server/src/test/java/au/org/aodn/ogcapi/server/core/mapper/StacToCollectionTest.java @@ -78,6 +78,7 @@ public void verifyAddingPropertyWorks() { .type("text/html") .title("Data Link") .aiGroup("data-access") + .aiRole(List.of("download")) .description("description") .build(); var link2 = LinkModel.builder() @@ -160,6 +161,13 @@ public void verifyAddingPropertyWorks() { Assertions.assertEquals(parameterVocabs, collection.getProperties().get(CollectionProperty.parameterVocabs)); Assertions.assertNotNull(collection.getLinks()); Assertions.assertEquals(3, collection.getLinks().size()); + + ExtendedLink convertedLink1 = (ExtendedLink) collection.getLinks().stream() + .filter(l -> "related".equals(l.getRel())) + .findFirst() + .orElseThrow(); + + Assertions.assertEquals(List.of("download"), convertedLink1.getAiRole()); } @Test diff --git a/server/src/test/resources/portal_records_index_schema.json b/server/src/test/resources/portal_records_index_schema.json index 31015cc7..b0d9dec7 100644 --- a/server/src/test/resources/portal_records_index_schema.json +++ b/server/src/test/resources/portal_records_index_schema.json @@ -182,6 +182,9 @@ }, "ai:group": { "type": "keyword" + }, + "ai:role": { + "type": "keyword" } } }