From d6eeef618e0df81ed55e0c78ca7c11b8d6a3d3ae Mon Sep 17 00:00:00 2001
From: neelesh thakur <nthakur4@slb.com>
Date: Fri, 21 Aug 2020 11:09:00 -0400
Subject: [PATCH] add swagger

---
 notification-core/pom.xml                     | 24 +++++++
 .../auth/AuthorizationFilter.java             | 10 +++
 .../notification/swagger/HomeController.java  | 14 ++++
 .../swagger/SwaggerDocumentationConfig.java   | 69 +++++++++++++++++++
 .../auth/AuthorizationFilterTest.java         |  3 +
 .../swagger/HomeControllerTest.java           | 33 +++++++++
 6 files changed, 153 insertions(+)
 create mode 100644 notification-core/src/main/java/org/opengroup/osdu/notification/swagger/HomeController.java
 create mode 100644 notification-core/src/main/java/org/opengroup/osdu/notification/swagger/SwaggerDocumentationConfig.java
 create mode 100644 notification-core/src/test/java/org/opengroup/osdu/notification/swagger/HomeControllerTest.java

diff --git a/notification-core/pom.xml b/notification-core/pom.xml
index 69d5f99b3..771a747ec 100644
--- a/notification-core/pom.xml
+++ b/notification-core/pom.xml
@@ -37,6 +37,7 @@
         <java.version>8</java.version>
         <maven.compiler.target>${java.version}</maven.compiler.target>
         <maven.compiler.source>${java.version}</maven.compiler.source>
+        <springfox-version>2.7.0</springfox-version>
     </properties>
 
     <repositories>
@@ -187,6 +188,24 @@
             <version>2.8.5</version>
         </dependency>
 
