Commit f087c3fcedcbf329190eae5439840410ea47a26f

Authored by VoBa
Committed by Igor Kulikov
1 parent 6afef792

Moved Swagger configuration to TB config file (#1982)

@@ -23,9 +23,6 @@ import org.springframework.scheduling.annotation.SchedulingConfigurer; @@ -23,9 +23,6 @@ import org.springframework.scheduling.annotation.SchedulingConfigurer;
23 import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; 23 import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
24 import org.springframework.scheduling.config.ScheduledTaskRegistrar; 24 import org.springframework.scheduling.config.ScheduledTaskRegistrar;
25 25
26 -import java.util.concurrent.Executor;  
27 -import java.util.concurrent.Executors;  
28 -  
29 @Configuration 26 @Configuration
30 @EnableScheduling 27 @EnableScheduling
31 public class SchedulingConfiguration implements SchedulingConfigurer { 28 public class SchedulingConfiguration implements SchedulingConfigurer {
@@ -19,6 +19,7 @@ import com.fasterxml.classmate.ResolvedType; @@ -19,6 +19,7 @@ import com.fasterxml.classmate.ResolvedType;
19 import com.fasterxml.classmate.TypeResolver; 19 import com.fasterxml.classmate.TypeResolver;
20 import com.fasterxml.jackson.databind.JsonNode; 20 import com.fasterxml.jackson.databind.JsonNode;
21 import com.google.common.base.Predicate; 21 import com.google.common.base.Predicate;
  22 +import org.springframework.beans.factory.annotation.Value;
22 import org.springframework.context.annotation.Bean; 23 import org.springframework.context.annotation.Bean;
23 import org.springframework.context.annotation.Configuration; 24 import org.springframework.context.annotation.Configuration;
24 import org.thingsboard.server.common.data.security.Authority; 25 import org.thingsboard.server.common.data.security.Authority;
@@ -43,71 +44,94 @@ import static springfox.documentation.builders.PathSelectors.regex; @@ -43,71 +44,94 @@ import static springfox.documentation.builders.PathSelectors.regex;
43 @Configuration 44 @Configuration
44 public class SwaggerConfiguration { 45 public class SwaggerConfiguration {
45 46
46 - @Bean  
47 - public Docket thingsboardApi() {  
48 - TypeResolver typeResolver = new TypeResolver();  
49 - final ResolvedType jsonNodeType =  
50 - typeResolver.resolve(  
51 - JsonNode.class);  
52 - final ResolvedType stringType =  
53 - typeResolver.resolve(  
54 - String.class); 47 + @Value("${swagger.api_path_regex}")
  48 + private String apiPathRegex;
  49 + @Value("${swagger.security_path_regex}")
  50 + private String securityPathRegex;
  51 + @Value("${swagger.non_security_path_regex}")
  52 + private String nonSecurityPathRegex;
  53 + @Value("${swagger.title}")
  54 + private String title;
  55 + @Value("${swagger.description}")
  56 + private String description;
  57 + @Value("${swagger.contact.name}")
  58 + private String contactName;
  59 + @Value("${swagger.contact.url}")
  60 + private String contactUrl;
  61 + @Value("${swagger.contact.email}")
  62 + private String contactEmail;
  63 + @Value("${swagger.license.title}")
  64 + private String licenseTitle;
  65 + @Value("${swagger.license.url}")
  66 + private String licenseUrl;
  67 + @Value("${swagger.version}")
  68 + private String version;
55 69
56 - return new Docket(DocumentationType.SWAGGER_2)  
57 - .groupName("thingsboard")  
58 - .apiInfo(apiInfo())  
59 - .alternateTypeRules( 70 + @Bean
  71 + public Docket thingsboardApi() {
  72 + TypeResolver typeResolver = new TypeResolver();
  73 + final ResolvedType jsonNodeType =
  74 + typeResolver.resolve(
  75 + JsonNode.class);
  76 + final ResolvedType stringType =
  77 + typeResolver.resolve(
  78 + String.class);
  79 +
  80 + return new Docket(DocumentationType.SWAGGER_2)
  81 + .groupName("thingsboard")
  82 + .apiInfo(apiInfo())
  83 + .alternateTypeRules(
60 new AlternateTypeRule( 84 new AlternateTypeRule(
61 jsonNodeType, 85 jsonNodeType,
62 stringType)) 86 stringType))
63 - .select()  
64 - .paths(apiPaths())  
65 - .build()  
66 - .securitySchemes(newArrayList(jwtTokenKey()))  
67 - .securityContexts(newArrayList(securityContext()))  
68 - .enableUrlTemplating(true);  
69 - } 87 + .select()
  88 + .paths(apiPaths())
  89 + .build()
  90 + .securitySchemes(newArrayList(jwtTokenKey()))
  91 + .securityContexts(newArrayList(securityContext()))
  92 + .enableUrlTemplating(true);
  93 + }
70 94
71 - private ApiKey jwtTokenKey() {  
72 - return new ApiKey("X-Authorization", "JWT token", "header");  
73 - } 95 + private ApiKey jwtTokenKey() {
  96 + return new ApiKey("X-Authorization", "JWT token", "header");
  97 + }
74 98
75 - private SecurityContext securityContext() {  
76 - return SecurityContext.builder()  
77 - .securityReferences(defaultAuth())  
78 - .forPaths(securityPaths())  
79 - .build();  
80 - } 99 + private SecurityContext securityContext() {
  100 + return SecurityContext.builder()
  101 + .securityReferences(defaultAuth())
  102 + .forPaths(securityPaths())
  103 + .build();
  104 + }
81 105
82 - private Predicate<String> apiPaths() {  
83 - return regex("/api.*");  
84 - } 106 + private Predicate<String> apiPaths() {
  107 + return regex(apiPathRegex);
  108 + }
85 109
86 - private Predicate<String> securityPaths() {  
87 - return and(  
88 - regex("/api.*"),  
89 - not(regex("/api/noauth.*"))  
90 - );  
91 - } 110 + private Predicate<String> securityPaths() {
  111 + return and(
  112 + regex(securityPathRegex),
  113 + not(regex(nonSecurityPathRegex))
  114 + );
  115 + }
92 116
93 - List<SecurityReference> defaultAuth() {  
94 - AuthorizationScope[] authorizationScopes = new AuthorizationScope[3];  
95 - authorizationScopes[0] = new AuthorizationScope(Authority.SYS_ADMIN.name(), "System administrator");  
96 - authorizationScopes[1] = new AuthorizationScope(Authority.TENANT_ADMIN.name(), "Tenant administrator");  
97 - authorizationScopes[2] = new AuthorizationScope(Authority.CUSTOMER_USER.name(), "Customer");  
98 - return newArrayList(  
99 - new SecurityReference("X-Authorization", authorizationScopes));  
100 - } 117 + List<SecurityReference> defaultAuth() {
  118 + AuthorizationScope[] authorizationScopes = new AuthorizationScope[3];
  119 + authorizationScopes[0] = new AuthorizationScope(Authority.SYS_ADMIN.name(), "System administrator");
  120 + authorizationScopes[1] = new AuthorizationScope(Authority.TENANT_ADMIN.name(), "Tenant administrator");
  121 + authorizationScopes[2] = new AuthorizationScope(Authority.CUSTOMER_USER.name(), "Customer");
  122 + return newArrayList(
  123 + new SecurityReference("X-Authorization", authorizationScopes));
  124 + }
101 125
102 - private ApiInfo apiInfo() {  
103 - return new ApiInfoBuilder()  
104 - .title("Thingsboard REST API")  
105 - .description("For instructions how to authorize requests please visit <a href='http://thingsboard.io/docs/reference/rest-api/'>REST API documentation page</a>.")  
106 - .contact(new Contact("Thingsboard team", "http://thingsboard.io", "info@thingsboard.io"))  
107 - .license("Apache License Version 2.0")  
108 - .licenseUrl("https://github.com/thingsboard/thingsboard/blob/master/LICENSE")  
109 - .version("2.0") 126 + private ApiInfo apiInfo() {
  127 + return new ApiInfoBuilder()
  128 + .title(title)
  129 + .description(description)
  130 + .contact(new Contact(contactName, contactUrl, contactEmail))
  131 + .license(licenseTitle)
  132 + .licenseUrl(licenseUrl)
  133 + .version(version)
110 .build(); 134 .build();
111 - } 135 + }
112 136
113 } 137 }
@@ -488,3 +488,18 @@ transport: @@ -488,3 +488,18 @@ transport:
488 bind_address: "${COAP_BIND_ADDRESS:0.0.0.0}" 488 bind_address: "${COAP_BIND_ADDRESS:0.0.0.0}"
489 bind_port: "${COAP_BIND_PORT:5683}" 489 bind_port: "${COAP_BIND_PORT:5683}"
490 timeout: "${COAP_TIMEOUT:10000}" 490 timeout: "${COAP_TIMEOUT:10000}"
  491 +
  492 +swagger:
  493 + api_path_regex: "${SWAGGER_API_PATH_REGEX:/api.*}"
  494 + security_path_regex: "${SWAGGER_SECURITY_PATH_REGEX:/api.*}"
  495 + non_security_path_regex: "${SWAGGER_NON_SECURITY_PATH_REGEX:/api/noauth.*}"
  496 + title: "${SWAGGER_TITLE:Thingsboard REST API}"
  497 + description: "${SWAGGER_DESCRIPTION:For instructions how to authorize requests please visit <a href='http://thingsboard.io/docs/reference/rest-api/'>REST API documentation page</a>.}"
  498 + contact:
  499 + name: "${SWAGGER_CONTACT_NAME:Thingsboard team}"
  500 + url: "${SWAGGER_CONTACT_URL:http://thingsboard.io}"
  501 + email: "${SWAGGER_CONTACT_EMAIL:info@thingsboard.io}"
  502 + license:
  503 + title: "${SWAGGER_LICENSE_TITLE:Apache License Version 2.0}"
  504 + url: "${SWAGGER_LICENSE_URL:https://github.com/thingsboard/thingsboard/blob/master/LICENSE}"
  505 + version: "${SWAGGER_VERSION:2.0}"
@@ -19,37 +19,18 @@ import lombok.Data; @@ -19,37 +19,18 @@ import lombok.Data;
19 import org.springframework.beans.factory.annotation.Value; 19 import org.springframework.beans.factory.annotation.Value;
20 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 20 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
21 import org.springframework.cache.CacheManager; 21 import org.springframework.cache.CacheManager;
22 -import org.springframework.cache.interceptor.SimpleKey;  
23 -import org.springframework.core.convert.ConversionService;  
24 -import org.springframework.core.convert.TypeDescriptor;  
25 -import org.springframework.core.convert.converter.ConditionalGenericConverter;  
26 -import org.springframework.core.convert.converter.Converter;  
27 import org.springframework.cache.annotation.EnableCaching; 22 import org.springframework.cache.annotation.EnableCaching;
28 import org.springframework.cache.interceptor.KeyGenerator; 23 import org.springframework.cache.interceptor.KeyGenerator;
29 import org.springframework.context.annotation.Bean; 24 import org.springframework.context.annotation.Bean;
30 import org.springframework.context.annotation.Configuration; 25 import org.springframework.context.annotation.Configuration;
31 import org.springframework.core.convert.converter.ConverterRegistry; 26 import org.springframework.core.convert.converter.ConverterRegistry;
32 -import org.springframework.data.convert.ReadingConverter;  
33 -import org.springframework.data.convert.WritingConverter;  
34 import org.springframework.data.redis.cache.RedisCacheConfiguration; 27 import org.springframework.data.redis.cache.RedisCacheConfiguration;
35 import org.springframework.data.redis.cache.RedisCacheManager; 28 import org.springframework.data.redis.cache.RedisCacheManager;
36 import org.springframework.data.redis.connection.RedisConnectionFactory; 29 import org.springframework.data.redis.connection.RedisConnectionFactory;
37 import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; 30 import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
38 -import org.springframework.data.redis.core.RedisTemplate;  
39 -import org.springframework.data.redis.core.convert.RedisCustomConversions;  
40 import org.springframework.format.support.DefaultFormattingConversionService; 31 import org.springframework.format.support.DefaultFormattingConversionService;
41 -import org.springframework.lang.Nullable;  
42 import org.springframework.util.Assert; 32 import org.springframework.util.Assert;
43 -import org.springframework.util.StringUtils;  
44 -import org.thingsboard.server.common.data.EntityType;  
45 import org.thingsboard.server.common.data.id.EntityId; 33 import org.thingsboard.server.common.data.id.EntityId;
46 -import org.thingsboard.server.common.data.id.EntityIdFactory;  
47 -  
48 -import java.nio.charset.StandardCharsets;  
49 -import java.util.Arrays;  
50 -import java.util.Collections;  
51 -import java.util.Set;  
52 -import java.util.UUID;  
53 34
54 @Configuration 35 @Configuration
55 @ConditionalOnProperty(prefix = "cache", value = "type", havingValue = "redis", matchIfMissing = false) 36 @ConditionalOnProperty(prefix = "cache", value = "type", havingValue = "redis", matchIfMissing = false)