From f087c3fcedcbf329190eae5439840410ea47a26f Mon Sep 17 00:00:00 2001 From: VoBa Date: Mon, 9 Sep 2019 11:59:06 +0300 Subject: [PATCH] Moved Swagger configuration to TB config file (#1982) --- .../config/SchedulingConfiguration.java | 3 - .../server/config/SwaggerConfiguration.java | 134 +++++++++++------- .../src/main/resources/thingsboard.yml | 15 ++ .../dao/cache/TBRedisCacheConfiguration.java | 19 --- 4 files changed, 94 insertions(+), 77 deletions(-) diff --git a/application/src/main/java/org/thingsboard/server/config/SchedulingConfiguration.java b/application/src/main/java/org/thingsboard/server/config/SchedulingConfiguration.java index b70f781acd..a27d09ab9a 100644 --- a/application/src/main/java/org/thingsboard/server/config/SchedulingConfiguration.java +++ b/application/src/main/java/org/thingsboard/server/config/SchedulingConfiguration.java @@ -23,9 +23,6 @@ import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.scheduling.config.ScheduledTaskRegistrar; -import java.util.concurrent.Executor; -import java.util.concurrent.Executors; - @Configuration @EnableScheduling public class SchedulingConfiguration implements SchedulingConfigurer { diff --git a/application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java b/application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java index cc6ddcf73e..b44093a031 100644 --- a/application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java +++ b/application/src/main/java/org/thingsboard/server/config/SwaggerConfiguration.java @@ -19,6 +19,7 @@ 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.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.thingsboard.server.common.data.security.Authority; @@ -43,71 +44,94 @@ import static springfox.documentation.builders.PathSelectors.regex; @Configuration public class SwaggerConfiguration { - @Bean - public Docket thingsboardApi() { - TypeResolver typeResolver = new TypeResolver(); - final ResolvedType jsonNodeType = - typeResolver.resolve( - JsonNode.class); - final ResolvedType stringType = - typeResolver.resolve( - String.class); + @Value("${swagger.api_path_regex}") + private String apiPathRegex; + @Value("${swagger.security_path_regex}") + private String securityPathRegex; + @Value("${swagger.non_security_path_regex}") + private String nonSecurityPathRegex; + @Value("${swagger.title}") + private String title; + @Value("${swagger.description}") + private String description; + @Value("${swagger.contact.name}") + private String contactName; + @Value("${swagger.contact.url}") + private String contactUrl; + @Value("${swagger.contact.email}") + private String contactEmail; + @Value("${swagger.license.title}") + private String licenseTitle; + @Value("${swagger.license.url}") + private String licenseUrl; + @Value("${swagger.version}") + private String version; - return new Docket(DocumentationType.SWAGGER_2) - .groupName("thingsboard") - .apiInfo(apiInfo()) - .alternateTypeRules( + @Bean + 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) + .groupName("thingsboard") + .apiInfo(apiInfo()) + .alternateTypeRules( new AlternateTypeRule( jsonNodeType, stringType)) - .select() - .paths(apiPaths()) - .build() - .securitySchemes(newArrayList(jwtTokenKey())) - .securityContexts(newArrayList(securityContext())) - .enableUrlTemplating(true); - } + .select() + .paths(apiPaths()) + .build() + .securitySchemes(newArrayList(jwtTokenKey())) + .securityContexts(newArrayList(securityContext())) + .enableUrlTemplating(true); + } - private ApiKey jwtTokenKey() { - return new ApiKey("X-Authorization", "JWT token", "header"); - } + private ApiKey jwtTokenKey() { + return new ApiKey("X-Authorization", "JWT token", "header"); + } - private SecurityContext securityContext() { - return SecurityContext.builder() - .securityReferences(defaultAuth()) - .forPaths(securityPaths()) - .build(); - } + private SecurityContext securityContext() { + return SecurityContext.builder() + .securityReferences(defaultAuth()) + .forPaths(securityPaths()) + .build(); + } - private Predicate apiPaths() { - return regex("/api.*"); - } + private Predicate apiPaths() { + return regex(apiPathRegex); + } - private Predicate securityPaths() { - return and( - regex("/api.*"), - not(regex("/api/noauth.*")) - ); - } + private Predicate securityPaths() { + return and( + regex(securityPathRegex), + not(regex(nonSecurityPathRegex)) + ); + } - List defaultAuth() { - AuthorizationScope[] authorizationScopes = new AuthorizationScope[3]; - authorizationScopes[0] = new AuthorizationScope(Authority.SYS_ADMIN.name(), "System administrator"); - authorizationScopes[1] = new AuthorizationScope(Authority.TENANT_ADMIN.name(), "Tenant administrator"); - authorizationScopes[2] = new AuthorizationScope(Authority.CUSTOMER_USER.name(), "Customer"); - return newArrayList( - new SecurityReference("X-Authorization", authorizationScopes)); - } + List defaultAuth() { + AuthorizationScope[] authorizationScopes = new AuthorizationScope[3]; + authorizationScopes[0] = new AuthorizationScope(Authority.SYS_ADMIN.name(), "System administrator"); + authorizationScopes[1] = new AuthorizationScope(Authority.TENANT_ADMIN.name(), "Tenant administrator"); + authorizationScopes[2] = new AuthorizationScope(Authority.CUSTOMER_USER.name(), "Customer"); + return newArrayList( + new SecurityReference("X-Authorization", authorizationScopes)); + } - private ApiInfo apiInfo() { - return new ApiInfoBuilder() - .title("Thingsboard REST API") - .description("For instructions how to authorize requests please visit REST API documentation page.") - .contact(new Contact("Thingsboard team", "http://thingsboard.io", "info@thingsboard.io")) - .license("Apache License Version 2.0") - .licenseUrl("https://github.com/thingsboard/thingsboard/blob/master/LICENSE") - .version("2.0") + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title(title) + .description(description) + .contact(new Contact(contactName, contactUrl, contactEmail)) + .license(licenseTitle) + .licenseUrl(licenseUrl) + .version(version) .build(); - } + } } diff --git a/application/src/main/resources/thingsboard.yml b/application/src/main/resources/thingsboard.yml index 13c0ad767e..1aba5bbb33 100644 --- a/application/src/main/resources/thingsboard.yml +++ b/application/src/main/resources/thingsboard.yml @@ -488,3 +488,18 @@ transport: bind_address: "${COAP_BIND_ADDRESS:0.0.0.0}" bind_port: "${COAP_BIND_PORT:5683}" timeout: "${COAP_TIMEOUT:10000}" + +swagger: + api_path_regex: "${SWAGGER_API_PATH_REGEX:/api.*}" + security_path_regex: "${SWAGGER_SECURITY_PATH_REGEX:/api.*}" + non_security_path_regex: "${SWAGGER_NON_SECURITY_PATH_REGEX:/api/noauth.*}" + title: "${SWAGGER_TITLE:Thingsboard REST API}" + description: "${SWAGGER_DESCRIPTION:For instructions how to authorize requests please visit REST API documentation page.}" + contact: + name: "${SWAGGER_CONTACT_NAME:Thingsboard team}" + url: "${SWAGGER_CONTACT_URL:http://thingsboard.io}" + email: "${SWAGGER_CONTACT_EMAIL:info@thingsboard.io}" + license: + title: "${SWAGGER_LICENSE_TITLE:Apache License Version 2.0}" + url: "${SWAGGER_LICENSE_URL:https://github.com/thingsboard/thingsboard/blob/master/LICENSE}" + version: "${SWAGGER_VERSION:2.0}" \ No newline at end of file diff --git a/dao/src/main/java/org/thingsboard/server/dao/cache/TBRedisCacheConfiguration.java b/dao/src/main/java/org/thingsboard/server/dao/cache/TBRedisCacheConfiguration.java index 75c0c2fb01..f1c4b5a8fc 100644 --- a/dao/src/main/java/org/thingsboard/server/dao/cache/TBRedisCacheConfiguration.java +++ b/dao/src/main/java/org/thingsboard/server/dao/cache/TBRedisCacheConfiguration.java @@ -19,37 +19,18 @@ import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cache.CacheManager; -import org.springframework.cache.interceptor.SimpleKey; -import org.springframework.core.convert.ConversionService; -import org.springframework.core.convert.TypeDescriptor; -import org.springframework.core.convert.converter.ConditionalGenericConverter; -import org.springframework.core.convert.converter.Converter; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.convert.converter.ConverterRegistry; -import org.springframework.data.convert.ReadingConverter; -import org.springframework.data.convert.WritingConverter; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.convert.RedisCustomConversions; import org.springframework.format.support.DefaultFormattingConversionService; -import org.springframework.lang.Nullable; import org.springframework.util.Assert; -import org.springframework.util.StringUtils; -import org.thingsboard.server.common.data.EntityType; import org.thingsboard.server.common.data.id.EntityId; -import org.thingsboard.server.common.data.id.EntityIdFactory; - -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Collections; -import java.util.Set; -import java.util.UUID; @Configuration @ConditionalOnProperty(prefix = "cache", value = "type", havingValue = "redis", matchIfMissing = false)