TODO:업로드시 projectid확인

[ADD] AuditingEntityListener 적용 및 WorkflowEntity 매핑 후 저장 로직 구현 (PipelineUploadController)
main
bjkim 9 months ago
parent ce0258e90d
commit baca2e29a7

@ -1,7 +1,9 @@
package kr.re.etri.autoflow.controllers; package kr.re.etri.autoflow.controllers;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import kr.re.etri.autoflow.entity.WorkflowEntity;
import kr.re.etri.autoflow.service.PipelineUploadService; import kr.re.etri.autoflow.service.PipelineUploadService;
import kr.re.etri.autoflow.service.WorkFlowService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
@ -11,6 +13,7 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.time.LocalDateTime;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -23,6 +26,7 @@ import java.util.Map;
public class PipelineUploadController { public class PipelineUploadController {
private final PipelineUploadService pipelineUploadService; private final PipelineUploadService pipelineUploadService;
private final WorkFlowService workFlowService;
@io.swagger.v3.oas.annotations.Operation( @io.swagger.v3.oas.annotations.Operation(
summary = "파이프라인 업로드", summary = "파이프라인 업로드",
@ -42,44 +46,47 @@ public class PipelineUploadController {
description = "서버 내부 오류" description = "서버 내부 오류"
) )
}) })
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<Map<String, Object>> uploadPipeline( public ResponseEntity<Map<String, Object>> uploadPipeline(
@io.swagger.v3.oas.annotations.Parameter(description = "업로드할 파이프라인 파일", required = true)
@RequestParam("uploadfile") MultipartFile file, @RequestParam("uploadfile") MultipartFile file,
@RequestParam(value = "name", required = true) String name,
@io.swagger.v3.oas.annotations.Parameter(description = "파이프라인 이름", required = true) @RequestParam(value = "display_name", required = true) String displayName,
@RequestParam(value = "name", required = false) String name,
@io.swagger.v3.oas.annotations.Parameter(description = "표시 이름", required = true)
@RequestParam(value = "display_name", required = false) String displayName,
@io.swagger.v3.oas.annotations.Parameter(description = "파이프라인 설명", required = false)
@RequestParam(value = "description", required = false) String description, @RequestParam(value = "description", required = false) String description,
@RequestParam(value = "namespace", required = false) String namespace,
@io.swagger.v3.oas.annotations.Parameter(description = "Kubeflow 네임스페이스", required = false) @RequestParam(value = "regUserId") String regUserId,
@RequestParam(value = "namespace", required = false) String namespace @RequestParam(value = "projectId") Long projectId
) { ) {
try { try {
// Kubeflow 업로드
Map<String, Object> result = pipelineUploadService.uploadPipeline(file, name, displayName, description, namespace); Map<String, Object> result = pipelineUploadService.uploadPipeline(file, name, displayName, description, namespace);
return ResponseEntity.ok(result);
} catch (HttpClientErrorException e) { // WorkflowEntity 매핑 후 DB 저장
log.error("Kubeflow API Error: status={}, response={}", e.getStatusCode(), e.getResponseBodyAsString(), e); WorkflowEntity workflow = WorkflowEntity.builder()
.pipelineId((String) result.get("pipeline_id"))
.displayName((String) result.get("display_name"))
.name((String) result.get("name"))
.description((String) result.get("description"))
.namespace((String) result.get("namespace"))
.regUserId(regUserId)
.projectId(projectId)
.kubeflowStatus("Created")
.version(1)
.build();
// 저장
workFlowService.save(workflow);
Map<String, Object> error = new HashMap<>(); return ResponseEntity.ok(result);
error.put("status", e.getStatusCode().value());
error.put("error", e.getStatusText());
error.put("message", e.getResponseBodyAsString());
return ResponseEntity.status(e.getStatusCode()).body(error);
} catch (Exception e) { } catch (Exception e) {
log.error("Pipeline upload failed", e); log.error("Pipeline upload failed", e);
Map<String, Object> error = Map.of(
Map<String, Object> error = new HashMap<>(); "status", 500,
error.put("status", 500); "error", "Internal Server Error",
error.put("error", "Internal Server Error"); "message", e.getMessage()
error.put("message", e.getMessage()); );
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error); return ResponseEntity.status(500).body(error);
} }
} }
} }

