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