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.enums.ParameterIn; import io.swagger.v3.oas.annotations.tags.Tag; import kr.re.etri.autoflow.entity.DatasetEntity; import kr.re.etri.autoflow.entity.ProjectEntity; import kr.re.etri.autoflow.payload.request.BaseSearchRequest; import kr.re.etri.autoflow.service.DatasetService; import lombok.RequiredArgsConstructor; import org.springdoc.core.annotations.ParameterObject; 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.multipart.MultipartFile; import java.util.List; @Tag(name = "데이터셋 API", description = "Dataset CRUD 기능 제공") @CrossOrigin(origins = "*", maxAge = 3600) @RestController @RequestMapping("/api/datasets") @RequiredArgsConstructor public class DatasetController { private final DatasetService datasetService; @Operation(summary = "전체 데이터셋 목록 조회") @GetMapping public ResponseEntity> getAllDatasets() { return ResponseEntity.ok(datasetService.findAll()); } @Operation(summary = "ID로 데이터셋 조회") @GetMapping("/{id}") public ResponseEntity getDatasetById( @Parameter(description = "조회할 데이터셋 ID", required = true, in = ParameterIn.PATH) @PathVariable("id") Long id) { return datasetService.findById(id) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } @Operation(summary = "검색 및 페이지네이션 데이터셋 목록 조회") @GetMapping("/search") public ResponseEntity> searchDatasets( @ParameterObject @ModelAttribute BaseSearchRequest request) { Page page = datasetService.search(request); return ResponseEntity.ok(page); } // @Operation(summary = "데이터셋 생성 (Swagger 전용, 첨부파일 포함, DTO 미사용)") // @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) // public ResponseEntity createDataset( // @Parameter(description = "데이터셋 이름", required = true) // @RequestParam("dsNm") String dsNm, // @Parameter(description = "데이터셋 설명", required = false) // @RequestParam(value = "dsDesc", required = false) String dsDesc, // @Parameter(description = "삭제 여부", required = false, example = "N") // @RequestParam(value = "delYn", required = false, defaultValue = "N") String delYn, // @Parameter(description = "등록 유저 ID", required = true) // @RequestParam("regUserId") String regUserId, // @Parameter(description = "등록 유저 이름", required = false) // @RequestParam(value = "regUserNm", required = false) String regUserNm, // @Parameter(description = "첨부파일", required = false) // @RequestPart(value = "files", required = false) List files // ) { // // Entity 생성 // DatasetEntity dataset = DatasetEntity.builder() // .dsNm(dsNm) // .dsDesc(dsDesc) // .delYn(delYn) // .regUserId(regUserId) // .regUserNm(regUserNm) // .build(); // // // Service 호출 (Dataset 저장 + 첨부파일 업로드 처리) // DatasetEntity savedDataset = datasetService.createWithFiles(dataset, files); // // return ResponseEntity.ok(savedDataset); // } @Operation(summary = "데이터셋 생성 + 첨부파일 업로드 (Swagger 전용)") @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity createDatasetWithFiles( @Parameter(description = "데이터셋 이름", required = true) @RequestParam("dsNm") String dsNm, @Parameter(description = "데이터셋 설명", required = false) @RequestParam(value = "dsDesc", required = false) String dsDesc, @Parameter(description = "삭제 여부", required = false, example = "N") @RequestParam(value = "delYn", required = false, defaultValue = "N") String delYn, @Parameter(description = "등록 유저 ID", required = true) @RequestParam("regUserId") String regUserId, @Parameter(description = "등록 유저 이름", required = false) @RequestParam(value = "regUserNm", required = false) String regUserNm, @Parameter(description = "첨부파일", required = false) @RequestPart(value = "files", required = false) List files ) { DatasetEntity dataset = DatasetEntity.builder() .dsNm(dsNm) .dsDesc(dsDesc) .delYn(delYn) .regUserId(regUserId) .regUserNm(regUserNm) .build(); DatasetEntity savedDataset = datasetService.createWithFiles(dataset, files); return ResponseEntity.ok(savedDataset); } // // @Operation(summary = "데이터셋 생성") // @PostMapping // public ResponseEntity createDataset(@RequestBody DatasetEntity dataset) { // try { // DatasetEntity saved = datasetService.create(dataset); // return ResponseEntity.ok(saved); // } catch (IllegalArgumentException e) { // return ResponseEntity.badRequest().body(e.getMessage()); // } // } // @Operation(summary = "데이터셋 수정") // @PutMapping("/{id}") // public ResponseEntity updateDataset( // @Parameter(description = "수정할 데이터셋 ID", required = true, in = ParameterIn.PATH) // @PathVariable("id") Long id, // @RequestBody DatasetEntity dataset) { // DTO 없이 엔티티 사용 // return datasetService.update(id, dataset) // .map(ResponseEntity::ok) // .orElse(ResponseEntity.notFound().build()); // } @Operation(summary = "데이터셋 삭제") @DeleteMapping("/{id}") public ResponseEntity deleteDataset( @Parameter(description = "삭제할 데이터셋 ID", required = true, in = ParameterIn.PATH) @PathVariable("id") Long id) { if (datasetService.delete(id)) { return ResponseEntity.noContent().build(); } return ResponseEntity.notFound().build(); } }