diff --git a/src/main/java/com/kamco/cd/kamcoback/config/SwaggerConfig.java b/src/main/java/com/kamco/cd/kamcoback/config/swagger/SwaggerConfig.java similarity index 88% rename from src/main/java/com/kamco/cd/kamcoback/config/SwaggerConfig.java rename to src/main/java/com/kamco/cd/kamcoback/config/swagger/SwaggerConfig.java index 8aa6f9bc..5794025d 100644 --- a/src/main/java/com/kamco/cd/kamcoback/config/SwaggerConfig.java +++ b/src/main/java/com/kamco/cd/kamcoback/config/swagger/SwaggerConfig.java @@ -1,4 +1,4 @@ -package com.kamco.cd.kamcoback.config; +package com.kamco.cd.kamcoback.config.swagger; import io.swagger.v3.oas.annotations.enums.SecuritySchemeType; import io.swagger.v3.oas.annotations.security.SecurityScheme; diff --git a/src/main/java/com/kamco/cd/kamcoback/config/swagger/SwaggerUiAutoAuthConfig.java b/src/main/java/com/kamco/cd/kamcoback/config/swagger/SwaggerUiAutoAuthConfig.java new file mode 100644 index 00000000..f157506b --- /dev/null +++ b/src/main/java/com/kamco/cd/kamcoback/config/swagger/SwaggerUiAutoAuthConfig.java @@ -0,0 +1,97 @@ +package com.kamco.cd.kamcoback.config.swagger; + +import jakarta.servlet.http.HttpServletRequest; +import java.nio.charset.StandardCharsets; +import org.springdoc.core.properties.SwaggerUiConfigProperties; +import org.springdoc.core.properties.SwaggerUiOAuthProperties; +import org.springdoc.core.providers.ObjectMapperProvider; +import org.springdoc.webmvc.ui.SwaggerIndexPageTransformer; +import org.springdoc.webmvc.ui.SwaggerIndexTransformer; +import org.springdoc.webmvc.ui.SwaggerWelcomeCommon; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; +import org.springframework.core.io.Resource; +import org.springframework.web.servlet.resource.ResourceTransformerChain; +import org.springframework.web.servlet.resource.TransformedResource; + +@Profile({"local", "dev"}) +@Configuration +public class SwaggerUiAutoAuthConfig { + + @Bean + @Primary + public SwaggerIndexTransformer swaggerIndexTransformer( + SwaggerUiConfigProperties swaggerUiConfigProperties, + SwaggerUiOAuthProperties swaggerUiOAuthProperties, + SwaggerWelcomeCommon swaggerWelcomeCommon, + ObjectMapperProvider objectMapperProvider) { + + SwaggerIndexPageTransformer delegate = + new SwaggerIndexPageTransformer( + swaggerUiConfigProperties, + swaggerUiOAuthProperties, + swaggerWelcomeCommon, + objectMapperProvider); + + return new SwaggerIndexTransformer() { + private static final String TOKEN_KEY = "SWAGGER_ACCESS_TOKEN"; + + @Override + public Resource transform( + HttpServletRequest request, Resource resource, ResourceTransformerChain chain) { + try { + // 1) springdoc 기본 변환 먼저 적용 + Resource transformed = delegate.transform(request, resource, chain); + + String html = + new String(transformed.getInputStream().readAllBytes(), StandardCharsets.UTF_8); + + String loginPathContains = "/api/auth/signin"; + + String inject = + """ + tagsSorter: (a, b) => { + const TOP = '인증(Auth)'; + if (a === TOP && b !== TOP) return -1; + if (b === TOP && a !== TOP) return 1; + return a.localeCompare(b); + }, + requestInterceptor: (req) => { + const token = localStorage.getItem('%s'); + if (token) { + req.headers = req.headers || {}; + req.headers['Authorization'] = 'Bearer ' + token; + } + return req; + }, + responseInterceptor: async (res) => { + try { + const isLogin = (res?.url?.includes('%s') && res?.status === 200); + if (isLogin) { + const text = (typeof res.data === 'string') ? res.data : JSON.stringify(res.data); + const json = JSON.parse(text); + const token = json?.data?.accessToken; + + if (token) { + localStorage.setItem('%s', token); + } + } + } catch (e) {} + return res; + }, + """ + .formatted(TOKEN_KEY, loginPathContains, TOKEN_KEY); + + html = html.replace("SwaggerUIBundle({", "SwaggerUIBundle({\n" + inject); + + return new TransformedResource(transformed, html.getBytes(StandardCharsets.UTF_8)); + } catch (Exception e) { + // 실패 시 원본 반환(문서 깨짐 방지) + return resource; + } + } + }; + } +} diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/layer/MapLayerRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/layer/MapLayerRepositoryImpl.java index c6a60003..cee55ddc 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/layer/MapLayerRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/layer/MapLayerRepositoryImpl.java @@ -46,6 +46,7 @@ public class MapLayerRepositoryImpl implements MapLayerRepositoryCustom { if (searchReq.getTag() != null) { whereBuilder.and(mapLayerEntity.tag.toLowerCase().eq(searchReq.getTag().toLowerCase())); } + if (searchReq.getLayerType() != null) { whereBuilder.and( mapLayerEntity.layerType.toLowerCase().eq(searchReq.getLayerType().toLowerCase()));