package kr.re.etri.autoflow.swagger; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Contact; import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.info.License; import io.swagger.v3.oas.models.security.SecurityRequirement; import io.swagger.v3.oas.models.security.SecurityScheme; import io.swagger.v3.oas.models.servers.Server; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.List; import org.springframework.core.env.Environment; @Configuration @RequiredArgsConstructor public class OpenAPIConfig { private final Environment environment; private static final String SECURITY_SCHEME_ACCESS = "cuuva-jwt-cookie"; private static final String SECURITY_SCHEME_REFRESH = "cuuva-jwt-refresh-cookie"; private static final String PRODUCTION_SERVER_URL = "http://cuuva.com:2480/autoflow"; private static final String LOCAL_SERVER_URL = "http://localhost:80"; @Bean public OpenAPI customOpenAPI() { return new OpenAPI() .components(createComponents()) .addSecurityItem(createSecurityRequirement()) .info(createApiInfo()) .servers(createServerList()); } private Components createComponents() { return new Components() .addSecuritySchemes(SECURITY_SCHEME_ACCESS, new SecurityScheme() .name("cuuva-jwt") // 액세스 토큰 쿠키 이름 .type(SecurityScheme.Type.APIKEY) .in(SecurityScheme.In.HEADER) ) .addSecuritySchemes(SECURITY_SCHEME_REFRESH, new SecurityScheme() .name("cuuva-jwt-refresh") // 리프레시 토큰 쿠키 이름 .type(SecurityScheme.Type.APIKEY) .in(SecurityScheme.In.HEADER) ); } private SecurityRequirement createSecurityRequirement() { return new SecurityRequirement() .addList(SECURITY_SCHEME_ACCESS) .addList(SECURITY_SCHEME_REFRESH); } private Info createApiInfo() { return new Info() .title("Autoflow API") .description("Autoflow 서비스의 Swagger 문서") .version("1.0.0") .contact(new Contact() .name("API Support") .email("jhg88@cuuva.com")) .license(new License() .name("CUUVA") .url("http://cuuva.com")); } public List createServerList() { String[] activeProfiles = environment.getActiveProfiles(); if (activeProfiles.length == 0) { // 프로필이 없으면 default return List.of(new Server().url(LOCAL_SERVER_URL).description("Default Local Server")); } String profile = activeProfiles[0]; return switch (profile) { case "local" -> List.of( new Server().url(LOCAL_SERVER_URL).description("Local Server") ); case "prod" -> List.of( new Server().url(PRODUCTION_SERVER_URL).description("Production Server") ); default -> List.of( new Server().url(LOCAL_SERVER_URL).description("Default Local Server") ); }; } }