Browse Source

TB-50: Improve swagger configuration (#5)

pull/7/head
Igor Kulikov 10 years ago
committed by GitHub
parent
commit
b154f1a4fd
  1. 38
      application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java
  2. 13
      application/src/main/java/org/thingsboard/server/controller/AdminController.java
  3. 9
      application/src/main/java/org/thingsboard/server/controller/RuleController.java

38
application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java

@ -15,11 +15,15 @@
*/ */
package org.thingsboard.server.config; package org.thingsboard.server.config;
import com.fasterxml.classmate.ResolvedType;
import com.fasterxml.classmate.TypeResolver;
import com.fasterxml.jackson.databind.JsonNode;
import com.google.common.base.Predicate;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.thingsboard.server.common.data.security.Authority; import org.thingsboard.server.common.data.security.Authority;
import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors; import springfox.documentation.schema.AlternateTypeRule;
import springfox.documentation.service.*; import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.spi.service.contexts.SecurityContext;
@ -27,18 +31,33 @@ import springfox.documentation.spring.web.plugins.Docket;
import java.util.List; import java.util.List;
import static com.google.common.base.Predicates.and;
import static com.google.common.base.Predicates.not;
import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Lists.newArrayList;
import static springfox.documentation.builders.PathSelectors.regex;
@Configuration @Configuration
public class SwaggerConfiguration { public class SwaggerConfiguration {
@Bean @Bean
public Docket thingsboardApi() { public Docket thingsboardApi() {
TypeResolver typeResolver = new TypeResolver();
final ResolvedType jsonNodeType =
typeResolver.resolve(
JsonNode.class);
final ResolvedType stringType =
typeResolver.resolve(
String.class);
return new Docket(DocumentationType.SWAGGER_2) return new Docket(DocumentationType.SWAGGER_2)
.groupName("thingsboard") .groupName("thingsboard")
.apiInfo(apiInfo()) .apiInfo(apiInfo())
.alternateTypeRules(
new AlternateTypeRule(
jsonNodeType,
stringType))
.select() .select()
.paths(PathSelectors.any()) .paths(apiPaths())
.build() .build()
.securitySchemes(newArrayList(jwtTokenKey())) .securitySchemes(newArrayList(jwtTokenKey()))
.securityContexts(newArrayList(securityContext())); .securityContexts(newArrayList(securityContext()));
@ -51,10 +70,21 @@ public class SwaggerConfiguration {
private SecurityContext securityContext() { private SecurityContext securityContext() {
return SecurityContext.builder() return SecurityContext.builder()
.securityReferences(defaultAuth()) .securityReferences(defaultAuth())
.forPaths(PathSelectors.regex("/api.*")) .forPaths(securityPaths())
.build(); .build();
} }
private Predicate<String> apiPaths() {
return regex("/api.*");
}
private Predicate<String> securityPaths() {
return and(
regex("/api.*"),
not(regex("/api/noauth.*"))
);
}
List<SecurityReference> defaultAuth() { List<SecurityReference> defaultAuth() {
AuthorizationScope[] authorizationScopes = new AuthorizationScope[3]; AuthorizationScope[] authorizationScopes = new AuthorizationScope[3];
authorizationScopes[0] = new AuthorizationScope(Authority.SYS_ADMIN.name(), "System administrator"); authorizationScopes[0] = new AuthorizationScope(Authority.SYS_ADMIN.name(), "System administrator");
@ -67,7 +97,7 @@ public class SwaggerConfiguration {
private ApiInfo apiInfo() { private ApiInfo apiInfo() {
return new ApiInfoBuilder() return new ApiInfoBuilder()
.title("Thingsboard REST API") .title("Thingsboard REST API")
.description("For instructions how to authorize requests please visit <a href='http://thingsboard.io/docs/rest-auth'>Documentation page</a>") .description("For instructions how to authorize requests please visit <a href='http://thingsboard.io/docs/reference/rest-api/'>REST API documentation page</a>.")
.contact(new Contact("Thingsboard team", "http://thingsboard.io", "info@thingsboard.io")) .contact(new Contact("Thingsboard team", "http://thingsboard.io", "info@thingsboard.io"))
.license("Apache License Version 2.0") .license("Apache License Version 2.0")
.licenseUrl("https://github.com/thingsboard/thingsboard/blob/master/LICENSE") .licenseUrl("https://github.com/thingsboard/thingsboard/blob/master/LICENSE")

13
application/src/main/java/org/thingsboard/server/controller/AdminController.java

@ -15,7 +15,6 @@
*/ */
package org.thingsboard.server.controller; package org.thingsboard.server.controller;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -46,18 +45,6 @@ public class AdminController extends BaseController {
} }
@PreAuthorize("hasAuthority('SYS_ADMIN')") @PreAuthorize("hasAuthority('SYS_ADMIN')")
@ApiOperation(
value = "Save admin settings", notes = "Saves admin settings",
response = AdminSettings.class,
authorizations = {
@Authorization(value = "X-Authorization", scopes = {
@AuthorizationScope(scope = "SYS_ADMIN", description = "")
})})
@ApiResponses(value = {
@ApiResponse(code = 200, response = AdminSettings.class, message = "Admin settings successfully updated"),
@ApiResponse(code = 400, message = "Invalid admin settings payload supplied"),
@ApiResponse(code = 404, message = "Admin settings not found")}
)
@RequestMapping(value = "/settings", method = RequestMethod.POST) @RequestMapping(value = "/settings", method = RequestMethod.POST)
@ResponseBody @ResponseBody
public AdminSettings saveAdminSettings(@RequestBody AdminSettings adminSettings) throws ThingsboardException { public AdminSettings saveAdminSettings(@RequestBody AdminSettings adminSettings) throws ThingsboardException {

9
application/src/main/java/org/thingsboard/server/controller/RuleController.java

@ -15,9 +15,6 @@
*/ */
package org.thingsboard.server.controller; package org.thingsboard.server.controller;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -37,12 +34,6 @@ import java.util.List;
@RequestMapping("/api") @RequestMapping("/api")
public class RuleController extends BaseController { public class RuleController extends BaseController {
@ApiOperation(value = "getRuleById", nickname = "Get Rule By ID")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Success", response = RuleMetaData.class),
@ApiResponse(code = 401, message = "Unauthorized"),
@ApiResponse(code = 403, message = "Forbidden"),
@ApiResponse(code = 404, message = "Not Found")})
@PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')") @PreAuthorize("hasAnyAuthority('SYS_ADMIN', 'TENANT_ADMIN')")
@RequestMapping(value = "/rule/{ruleId}", method = RequestMethod.GET) @RequestMapping(value = "/rule/{ruleId}", method = RequestMethod.GET)
@ResponseBody @ResponseBody

Loading…
Cancel
Save