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_NAME = "bezkoder-jwt-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_NAME, new SecurityScheme() .name("bezkoder-jwt") // 쿠키 이름 .type(SecurityScheme.Type.APIKEY) .in(SecurityScheme.In.COOKIE) ); } private SecurityRequirement createSecurityRequirement() { return new SecurityRequirement().addList(SECURITY_SCHEME_NAME); } 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") ); }; } }