44import com .back .domain .member .mentor .repository .MentorRepository ;
55import com .back .domain .roadmap .roadmap .dto .request .MentorRoadmapSaveRequest ;
66import com .back .domain .roadmap .roadmap .dto .request .RoadmapNodeRequest ;
7- import com .back .domain .roadmap .roadmap .dto .response .MentorRoadmapSaveResponse ;
87import com .back .domain .roadmap .roadmap .dto .response .MentorRoadmapResponse ;
8+ import com .back .domain .roadmap .roadmap .dto .response .MentorRoadmapSaveResponse ;
99import com .back .domain .roadmap .roadmap .entity .MentorRoadmap ;
1010import com .back .domain .roadmap .roadmap .entity .RoadmapNode ;
1111import com .back .domain .roadmap .roadmap .repository .MentorRoadmapRepository ;
1212import com .back .domain .roadmap .roadmap .repository .RoadmapNodeRepository ;
1313import com .back .domain .roadmap .task .entity .Task ;
14- import com .back .domain .roadmap .task .repository . TaskRepository ;
14+ import com .back .domain .roadmap .task .service . TaskService ;
1515import com .back .global .exception .ServiceException ;
1616import lombok .RequiredArgsConstructor ;
1717import lombok .extern .slf4j .Slf4j ;
2121import java .util .ArrayList ;
2222import java .util .List ;
2323import java .util .Map ;
24- import java .util .function .Function ;
25- import java .util .stream .Collectors ;
2624
2725@ Service
2826@ RequiredArgsConstructor
2927@ Slf4j
3028public class MentorRoadmapService {
3129 private final MentorRoadmapRepository mentorRoadmapRepository ;
3230 private final RoadmapNodeRepository roadmapNodeRepository ;
33- private final TaskRepository taskRepository ;
3431 private final MentorRepository mentorRepository ;
32+ private final TaskService taskService ;
3533
3634 // 멘토 로드맵 생성
3735 @ Transactional
@@ -48,6 +46,9 @@ public MentorRoadmapSaveResponse create(Long mentorId, MentorRoadmapSaveRequest
4846 // 공통 검증(노드 개수, stepOrder 연속성)
4947 validateRequest (request );
5048
49+ // taskId가 null인 자유입력 Task를 자동으로 pending alias로 등록
50+ registerPendingAliasesForFreeInputTasks (request .nodes ());
51+
5152 // MentorRoadmap 생성 및 저장 (로드맵 ID 확보)
5253 MentorRoadmap mentorRoadmap = new MentorRoadmap (mentor , request .title (), request .description ());
5354 mentorRoadmap = mentorRoadmapRepository .save (mentorRoadmap );
@@ -106,6 +107,9 @@ public MentorRoadmapSaveResponse update(Long id, Long mentorId, MentorRoadmapSav
106107 // 공통 검증
107108 validateRequest (request );
108109
110+ // taskId가 null인 자유입력 Task를 자동으로 pending alias로 등록
111+ registerPendingAliasesForFreeInputTasks (request .nodes ());
112+
109113 // 로드맵 기본 정보 수정
110114 mentorRoadmap .updateTitle (request .title ());
111115 mentorRoadmap .updateDescription (request .description ());
@@ -159,6 +163,16 @@ public void delete(Long roadmapId, Long mentorId) {
159163 log .info ("멘토 로드맵 삭제 완료 - 멘토 ID: {}, 로드맵 ID: {}" , mentorId , roadmapId );
160164 }
161165
166+ // taskId가 null인 자유입력 Task를 자동으로 pending alias로 등록
167+ private void registerPendingAliasesForFreeInputTasks (List <RoadmapNodeRequest > nodes ) {
168+ for (RoadmapNodeRequest node : nodes ) {
169+ if (node .taskId () == null && node .taskName () != null ) {
170+ // TaskService를 통해 pending alias 자동 등록 (이미 존재하면 무시)
171+ taskService .createPendingAliasIfNotExists (node .taskName ());
172+ }
173+ }
174+ }
175+
162176 // 로드맵 요청 공통 유효성 검증
163177 private void validateRequest (MentorRoadmapSaveRequest request ) {
164178 if (request .nodes ().isEmpty ()) {
@@ -218,26 +232,8 @@ private Map<Long, Task> getValidatedTasksMap(List<RoadmapNodeRequest> nodeReques
218232 .distinct ()
219233 .toList ();
220234
221- if (taskIds .isEmpty ()) {
222- return Map .of (); // 빈 맵 반환
223- }
224-
225- // 일괄 조회로 존재하는 Task들 확인
226- List <Task > existingTasks = taskRepository .findAllById (taskIds );
227- Map <Long , Task > existingTaskMap = existingTasks .stream ()
228- .collect (Collectors .toMap (Task ::getId , Function .identity ()));
229-
230- // 존재하지 않는 TaskId 확인
231- List <Long > missingTaskIds = taskIds .stream ()
232- .filter (taskId -> !existingTaskMap .containsKey (taskId ))
233- .toList ();
234-
235- if (!missingTaskIds .isEmpty ()) {
236- throw new ServiceException ("404" ,
237- String .format ("존재하지 않는 Task ID: %s" , missingTaskIds ));
238- }
239-
240- return existingTaskMap ;
235+ // TaskService에 위임하여 검증 및 조회
236+ return taskService .validateAndGetTasks (taskIds );
241237 }
242238
243239
0 commit comments