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