diff --git a/src/main/java/kr/re/etri/autoflow/controllers/KubeflowRunsController.java b/src/main/java/kr/re/etri/autoflow/controllers/KubeflowRunsController.java index d9814c2..a79cce8 100644 --- a/src/main/java/kr/re/etri/autoflow/controllers/KubeflowRunsController.java +++ b/src/main/java/kr/re/etri/autoflow/controllers/KubeflowRunsController.java @@ -2,94 +2,53 @@ package kr.re.etri.autoflow.controllers; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.transaction.Transactional; -import kr.re.etri.autoflow.entity.ExperimentsEntity; -import kr.re.etri.autoflow.payload.request.ProjectBaseSearchRequest; -import kr.re.etri.autoflow.service.ExperimentsService; +import kr.re.etri.autoflow.entity.KubeflowRunEntity; +import kr.re.etri.autoflow.payload.request.KubeflowRunSearchRequest; +import kr.re.etri.autoflow.repository.KubeflowRunRepository; +import kr.re.etri.autoflow.service.KubeflowRunService; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springdoc.core.annotations.ParameterObject; -import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.time.Instant; -import java.time.OffsetDateTime; -import java.time.ZoneId; -import java.time.ZoneOffset; -import java.time.format.DateTimeFormatter; -import java.util.HashMap; import java.util.List; -import java.util.Map; -@Tag(name = "RUNS", description = "Kubeflow Runs API") +@Tag(name = "Kubeflow Run", description = "Kubeflow Run 조회 API") @RestController -@RequestMapping("/api/runs") +@RequestMapping("/api/kubeflow/runs") @RequiredArgsConstructor -@Slf4j public class KubeflowRunsController { - private final WebClient.Builder webClientBuilder; - @Value("${kubeflow.url}") - private String kubeflowBaseUrl; // 예: http://192.168.10.135:32473/ - @Operation(summary = "Kubeflow Run 목록 조회", description = "Kubeflow API를 호출하여 Run 목록을 조회합니다.") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Run 목록 조회 성공"), - @ApiResponse(responseCode = "400", description = "잘못된 요청"), - @ApiResponse(responseCode = "500", description = "서버 내부 오류") - }) - @GetMapping("/runs") - public Mono> listRuns( - @Parameter(description = "페이지 토큰 (다음 페이지 조회 시 사용)", example = "") - @RequestParam(value = "page_token", defaultValue = "") String pageToken, + private final KubeflowRunRepository runRepository; - @Parameter(description = "페이지 크기", example = "10") - @RequestParam(value = "page_size", defaultValue = "10") int pageSize, + private final KubeflowRunService kubeflowRunService; - @Parameter(description = "정렬 기준 (sort_by)", example = "created_at desc") - @RequestParam(value = "sort_by", defaultValue = "created_at desc") String sortBy, - - @Parameter(description = "필터 JSON 문자열 (URL 인코딩 필요)", example = "{\"predicates\":[{\"key\":\"storage_state\",\"operation\":\"NOT_EQUALS\",\"string_value\":\"ARCHIVED\"}]}") - @RequestParam(value = "filter", required = false) String filter - ) { - try { - // filter가 없으면 기본값 적용 - if (filter == null || filter.isBlank()) { - filter = "{\"predicates\":[{\"key\":\"storage_state\",\"operation\":\"NOT_EQUALS\",\"string_value\":\"ARCHIVED\"}]}"; - } + @Operation(summary = "모든 Kubeflow Run 조회") + @GetMapping + public ResponseEntity> getAllRuns() { + List runs = runRepository.findAll(); + return ResponseEntity.ok(runs); + } - String encodedFilter = URLEncoder.encode(filter, StandardCharsets.UTF_8); + @Operation(summary = "Kubeflow Run 단건 조회") + @GetMapping("/{runId}") + public ResponseEntity getRun( + @Parameter(description = "Kubeflow Run ID", example = "ad980d7f-050a-4c59-a775-94394befad40") + @PathVariable("runId") String runId) { - String uri = String.format( - "%s/apis/v2beta1/runs?page_token=%s&page_size=%d&sort_by=%s&filter=%s", - kubeflowBaseUrl, pageToken, pageSize, URLEncoder.encode(sortBy, StandardCharsets.UTF_8), encodedFilter - ); + return runRepository.findByRunId(runId) + .map(ResponseEntity::ok) + .orElse(ResponseEntity.notFound().build()); + } - return webClientBuilder.build() - .get() - .uri(uri) - .accept(MediaType.APPLICATION_JSON) - .retrieve() - .bodyToMono(Map.class) - .map(ResponseEntity::ok) - .doOnError(e -> log.error("Kubeflow Runs 조회 실패", e)); + @Operation(summary = "Kubeflow Run 검색 및 페이지네이션 조회") + @GetMapping("/search") + public ResponseEntity> searchRuns( + @ParameterObject @ModelAttribute KubeflowRunSearchRequest request) { - } catch (Exception e) { - log.error("URI 생성 실패", e); - return Mono.just(ResponseEntity.status(500).body(Map.of( - "status", 500, - "error", "Internal Server Error", - "message", e.getMessage() - ))); - } + Page page = kubeflowRunService.search(request); + return ResponseEntity.ok(page); } } diff --git a/src/main/java/kr/re/etri/autoflow/controllers/KubeflowRunsNewController.java b/src/main/java/kr/re/etri/autoflow/controllers/KubeflowRunsNewController.java deleted file mode 100644 index adb62a6..0000000 --- a/src/main/java/kr/re/etri/autoflow/controllers/KubeflowRunsNewController.java +++ /dev/null @@ -1,54 +0,0 @@ -package kr.re.etri.autoflow.controllers; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import kr.re.etri.autoflow.entity.KubeflowRunEntity; -import kr.re.etri.autoflow.payload.request.KubeflowRunSearchRequest; -import kr.re.etri.autoflow.repository.KubeflowRunRepository; -import kr.re.etri.autoflow.service.KubeflowRunService; -import lombok.RequiredArgsConstructor; -import org.springdoc.core.annotations.ParameterObject; -import org.springframework.data.domain.Page; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@Tag(name = "Kubeflow Run", description = "Kubeflow Run 조회 API") -@RestController -@RequestMapping("/api/kubeflow/runs") -@RequiredArgsConstructor -public class KubeflowRunsNewController { - - private final KubeflowRunRepository runRepository; - - private final KubeflowRunService kubeflowRunService; - - @Operation(summary = "모든 Kubeflow Run 조회") - @GetMapping - public ResponseEntity> getAllRuns() { - List runs = runRepository.findAll(); - return ResponseEntity.ok(runs); - } - - @Operation(summary = "Kubeflow Run 단건 조회") - @GetMapping("/{runId}") - public ResponseEntity getRun( - @Parameter(description = "Kubeflow Run ID", example = "ad980d7f-050a-4c59-a775-94394befad40") - @PathVariable("runId") String runId) { - - return runRepository.findByRunId(runId) - .map(ResponseEntity::ok) - .orElse(ResponseEntity.notFound().build()); - } - - @Operation(summary = "Kubeflow Run 검색 및 페이지네이션 조회") - @GetMapping("/search") - public ResponseEntity> searchRuns( - @ParameterObject @ModelAttribute KubeflowRunSearchRequest request) { - - Page page = kubeflowRunService.search(request); - return ResponseEntity.ok(page); - } -}