diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/apim/core/documentation/model/ApiFreemarkerTemplate.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/apim/core/documentation/model/ApiFreemarkerTemplate.java index 1f0c6d7117b..577bb49d3f1 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/apim/core/documentation/model/ApiFreemarkerTemplate.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/apim/core/documentation/model/ApiFreemarkerTemplate.java @@ -39,7 +39,7 @@ public class ApiFreemarkerTemplate { private ApiType type = ApiType.PROXY; private String picture; - private PrimaryOwnerEntity primaryOwner; + private PrimaryOwnerApiTemplateData primaryOwner; @Builder.Default private Api.Visibility visibility = Api.Visibility.PRIVATE; @@ -97,6 +97,6 @@ public ApiFreemarkerTemplate(Api api, Map metadata, PrimaryOwner } this.metadata = metadata; - this.primaryOwner = primaryOwner; + this.primaryOwner = PrimaryOwnerApiTemplateData.from(primaryOwner); } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/apim/core/documentation/model/PrimaryOwnerApiTemplateData.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/apim/core/documentation/model/PrimaryOwnerApiTemplateData.java new file mode 100644 index 00000000000..178c479a0dc --- /dev/null +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/main/java/io/gravitee/apim/core/documentation/model/PrimaryOwnerApiTemplateData.java @@ -0,0 +1,42 @@ +/* + * Copyright © 2015 The Gravitee team (http://gravitee.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.gravitee.apim.core.documentation.model; + +import io.gravitee.apim.core.membership.model.PrimaryOwnerEntity; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Builder +@AllArgsConstructor +@Data +public class PrimaryOwnerApiTemplateData { + + private String id; + private String displayName; + private String email; + private String type; + + public static PrimaryOwnerApiTemplateData from(PrimaryOwnerEntity primaryOwner) { + return PrimaryOwnerApiTemplateData + .builder() + .id(primaryOwner.id()) + .displayName(primaryOwner.displayName()) + .email(primaryOwner.email()) + .type(primaryOwner.type().name()) + .build(); + } +} diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/apim/core/documentation/model/ApiFreemarkerTemplateTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/apim/core/documentation/model/ApiFreemarkerTemplateTest.java index 25e804cfdf7..5883448768f 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/apim/core/documentation/model/ApiFreemarkerTemplateTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/apim/core/documentation/model/ApiFreemarkerTemplateTest.java @@ -54,7 +54,7 @@ void should_convert_v4_api_to_api_freemarker_template() { soft.assertThat(api.getVisibility().toString()).isEqualTo(Visibility.PUBLIC.toString()); soft.assertThat(api.getVersion()).isEqualTo("1.0.0"); soft.assertThat(api.getMetadata()).isEqualTo(metadata); - soft.assertThat(api.getPrimaryOwner()).isEqualTo(primaryOwner); + soft.assertThat(api.getPrimaryOwner()).isEqualTo(PrimaryOwnerApiTemplateData.from(primaryOwner)); }); } @@ -83,7 +83,7 @@ void should_convert_v2_api_to_repository() { soft.assertThat(api.getVisibility().toString()).isEqualTo(Visibility.PUBLIC.toString()); soft.assertThat(api.getVersion()).isEqualTo("1.0.0"); soft.assertThat(api.getMetadata()).isEqualTo(metadata); - soft.assertThat(api.getPrimaryOwner()).isEqualTo(primaryOwner); + soft.assertThat(api.getPrimaryOwner()).isEqualTo(PrimaryOwnerApiTemplateData.from(primaryOwner)); }); } } diff --git a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/apim/infra/domain_service/documentation/FreemarkerTemplateResolverTest.java b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/apim/infra/domain_service/documentation/FreemarkerTemplateResolverTest.java index 720c6d81bdd..958746f95e7 100644 --- a/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/apim/infra/domain_service/documentation/FreemarkerTemplateResolverTest.java +++ b/gravitee-apim-rest-api/gravitee-apim-rest-api-service/src/test/java/io/gravitee/apim/infra/domain_service/documentation/FreemarkerTemplateResolverTest.java @@ -21,13 +21,20 @@ import io.gravitee.apim.core.api.model.Api; import io.gravitee.apim.core.documentation.exception.InvalidPageContentException; import io.gravitee.apim.core.documentation.model.ApiFreemarkerTemplate; +import io.gravitee.apim.core.documentation.model.PrimaryOwnerApiTemplateData; +import io.gravitee.apim.core.membership.model.PrimaryOwnerEntity; import io.gravitee.definition.model.DefinitionVersion; import io.gravitee.definition.model.Proxy; import io.gravitee.definition.model.VirtualHost; import java.util.ArrayList; import java.util.Date; import java.util.Map; +import java.util.Set; +import java.util.stream.Stream; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; class FreemarkerTemplateResolverTest { @@ -84,7 +91,7 @@ void should_throw_exception_if_template_accesses_unknown_data() { @Test void should_throw_exception_if_template_accesses_unknown_property() { - Api api = Api.builder().id("id").name("api-name").version("1.0").build(); + var api = ApiFreemarkerTemplate.builder().id("id").name("api-name").version("1.0").build(); var throwable = catchThrowable(() -> resolver.resolveTemplate("Documentation for ${api.name} ${api.vvv} (${api.id})", Map.of("api", api)) @@ -92,4 +99,45 @@ void should_throw_exception_if_template_accesses_unknown_property() { assertThat(throwable).isInstanceOf(InvalidPageContentException.class); assertThat(throwable.getCause().getMessage()).contains("api.vvv"); } + + @ParameterizedTest + @MethodSource("provideParameters") + void should_render_api_fields(final String fieldName, final String output) { + var po = PrimaryOwnerApiTemplateData.from( + new PrimaryOwnerEntity("id", "po email", "po display name", PrimaryOwnerEntity.Type.USER) + ); + + var api = ApiFreemarkerTemplate + .builder() + .id("api-id") + .name("api-name") + .description("api description") + .version("v1000") + .picture("a lovely picture") + .state(Api.LifecycleState.STARTED) + .visibility(Api.Visibility.PUBLIC) + .tags(Set.of("first tag")) + .metadata(Map.of("meta", "data")) + .primaryOwner(po) + .build(); + + assertThat(resolver.resolveTemplate("This is my " + fieldName + ": ${api." + fieldName + "}", Map.of("api", api))) + .isEqualTo("This is my " + fieldName + ": " + output); + } + + public static Stream provideParameters() { + return Stream.of( + Arguments.of("id", "api-id"), + Arguments.of("name", "api-name"), + Arguments.of("description", "api description"), + Arguments.of("version", "v1000"), + Arguments.of("metadata['meta']", "data"), + Arguments.of("picture", "a lovely picture"), + Arguments.of("state", "STARTED"), + Arguments.of("visibility", "PUBLIC"), + Arguments.of("tags[0]", "first tag"), + Arguments.of("primaryOwner.displayName", "po display name"), + Arguments.of("primaryOwner.email", "po email") + ); + } }