package kr.re.etri.autoflow.service; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.util.UriComponentsBuilder; import java.io.IOException; import java.util.Map; @Service @RequiredArgsConstructor public class PipelineUploadService { private final RestTemplate restTemplate; @Value("${kubeflow.pipeline.upload-url}") private String kubeflowUploadUrl; public Map uploadPipeline(MultipartFile file, String name, String displayName, String description, String namespace) { try { // 파일 form-data MultiValueMap body = new LinkedMultiValueMap<>(); body.add("uploadfile", new MultipartInputStreamFileResource(file.getInputStream(), file.getOriginalFilename())); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); HttpEntity> requestEntity = new HttpEntity<>(body, headers); // URL 조립 (쿼리 파라미터 방식) UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(kubeflowUploadUrl); if (name != null && !name.isBlank()) builder.queryParam("name", name); if (displayName != null && !displayName.isBlank()) builder.queryParam("display_name", displayName); if (description != null && !description.isBlank()) builder.queryParam("description", description); if (namespace != null && !namespace.isBlank()) builder.queryParam("namespace", namespace); String url = builder.toUriString(); ResponseEntity response = restTemplate.postForEntity(url, requestEntity, Map.class); return response.getBody(); } catch (IOException e) { throw new RuntimeException("Pipeline upload failed", e); } } }