diff --git a/src/main/java/umc/codeplay/controller/TaskController.java b/src/main/java/umc/codeplay/controller/TaskController.java index e8f1418..5a4f59d 100644 --- a/src/main/java/umc/codeplay/controller/TaskController.java +++ b/src/main/java/umc/codeplay/controller/TaskController.java @@ -14,6 +14,8 @@ import umc.codeplay.domain.Task; import umc.codeplay.dto.MemberRequestDTO; import umc.codeplay.dto.MemberResponseDTO; +import umc.codeplay.dto.TaskResponseDTO; +import umc.codeplay.repository.MemberRepository; import umc.codeplay.service.ModelService; import umc.codeplay.service.MusicService; import umc.codeplay.service.TaskService; @@ -28,6 +30,7 @@ public class TaskController { private final MusicService musicService; private final ModelService modelService; private final TaskService taskService; + private final MemberRepository memberRepository; @Operation(summary = "화성분석 작업 요청", description = "음악 ID를 받아 화성분석 작업을 요청합니다.") @PostMapping("/harmony") @@ -82,4 +85,17 @@ public ApiResponse waitTask( Task task = taskService.waitTask(taskId, timeoutMillis); return ApiResponse.onSuccess(MemberConverter.toTaskProgressDTO(task)); } + + @Operation( + summary = "task id로 harmony, track, remix 조회", + description = "task id를 query parameter로 넘기고 그에 맞는 객체를 반환합니다.") + @GetMapping("/search") + public ApiResponse getByTaskId(@RequestParam Long taskId) { + + System.out.println("테스트중입니다"); + + TaskResponseDTO.GetByTaskIdDTO responseDTO = taskService.findByTaskId(taskId); + + return ApiResponse.onSuccess(responseDTO); + } } diff --git a/src/main/java/umc/codeplay/converter/TaskConverter.java b/src/main/java/umc/codeplay/converter/TaskConverter.java new file mode 100644 index 0000000..3104328 --- /dev/null +++ b/src/main/java/umc/codeplay/converter/TaskConverter.java @@ -0,0 +1,71 @@ +package umc.codeplay.converter; + +import java.util.ArrayList; +import java.util.stream.Collectors; + +import org.springframework.stereotype.Component; + +import lombok.RequiredArgsConstructor; + +import umc.codeplay.domain.Harmony; +import umc.codeplay.domain.Remix; +import umc.codeplay.domain.Track; +import umc.codeplay.dto.TaskResponseDTO; + +@Component +@RequiredArgsConstructor +public class TaskConverter { + + public TaskResponseDTO.HarmonyDTO toHarmonyDTO(Harmony harmony) { + + return TaskResponseDTO.HarmonyDTO.builder() + .harmonyId(harmony.getId()) + .musicId(harmony.getMusic().getId()) + .musicTitle(harmony.getMusic().getTitle()) + .createdAt(harmony.getCreatedAt()) + .scale(harmony.getScale()) + .genre(harmony.getGenre()) + .bpm(harmony.getBpm()) + .voiceColor(harmony.getVoiceColor()) + .build(); + } + + public TaskResponseDTO.TrackDTO toTrackDTO(Track track) { + + return TaskResponseDTO.TrackDTO.builder() + .trackId(track.getId()) + .musicId(track.getMusic().getId()) + .musicTitle(track.getMusic().getTitle()) + .createdAt(track.getCreatedAt()) + .vocalUrl(track.getVocalUrl()) + .instrumentalUrl(track.getInstrumentalUrl()) + .bassUrl(track.getBassUrl()) + .drumsUrl(track.getDrumsUrl()) + .build(); + } + + public TaskResponseDTO.RemixDTO toRemixDTO(Remix remix) { + + return TaskResponseDTO.RemixDTO.builder() + .remixId(remix.getId()) + .musicId(remix.getMusic().getId()) + .musicTitle(remix.getMusic().getTitle()) + .createdAt(remix.getCreatedAt()) + .scaleModulation(remix.getScaleModulation()) + .tempoRatio(remix.getTempoRatio()) + .reverbAmount(remix.getReverbAmount()) + .isCorusOn(remix.getIsChorusOn()) + .resultMusicUrl(remix.getResultMusicUrl()) + .parentRemixId( + remix.getParentRemix() != null + ? remix.getParentRemix().getId() + : null) // 부모 Remix ID + .childRemixList( + remix.getChildRemixList() != null + ? remix.getChildRemixList().stream() + .map(this::toRemixDTO) + .collect(Collectors.toList()) + : new ArrayList<>()) // 자식 Remix 리스트 + .build(); + } +} diff --git a/src/main/java/umc/codeplay/dto/SQSMessageDTO.java b/src/main/java/umc/codeplay/dto/SQSMessageDTO.java index 6fc358d..7581629 100644 --- a/src/main/java/umc/codeplay/dto/SQSMessageDTO.java +++ b/src/main/java/umc/codeplay/dto/SQSMessageDTO.java @@ -14,6 +14,7 @@ public class SQSMessageDTO { @AllArgsConstructor public static class HarmonyMessageDTO { String key; + Long musicId; Long taskId; String jobType; } @@ -24,6 +25,7 @@ public static class HarmonyMessageDTO { @AllArgsConstructor public static class TrackMessageDTO { String key; + Long musicId; Long taskId; String jobType; @@ -34,6 +36,7 @@ public static class TrackMessageDTO { @Setter public static class RemixMessageDTO { String key; + Long musicId; Long taskId; String jobType; diff --git a/src/main/java/umc/codeplay/dto/TaskResponseDTO.java b/src/main/java/umc/codeplay/dto/TaskResponseDTO.java new file mode 100644 index 0000000..41710ee --- /dev/null +++ b/src/main/java/umc/codeplay/dto/TaskResponseDTO.java @@ -0,0 +1,73 @@ +package umc.codeplay.dto; + +import java.time.LocalDateTime; +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +public class TaskResponseDTO { + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class HarmonyDTO { + // 화성분석Id, 음원Id, 음원제목, 생성 날짜, 키, bpm, 평균음압 + Long harmonyId; + Long musicId; + String musicTitle; + LocalDateTime createdAt; + String scale; + String genre; + Integer bpm; + String voiceColor; + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class TrackDTO { + // 세션 분리 harmonyId, 음원 harmonyId, 음원 제목, 생성일자, 보컬 파일 url, 반주 url, 베이스 파일 url, 드럼 파일 url, + Long trackId; + Long musicId; + String musicTitle; + LocalDateTime createdAt; + String vocalUrl; + String instrumentalUrl; + String bassUrl; + String drumsUrl; + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class RemixDTO { + Long remixId; + Long musicId; + String musicTitle; + LocalDateTime createdAt; + Integer scaleModulation; + Double tempoRatio; + Double reverbAmount; + Boolean isCorusOn; + String resultMusicUrl; + private Long parentRemixId; // 부모 Remix의 ID + private List childRemixList; // 자식 Remix 리스트 + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class GetByTaskIdDTO { + + private List harmonies; + private List tracks; + private List remixes; + } +} diff --git a/src/main/java/umc/codeplay/service/ModelService.java b/src/main/java/umc/codeplay/service/ModelService.java index 751fabc..a422f3b 100644 --- a/src/main/java/umc/codeplay/service/ModelService.java +++ b/src/main/java/umc/codeplay/service/ModelService.java @@ -75,7 +75,7 @@ public Task sendTrackMessage(Music music, String config) { } switch (config) { - case "vocals", "bass", "drums", "none": // TODO: 6-stems guitar, piano 테스트 후 추가 + case "vocals", "bass", "drums", "none", "guitar", "piano": break; default: throw new GeneralException(ErrorStatus.INVALID_CONFIG); @@ -86,6 +86,7 @@ public Task sendTrackMessage(Music music, String config) { queueName, SQSMessageDTO.TrackMessageDTO.builder() .key(music.getTitle()) + .musicId(music.getId()) .taskId(task.getId()) .jobType(JobType.TRACK.toString()) .twoStemConfig(config) @@ -106,6 +107,7 @@ public Task sendHarmonyMessage(Music music) { queueName, SQSMessageDTO.HarmonyMessageDTO.builder() .key(music.getTitle()) + .musicId(music.getId()) .taskId(task.getId()) .jobType(JobType.HARMONY.toString()) .build()); @@ -151,6 +153,7 @@ public Task sendRemixMessage(Music music, MemberRequestDTO.RemixTaskDTO request) Task task = taskService.addTask(newRemix); remixPayLoad.setKey(music.getTitle()); + remixPayLoad.setMusicId(music.getId()); remixPayLoad.setTaskId(task.getId()); remixPayLoad.setJobType(JobType.REMIX.toString()); diff --git a/src/main/java/umc/codeplay/service/TaskService.java b/src/main/java/umc/codeplay/service/TaskService.java index 1c05427..20f1232 100644 --- a/src/main/java/umc/codeplay/service/TaskService.java +++ b/src/main/java/umc/codeplay/service/TaskService.java @@ -2,6 +2,8 @@ import java.time.Duration; import java.time.Instant; +import java.util.ArrayList; +import java.util.List; import org.springframework.stereotype.Service; @@ -9,9 +11,11 @@ import umc.codeplay.apiPayLoad.code.status.ErrorStatus; import umc.codeplay.apiPayLoad.exception.GeneralException; +import umc.codeplay.converter.TaskConverter; import umc.codeplay.domain.*; import umc.codeplay.domain.enums.JobType; import umc.codeplay.domain.enums.ProcessStatus; +import umc.codeplay.dto.TaskResponseDTO; import umc.codeplay.repository.HarmonyRepository; import umc.codeplay.repository.RemixRepository; import umc.codeplay.repository.TaskRepository; @@ -25,6 +29,7 @@ public class TaskService { private final RemixRepository remixRepository; private final TrackRepository trackRepository; private final HarmonyRepository harmonyRepository; + private final TaskConverter taskConverter; public Task findById(Long id) { return taskRepository @@ -99,4 +104,45 @@ public Task waitTask(Long id, long timeoutMillis) { return findById(id); } + + public TaskResponseDTO.GetByTaskIdDTO findByTaskId(Long taskId) { + // task 객체 찾기 + Task task = + taskRepository + .findById(taskId) + .orElseThrow(() -> new RuntimeException("Task를 찾을 수 없습니다.")); + + List harmonyDTOs = new ArrayList<>(); + List trackDTOs = new ArrayList<>(); + List remixDTOs = new ArrayList<>(); + + // job_type에 따라 해당 객체 조회 후 DTO 반환 + switch (task.getJobType()) { + case HARMONY: + Harmony harmony = + harmonyRepository + .findById(task.getJobId()) + .orElseThrow(() -> new RuntimeException("Harmony를 찾을 수 없습니다.")); + + harmonyDTOs.add(taskConverter.toHarmonyDTO(harmony)); + break; + case TRACK: + Track track = + trackRepository + .findById(task.getJobId()) + .orElseThrow(() -> new RuntimeException("Track을 찾을 수 없습니다.")); + trackDTOs.add(taskConverter.toTrackDTO(track)); + break; + case REMIX: + Remix remix = + remixRepository + .findById(task.getJobId()) + .orElseThrow(() -> new RuntimeException("Remix를 찾을 수 없습니다.")); + remixDTOs.add(taskConverter.toRemixDTO(remix)); + break; + } + + // DTO를 하나의 객체로 묶어서 반환 + return new TaskResponseDTO.GetByTaskIdDTO(harmonyDTOs, trackDTOs, remixDTOs); + } }