Generate rest api using swagger (#107)
Fix https://github.com/streamnative/pulsar-manager/issues/105
Add support for swagger
Add support for swagger UI
Visit http://localhost:8000/swagger-ui.html
diff --git a/build.gradle b/build.gradle
index f57d37a..7e466bc 100644
--- a/build.gradle
+++ b/build.gradle
@@ -72,5 +72,7 @@
compile group: 'org.mockito', name: 'mockito-core', version: mockitoVersion
compile group: 'com.google.guava', name: 'guava', version: guavaVersion
compile group: 'org.apache.pulsar', name: 'pulsar-client', version: pulsarVersion
+ compile group: 'io.springfox', name: 'springfox-swagger2', version: swagger2Version
+ compile group: 'io.springfox', name: 'springfox-swagger-ui', version: swaggeruiVersion
compileOnly group: 'org.projectlombok', name: 'lombok', version: lombokVersion
}
diff --git a/gradle.properties b/gradle.properties
index dd2301b..da5002b 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -8,4 +8,6 @@
pageHelperVersion=1.2.4
mockitoVersion=1.10.19
guavaVersion=21.0
-pulsarVersion=2.5.0-1b64a6e1f
\ No newline at end of file
+pulsarVersion=2.5.0-1b64a6e1f
+swagger2Version=2.9.2
+swaggeruiVersion=2.9.2
\ No newline at end of file
diff --git a/src/main/java/com/manager/pulsar/controller/TenantsController.java b/src/main/java/com/manager/pulsar/controller/TenantsController.java
index e3a1579..b33b76e 100644
--- a/src/main/java/com/manager/pulsar/controller/TenantsController.java
+++ b/src/main/java/com/manager/pulsar/controller/TenantsController.java
@@ -14,26 +14,58 @@
package com.manager.pulsar.controller;
import com.github.pagehelper.Page;
+import com.google.common.collect.Maps;
import com.manager.pulsar.entity.TenantsEntity;
import com.manager.pulsar.entity.TenantsRepository;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.hibernate.validator.constraints.Range;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
+import javax.validation.constraints.Min;
+import java.util.Map;
+
+/**
+ * Tenant Query class.
+ */
@RestController
+@RequestMapping(value = "/pulsar-manager/admin/v2")
+@Api(description = "Support more flexible queries to tenants.")
+@Validated
public class TenantsController {
@Autowired
private TenantsRepository tenantsRepository;
+ @ApiOperation(value = "Get the list of existing tenants, support paging, the default is 10 per page")
+ @ApiResponses({
+ @ApiResponse(code = 200, message = "ok"),
+ @ApiResponse(code = 404, message = "Not found"),
+ @ApiResponse(code = 500, message = "Internal server error")
+ })
@RequestMapping(value = "/tenants", method = RequestMethod.GET)
- public Page<TenantsEntity> getTenants(
- @RequestParam(name = "pageNum", defaultValue = "1")
+ public ResponseEntity<Map<String, Object>> getTenants(
+ @ApiParam(value = "page_num", defaultValue = "1", example = "1")
+ @RequestParam(name = "page_num", defaultValue = "1")
+ @Min(value = 1, message = "page_num is incorrect, should be greater than 0.")
Integer pageNum,
- @RequestParam(name="pageSize", defaultValue = "10")
+ @ApiParam(value = "page_size", defaultValue = "10", example = "10")
+ @RequestParam(name="page_size", defaultValue = "10")
+ @Range(min = 1, max = 1000, message = "page_size is incorrect, should be greater than 0 and less than 1000.")
Integer pageSize) {
- return tenantsRepository.getTenantsList(pageNum, pageSize);
+ Map<String, Object> result = Maps.newHashMap();
+ Page<TenantsEntity> tenantsEntities = tenantsRepository.getTenantsList(pageNum, pageSize);
+ result.put("total", tenantsEntities.getTotal());
+ result.put("data", tenantsEntities);
+ return ResponseEntity.ok(result);
}
}
diff --git a/src/main/java/com/manager/pulsar/swagger/SwaggerConfig.java b/src/main/java/com/manager/pulsar/swagger/SwaggerConfig.java
new file mode 100644
index 0000000..6dd74be
--- /dev/null
+++ b/src/main/java/com/manager/pulsar/swagger/SwaggerConfig.java
@@ -0,0 +1,46 @@
+/**
+ * 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 com.manager.pulsar.swagger;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * Swagger config class.
+ */
+@Configuration
+@EnableSwagger2
+public class SwaggerConfig {
+
+ @Bean
+ public Docket createRestApi() {
+ return new Docket(DocumentationType.SWAGGER_2)
+ .apiInfo(apiInfo())
+ .select()
+ .apis(RequestHandlerSelectors.basePackage("com.manager.pulsar.controller"))
+ .paths(PathSelectors.any())
+ .build();
+ }
+
+ private ApiInfo apiInfo() {
+ return new ApiInfoBuilder().title("Pulsar manager custom rest api").version("0.1").build();
+ }
+}