@ -6,6 +6,7 @@ import lombok.*;
import org.hibernate.annotations.Comment; import org.hibernate.annotations.Comment;
import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
@ -14,6 +15,7 @@ import java.util.List;
@Schema(description = "데이터그룹") @Schema(description = "데이터그룹")
@Comment("데이터그룹") @Comment("데이터그룹")
@Entity @Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "tb_datagroup") @Table(name = "tb_datagroup")
@Getter @Getter
@Setter @Setter

@ -6,6 +6,7 @@ import lombok.*;
import org.hibernate.annotations.Comment; import org.hibernate.annotations.Comment;
import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -15,6 +16,7 @@ import java.util.List;
@Schema(description = "프로젝트") @Schema(description = "프로젝트")
@Comment("프로젝트") @Comment("프로젝트")
@Entity @Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "tb_project") @Table(name = "tb_project")
@Getter @Getter
@Setter @Setter

@ -5,8 +5,13 @@ import lombok.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import org.hibernate.annotations.Comment; import org.hibernate.annotations.Comment;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@Entity @Entity
@EntityListeners(AuditingEntityListener.class)
@Table(name = "tb_workflows") @Table(name = "tb_workflows")
@Getter @Getter
@Setter @Setter
@ -22,35 +27,41 @@ public class WorkflowEntity {
@Comment("ID") @Comment("ID")
private Long id; private Long id;
@Schema(description = "워크플로우 이름", example = "데이터 전처리 워크플로우") // Kubeflow pipeline_id 대응
private String workflowName; @Schema(description = "워크플로우 아이디", example = "b935cc31-0db5-405e-8ae9-f4dbdc418c59")
private String pipelineId;
// Kubeflow display_name 대응
@Schema(description = "워크플로우 표시 이름", example = "etri001")
private String displayName;
// Kubeflow name 대응
@Schema(description = "워크플로우 이름", example = "etri001")
private String name;
// Kubeflow description 대응
@Schema(description = "워크플로우 설명", example = "ETL 파이프라인 정의") @Schema(description = "워크플로우 설명", example = "ETL 파이프라인 정의")
private String workflowDescription; private String description;
// Kubeflow created_at 대응
@CreatedDate
@Schema(description = "워크플로우 등록 일시", example = "2025-08-05T04:11:24.745")
private LocalDateTime regDt;
@Column(columnDefinition = "CHAR(1) DEFAULT 'N'") // Kubeflow namespace 대응
@Schema(description = "업로드 여부", example = "Y") @Schema(description = "워크플로우 네임스페이스", example = "default")
private String uploadYn; private String namespace;
@Schema(description = "등록자 ID", example = "admin") @Schema(description = "등록자 ID", example = "admin")
private String regUserId; private String regUserId;
@Schema(description = "등록 일시", example = "2025-08-05T04:11:24.745") @LastModifiedDate
private LocalDateTime regDt;
@Schema(description = "수정 일시", example = "2025-08-05T04:11:24.745") @Schema(description = "수정 일시", example = "2025-08-05T04:11:24.745")
private LocalDateTime modDt; private LocalDateTime modDt;
@Schema(description = "워크플로우 버전", example = "1.0") @Schema(description = "워크플로우 버전", example = "1.0")
private Integer version; private Integer version;
@Schema(description = "스텝 개수", example = "5")
private Integer stepCount;
// configProgress/토탈n개로 표현
@Schema(description = "현재 구성 진행 개수", example = "1")
private Integer configProgress;
@Schema(description = "Kubeflow 상태", example = "Running") @Schema(description = "Kubeflow 상태", example = "Running")
private String kubeflowStatus; private String kubeflowStatus;

Loading…
Cancel
Save