From 5229187d086f6a83e4fc98eee7dcf504b45ec6a4 Mon Sep 17 00:00:00 2001 From: Anthony Ittiyera Vazhappilly <avazhappilly@microsoft.com> Date: Fri, 19 Jan 2024 14:31:29 -0800 Subject: [PATCH] create feature flag to toggle enableFullSwaggerUrlProperty --- README.md | 6 + .../src/main/resources/application.properties | 3 + .../search/swagger/SwaggerConfiguration.java | 110 ++++++++++++++---- .../src/main/resources/swagger.properties | 1 + 4 files changed, 96 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index c5861d4b1..e31cf7604 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,12 @@ go-swagger brings to the go community a complete suite of fully-featured, high-p swagger generate client -f 'search_openapi.json' -A search_openapi ``` +#### Server Url(full path vs relative path) configuration +- `api.server.fullUrl.enabled=true` It will generate full server url in the OpenAPI swagger +- `api.server.fullUrl.enabled=false` It will generate only the contextPath only +- default value is false (Currently only in Azure it is enabled) +[Reference]:(https://springdoc.org/faq.html#_how_is_server_url_generated) + ### Maintenance * Indexer: * Cleanup indexes - Indexer has a cron job running which hits following url: diff --git a/provider/search-azure/src/main/resources/application.properties b/provider/search-azure/src/main/resources/application.properties index b04c40122..72cf7acd8 100644 --- a/provider/search-azure/src/main/resources/application.properties +++ b/provider/search-azure/src/main/resources/application.properties @@ -92,3 +92,6 @@ service.policy.id=${service_policy_id:osdu.partition["%s"].search} validation.spatial.longitude.enableExtendedRange=true redis.command.timeout=5 + +# To enable the full server path url in OpenAPI Swagger +api.server.fullUrl.enabled=${swaggerFullUrlEnabled:true} \ No newline at end of file diff --git a/search-core/src/main/java/org/opengroup/osdu/search/swagger/SwaggerConfiguration.java b/search-core/src/main/java/org/opengroup/osdu/search/swagger/SwaggerConfiguration.java index accf45d8d..a9bde1c44 100644 --- a/search-core/src/main/java/org/opengroup/osdu/search/swagger/SwaggerConfiguration.java +++ b/search-core/src/main/java/org/opengroup/osdu/search/swagger/SwaggerConfiguration.java @@ -1,40 +1,102 @@ package org.opengroup.osdu.search.swagger; -import io.swagger.v3.oas.annotations.OpenAPIDefinition; -import io.swagger.v3.oas.annotations.enums.SecuritySchemeType; -import io.swagger.v3.oas.annotations.info.Contact; -import io.swagger.v3.oas.annotations.info.Info; -import io.swagger.v3.oas.annotations.info.License; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.security.SecurityScheme; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.models.Components; +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Contact; +import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; import io.swagger.v3.oas.models.media.StringSchema; import io.swagger.v3.oas.models.parameters.Parameter; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; +import io.swagger.v3.oas.models.servers.Server; +import io.swagger.v3.oas.models.tags.Tag; import org.opengroup.osdu.core.common.model.http.DpsHeaders; import org.springdoc.core.customizers.OperationCustomizer; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; -@OpenAPIDefinition( - info = @Info( - title = "${api.title}", - description = "${api.description}", - version = "${api.version}", - contact = @Contact(name = "${api.contact.name}", email = "${api.contact.email}"), - license = @License(name = "${api.license.name}", url = "${api.license.url}")), - security = @SecurityRequirement(name = "Authorization"), - tags = { - @Tag(name = "search-api", description = "Service endpoints to search data in datalake"), - @Tag(name = "health-check-api", description = "Health Check API"), - @Tag(name = "info", description = "Version info endpoint") - } -) -@SecurityScheme(name = "Authorization", scheme = "bearer", bearerFormat = "Authorization", type = SecuritySchemeType.HTTP) @Configuration +@Profile("!noswagger") public class SwaggerConfiguration { + + @Value("${api.title}") + private String apiTitle; + + @Value("${api.description}") + private String apiDescription; + + @Value("${api.version}") + private String apiVersion; + + @Value("${api.contact.name}") + private String contactName; + + @Value("${api.contact.email}") + private String contactEmail; + + @Value("${api.license.name}") + private String licenseName; + + @Value("${api.license.url}") + private String licenseUrl; + + @Value("${api.server.url}") + private String apiServerUrl; + + @Value("${api.server.fullUrl.enabled:false}") + private boolean isServerFullUrlEnabled; + + @Bean + public OpenAPI customOpenAPI() { + + SecurityScheme securityScheme = new SecurityScheme() + .type(SecurityScheme.Type.HTTP) + .scheme("bearer") + .bearerFormat("Authorization") + .in(SecurityScheme.In.HEADER) + .name("Authorization"); + final String securitySchemeName = "Authorization"; + SecurityRequirement securityRequirement = new SecurityRequirement().addList(securitySchemeName); + Components components = new Components().addSecuritySchemes(securitySchemeName, securityScheme); + + OpenAPI openAPI = new OpenAPI() + .addSecurityItem(securityRequirement) + .components(components) + .info(apiInfo()) + .tags(tags()); + + if(isServerFullUrlEnabled) + return openAPI; + return openAPI + .servers(Arrays.asList(new Server().url(apiServerUrl))); + } + + private List<Tag> tags() { + List<Tag> tags = new ArrayList<>(); + tags.add(new Tag().name("search-api").description("Service endpoints to search data in datalake")); + tags.add(new Tag().name("health-check-api").description("Health Check API")); + tags.add(new Tag().name("info").description("Version info endpoint")); + return tags; + } + + private Info apiInfo() { + return new Info() + .title(apiTitle) + .description(apiDescription) + .version(apiVersion) + .license(new License().name(licenseName).url(licenseUrl)) + .contact(new Contact().name(contactName).email(contactEmail)); + } + @Bean - public OperationCustomizer customize() { + public OperationCustomizer operationCustomizer() { return (operation, handlerMethod) -> { Parameter dataPartitionId = new Parameter() .name(DpsHeaders.DATA_PARTITION_ID) diff --git a/search-core/src/main/resources/swagger.properties b/search-core/src/main/resources/swagger.properties index 0373dd78e..00bcad393 100644 --- a/search-core/src/main/resources/swagger.properties +++ b/search-core/src/main/resources/swagger.properties @@ -16,6 +16,7 @@ api.contact.name=OSDU Data Platform Team api.contact.email=dps@OSDU.org api.license.name=Apache 2.0 api.license.url=https://www.apache.org/licenses/LICENSE-2.0.html +api.server.url=${server.servlet.contextPath} #Search API related properties searchApi.queryRecords.summary=Queries the index for the input request criteria. -- GitLab