+        <!-- swagger dependencies -->
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>${springfox-version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.google.guava</groupId>
+                    <artifactId>guava</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>${springfox-version}</version>
+        </dependency>
+
         <dependency>
             <groupId>org.powermock</groupId>
             <artifactId>powermock-api-mockito2</artifactId>
@@ -211,6 +230,11 @@
             <version>4.12</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
diff --git a/notification-core/src/main/java/org/opengroup/osdu/notification/auth/AuthorizationFilter.java b/notification-core/src/main/java/org/opengroup/osdu/notification/auth/AuthorizationFilter.java
index 36bfc8039..2eb23d060 100644
--- a/notification-core/src/main/java/org/opengroup/osdu/notification/auth/AuthorizationFilter.java
+++ b/notification-core/src/main/java/org/opengroup/osdu/notification/auth/AuthorizationFilter.java
@@ -28,6 +28,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.web.context.annotation.RequestScope;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.Arrays;
 
 @Component("authorizationFilter")
@@ -35,6 +36,8 @@ import java.util.Arrays;
 public class AuthorizationFilter {
     private static final String BEARER_PREFIX = "Bearer ";
 
+    @Autowired
+    private HttpServletRequest request;
     @Autowired
     private IAuthorizationService authService;
     @Autowired
@@ -51,6 +54,13 @@ public class AuthorizationFilter {
             requestInfoExt.assignPartitionIdIfNotInHeader();
         }
 
+        String path = request.getServletPath();
+        if ("GET".equals(request.getMethod())) {
+            if (path.equals("/swagger-ui.html")) {
+                return true;
+            }
+        }
+
         if (Arrays.asList(requiredRoles).contains(Config.CRON) && requestInfoExt.isCronRequest()) {
             dpsHeaders.put(DpsHeaders.USER_EMAIL, Config.CRON);
             requestInfoExt.setHeaders(dpsHeaders);
diff --git a/notification-core/src/main/java/org/opengroup/osdu/notification/swagger/HomeController.java b/notification-core/src/main/java/org/opengroup/osdu/notification/swagger/HomeController.java
new file mode 100644
index 000000000..3e568ff05
--- /dev/null
+++ b/notification-core/src/main/java/org/opengroup/osdu/notification/swagger/HomeController.java
@@ -0,0 +1,14 @@
+package org.opengroup.osdu.notification.swagger;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+@Controller
+public class HomeController {
+
+    @RequestMapping(value = {"/", "/swagger"})
+    public String swagger() {
+        System.out.println("swagger-ui.html");
+        return "redirect:swagger-ui.html";
+    }
+}
diff --git a/notification-core/src/main/java/org/opengroup/osdu/notification/swagger/SwaggerDocumentationConfig.java b/notification-core/src/main/java/org/opengroup/osdu/notification/swagger/SwaggerDocumentationConfig.java
new file mode 100644
index 000000000..2aea7a909
--- /dev/null
+++ b/notification-core/src/main/java/org/opengroup/osdu/notification/swagger/SwaggerDocumentationConfig.java
@@ -0,0 +1,69 @@
+package org.opengroup.osdu.notification.swagger;
+
+import org.opengroup.osdu.core.common.model.http.DpsHeaders;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ParameterBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.schema.ModelRef;
+import springfox.documentation.service.ApiKey;
+import springfox.documentation.service.AuthorizationScope;
+import springfox.documentation.service.Parameter;
+import springfox.documentation.service.SecurityReference;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.contexts.SecurityContext;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@Configuration
+@EnableSwagger2
+public class SwaggerDocumentationConfig {
+    public static final String AUTHORIZATION_HEADER = "Authorization";
+    public static final String DEFAULT_INCLUDE_PATTERN = "/.*";
+
+    @Bean
+    public Docket api() {
+        ParameterBuilder builder = new ParameterBuilder();
+        List<Parameter> parameters = new ArrayList<>();
+        builder.name(DpsHeaders.DATA_PARTITION_ID)
+                .description("tenant")
+                .defaultValue("common")
+                .modelRef(new ModelRef("string"))
+                .parameterType("header")
+                .required(true)
+                .build();
+        parameters.add(builder.build());
+        return new Docket(DocumentationType.SWAGGER_2)
+                .globalOperationParameters(parameters)
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("org.opengroup.osdu.notification.api"))
+                .build()
+                .securityContexts(Collections.singletonList(securityContext()))
+                .securitySchemes(Collections.singletonList(apiKey()));
+    }
+
+    private ApiKey apiKey() {
+        return new ApiKey("JWT", AUTHORIZATION_HEADER, "header");
+    }
+
+    private SecurityContext securityContext() {
+        return SecurityContext.builder()
+                .securityReferences(defaultAuth())
+                .forPaths(PathSelectors.regex(DEFAULT_INCLUDE_PATTERN))
+                .build();
+    }
+
+    List<SecurityReference> defaultAuth() {
+        AuthorizationScope authorizationScope
+                = new AuthorizationScope("global", "accessEverything");
+        AuthorizationScope[] authorizationScopes =
+                new AuthorizationScope[]{authorizationScope};
+        return Collections.singletonList(
+                new SecurityReference("JWT", authorizationScopes));
+    }
+}
\ No newline at end of file
diff --git a/notification-core/src/test/java/org/opengroup/osdu/notification/auth/AuthorizationFilterTest.java b/notification-core/src/test/java/org/opengroup/osdu/notification/auth/AuthorizationFilterTest.java
index 50a46790c..cbf48fb7c 100644
--- a/notification-core/src/test/java/org/opengroup/osdu/notification/auth/AuthorizationFilterTest.java
+++ b/notification-core/src/test/java/org/opengroup/osdu/notification/auth/AuthorizationFilterTest.java
@@ -31,6 +31,7 @@ import org.opengroup.osdu.notification.utils.Config;
 import org.opengroup.osdu.notification.provider.interfaces.IServiceAccountValidator;
 import org.powermock.modules.junit4.PowerMockRunner;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -53,6 +54,8 @@ public class AuthorizationFilterTest {
     @Mock
     private DpsHeaders headers;
     @Mock
+    private HttpServletRequest request;
+    @Mock
     private RequestInfoExt requestInfo;
     @Mock
     private IAuthorizationService authorizationService;
diff --git a/notification-core/src/test/java/org/opengroup/osdu/notification/swagger/HomeControllerTest.java b/notification-core/src/test/java/org/opengroup/osdu/notification/swagger/HomeControllerTest.java
new file mode 100644
index 000000000..6bd3e8084
--- /dev/null
+++ b/notification-core/src/test/java/org/opengroup/osdu/notification/swagger/HomeControllerTest.java
@@ -0,0 +1,33 @@
+package org.opengroup.osdu.notification.swagger;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+import static org.springframework.test.web.servlet.setup.MockMvcBuilders.standaloneSetup;
+
+public class HomeControllerTest {
+
+    private MockMvc mockMvc;
+
+    @Before
+    public void setup() {
+        mockMvc = standaloneSetup(HomeController.class).build();
+    }
+
+    @Test
+    public void testSwaggerFound() throws Exception {
+        mockMvc.perform(get("/swagger")
+                .contentType(MediaType.APPLICATION_JSON)
+                .accept(MediaType.APPLICATION_JSON))
+                .andExpect(status().isFound());
+
+        mockMvc.perform(get("/")
+                .contentType(MediaType.APPLICATION_JSON)
+                .accept(MediaType.APPLICATION_JSON))
+                .andExpect(status().isFound());
+    }
+}
-- 
GitLab