package com.qianwen.smartman.common.config; import com.fasterxml.classmate.TypeResolver; import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver; import com.google.common.collect.Lists; import java.lang.reflect.Type; import java.util.Arrays; import java.util.Collections; import java.util.List; import com.qianwen.smartman.common.constant.MenuConstant; import com.qianwen.smartman.common.launch.SwaggerPlugin; import com.qianwen.core.secure.BladeUser; import com.qianwen.core.swagger.EnableSwagger; import com.qianwen.core.swagger.SwaggerProperties; import com.qianwen.core.swagger.SwaggerUtil; //import com.qianwen.smartman.modules.dmpLog.constant.DmpLogSyncConstant; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.plugin.core.config.EnablePluginRegistries; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.schema.AlternateTypeRule; import springfox.documentation.schema.AlternateTypeRules; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.AuthorizationScope; import springfox.documentation.service.Contact; import springfox.documentation.service.SecurityReference; import springfox.documentation.service.SecurityScheme; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.spring.web.plugins.Docket; @EnableSwagger @Configuration @EnablePluginRegistries({SwaggerPlugin.class}) public class SwaggerConfiguration { private final SwaggerProperties swaggerProperties; private final OpenApiExtensionResolver openApiExtensionResolver; public SwaggerConfiguration(final SwaggerProperties swaggerProperties, final OpenApiExtensionResolver openApiExtensionResolver) { this.swaggerProperties = swaggerProperties; this.openApiExtensionResolver = openApiExtensionResolver; } @Bean public Docket authDocket() { return docket("authentication", Collections.singletonList("com.qianwen.smartman.modules.auth")); } @Bean public Docket sysDocket() { return docket("system", Arrays.asList("com.qianwen.smartman.modules.system", "com.qianwen.smartman.modules.resource")); } @Bean public Docket notifyDocket() { return docket("notify", Arrays.asList("com.qianwen.smartman.modules.notify")); } @Bean public Docket cpsDocket() { return docket("cps", Arrays.asList("com.qianwen.smartman.modules.cps")); } @Bean public Docket fmsDocket() { return docket("fms", Arrays.asList("com.qianwen.smartman.modules.fms")); } @Bean public Docket mdcDocket() { return docket("mdc", Lists.newArrayList(new String[]{"com.qianwen.smartman.modules.mdc"})); } @Bean public Docket tpmDocket() { return docket("tpm", Lists.newArrayList(new String[]{"com.qianwen.smartman.modules.tpm"})); } @Bean public Docket dncDocket() { return docket("dnc", Lists.newArrayList(new String[]{"com.qianwen.smartman.modules.dnc"})); } @Bean public Docket visualDocket() { return docket("visual", Lists.newArrayList(new String[]{"com.qianwen.smartman.modules.visual"})); } @Bean public Docket deskDocket() { return docket(MenuConstant.DESK, Collections.singletonList("com.qianwen.smartman.modules.desk")); } @Bean public Docket tpDocket() { return docket("trace", Collections.singletonList("com.qianwen.smartman.modules.trace")); } @Bean public Docket reportDocket() { return docket("report", Collections.singletonList("com.qianwen.smartman.modules.report")); } @Bean public Docket syncDocket() { return docket("sync", Collections.singletonList("com.qianwen.smartman.modules.sync")); } /* @Bean public Docket dmpLogDocket() { return docket(DmpLogSyncConstant.DMP_LOG_TOPIC, Collections.singletonList("com.qianwen.smartman.modules.dmpLog")); } */ @Bean public Docket toolDocket() { return docket("tool", Collections.singletonList("com.qianwen.smartman.modules.tool")); } @Bean public Docket perfDocket() { return docket("perf", Collections.singletonList("com.qianwen.smartman.modules.perf")); } @Bean public Docket productionDocket() { return docket("coproduction", Collections.singletonList("com.qianwen.smartman.modules.coproduction")); } @Bean public Docket andonDocket() { return docket("andon", Collections.singletonList("com.qianwen.smartman.modules.andon")); } @Bean public Docket workinghourDocket() { return docket("workinghour", Collections.singletonList("com.qianwen.smartman.modules.workinghour")); } private Docket docket(String groupName, List basePackages) { TypeResolver resolver = new TypeResolver(); AlternateTypeRule listLongToString = AlternateTypeRules.newRule(resolver.resolve(List.class, new Type[]{Long.class}), resolver.resolve(List.class, new Type[]{String.class})); return new Docket(DocumentationType.SWAGGER_2).groupName(groupName).apiInfo(apiInfo()).ignoredParameterTypes(new Class[]{BladeUser.class}).alternateTypeRules(new AlternateTypeRule[]{listLongToString}).directModelSubstitute(Long.class, String.class).select().apis(SwaggerUtil.basePackages(basePackages)).paths(PathSelectors.any()).build().securityContexts(securityContexts()).securitySchemes(securitySchemas()).extensions(this.openApiExtensionResolver.buildExtensions(groupName)); } private List securityContexts() { return Collections.singletonList(SecurityContext.builder().securityReferences(defaultAuth()).forPaths(PathSelectors.regex("^.*$")).build()); } List defaultAuth() { AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverywhere"); AuthorizationScope[] authorizationScopes = {authorizationScope}; return Lists.newArrayList(new SecurityReference[]{new SecurityReference(SwaggerUtil.clientInfo().getName(), authorizationScopes), new SecurityReference(SwaggerUtil.bladeAuth().getName(), authorizationScopes), new SecurityReference(SwaggerUtil.bladeTenant().getName(), authorizationScopes)}); } private List securitySchemas() { return Lists.newArrayList(new SecurityScheme[]{SwaggerUtil.clientInfo(), SwaggerUtil.bladeAuth(), SwaggerUtil.bladeTenant()}); } private ApiInfo apiInfo() { return new ApiInfoBuilder().title(this.swaggerProperties.getTitle()).description(this.swaggerProperties.getDescription()).license(this.swaggerProperties.getLicense()).licenseUrl(this.swaggerProperties.getLicenseUrl()).termsOfServiceUrl(this.swaggerProperties.getTermsOfServiceUrl()).contact(new Contact(this.swaggerProperties.getContact().getName(), this.swaggerProperties.getContact().getUrl(), this.swaggerProperties.getContact().getEmail())).version(this.swaggerProperties.getVersion()).build(); } }