diff --git a/src/main/java/kr/re/etri/autoflow/controllers/ExternalAuthController.java b/src/main/java/kr/re/etri/autoflow/controllers/ExternalAuthController.java index 20d7ff1..4b06325 100644 --- a/src/main/java/kr/re/etri/autoflow/controllers/ExternalAuthController.java +++ b/src/main/java/kr/re/etri/autoflow/controllers/ExternalAuthController.java @@ -1,11 +1,15 @@ package kr.re.etri.autoflow.controllers; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import kr.re.etri.autoflow.payload.request.EdgePkgInfoRequest; import kr.re.etri.autoflow.service.ExternalAuthService; import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -46,20 +50,28 @@ public class ExternalAuthController { } } - @Operation(summary = "외부 Edge 패키지 등록", description = "외부 서버로 Edge 패키지 정보를 파일과 함께 전송하여 등록합니다.") - @PostMapping(value = "/add", consumes = {"multipart/form-data"}) + @Operation( + summary = "외부 Edge 패키지 등록", + description = "외부 서버로 Edge 패키지 정보를 파일과 함께 전송하여 등록합니다.", + security = @SecurityRequirement(name = "bearerAuth") + ) + @PostMapping(value = "/add", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity addEdgePackage( - @Parameter(description = "로그인 시 발급받은 Bearer 토큰") @RequestHeader("Authorization") String bearerToken, - @Parameter(description = "Edge 패키지 등록 요청 데이터") @RequestPart("edgePkgInfoVO") EdgePkgInfoRequest edgePkgInfoRequest, - @Parameter(description = "업로드할 패키지 파일") @RequestPart(value = "file", required = false) MultipartFile file + @RequestHeader("Authorization") String bearerToken, + @RequestPart("edgePkgInfoVO") String edgePkgInfoJson, + @RequestPart(value = "file", required = false) MultipartFile file ) { try { + ObjectMapper mapper = new ObjectMapper(); + EdgePkgInfoRequest edgePkgInfoRequest = mapper.readValue(edgePkgInfoJson, EdgePkgInfoRequest.class); + Object response = externalAuthService.uploadEdgePackage(bearerToken, edgePkgInfoRequest, file); return ResponseEntity.ok(response); + + } catch (JsonProcessingException e) { + return ResponseEntity.badRequest().body("잘못된 JSON 형식: " + e.getMessage()); } catch (Exception e) { - return ResponseEntity.internalServerError().body( - String.format("파일 업로드 실패: %s", e.getMessage()) - ); + return ResponseEntity.internalServerError().body("파일 업로드 실패: " + e.getMessage()); } } diff --git a/src/main/java/kr/re/etri/autoflow/payload/request/EdgePkgInfoRequest.java b/src/main/java/kr/re/etri/autoflow/payload/request/EdgePkgInfoRequest.java index e3f3b61..bb6fc2f 100644 --- a/src/main/java/kr/re/etri/autoflow/payload/request/EdgePkgInfoRequest.java +++ b/src/main/java/kr/re/etri/autoflow/payload/request/EdgePkgInfoRequest.java @@ -1,5 +1,6 @@ package kr.re.etri.autoflow.payload.request; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -12,23 +13,39 @@ import java.util.List; @Setter @NoArgsConstructor @AllArgsConstructor +@Schema(description = "Edge 패키지 등록 요청 객체") public class EdgePkgInfoRequest { + + @Schema(description = "Edge 패키지 시리얼 번호", example = "1") private int ed_pkg_serial; - private int sw_group; - private int sw_type; - private String sw_manufacturer; - private String package_id; - private String package_name; - private String window_root_location; - private String window_exe_name; - private String linux_root_location; - private String linux_exe_name; - private Date create_datetime; + + @Schema(description = "설치 위치", example = "/opt/edge/package") + private String download_location; + + @Schema(description = "패키지 ID", example = "pkg_001") + private String sw_id; + + @Schema(description = "소프트웨어 버전", example = "v1.0.0") + private String sw_version; + + @Schema(description = "소프트웨어 이름", example = "Edge Analytics") + private String sw_name; + + @Schema(description = "등록 사용자 ID", example = "admin") private String user_id; - private String sw_group_name; - private String sw_type_name; - private List edge_info_list; + + @Schema(description = "인증 ID", example = "auth_12345") private String auth_id; + + @Schema(description = "설치 OS", example = "Linux") + private String install_os; + + @Schema(description = "등록 일시", example = "2025-10-15T14:30:00") + private Date archive_type; + + @Schema(description = "실행 여부 (0/1)", example = "1") + private String exec_yn; + + @Schema(description = "등록인만 접근 여부 (0/1)", example = "1") private String secret_at; - private boolean admin_at = false; -} +} \ No newline at end of file diff --git a/src/main/java/kr/re/etri/autoflow/swagger/OpenAPIConfig.java b/src/main/java/kr/re/etri/autoflow/swagger/OpenAPIConfig.java index c5a7af8..a76204a 100644 --- a/src/main/java/kr/re/etri/autoflow/swagger/OpenAPIConfig.java +++ b/src/main/java/kr/re/etri/autoflow/swagger/OpenAPIConfig.java @@ -35,23 +35,32 @@ public class OpenAPIConfig { .servers(createServerList()); } + private static final String SECURITY_SCHEME_BEARER = "bearerAuth"; + private Components createComponents() { return new Components() .addSecuritySchemes(SECURITY_SCHEME_ACCESS, new SecurityScheme() - .name("cuuva-jwt") // 액세스 토큰 쿠키 이름 + .name("cuuva-jwt") .bearerFormat("JWT") .type(SecurityScheme.Type.APIKEY) .in(SecurityScheme.In.HEADER) ) .addSecuritySchemes(SECURITY_SCHEME_REFRESH, new SecurityScheme() - .name("cuuva-jwt-refresh") // 리프레시 토큰 쿠키 이름 + .name("cuuva-jwt-refresh") .type(SecurityScheme.Type.APIKEY) .in(SecurityScheme.In.HEADER) + ) + .addSecuritySchemes(SECURITY_SCHEME_BEARER, + new SecurityScheme() + .type(SecurityScheme.Type.HTTP) + .scheme("bearer") + .bearerFormat("JWT") ); } + private SecurityRequirement createSecurityRequirement() { return new SecurityRequirement() .addList(SECURITY_SCHEME_ACCESS)