@@ -27,18 +27,51 @@ public class MentorRoadmapController {
2727 @ Operation (
2828 summary = "멘토 로드맵 생성" ,
2929 description = """
30- 멘토가 자신의 커리어 로드맵을 생성합니다.
31- - 멘토는 하나의 로드맵만 생성 가능
32- - TaskId는 nullable (DB에 있는 Task 중 선택하게 하고, 원하는 Task 없는 경우 null 가능)
33- - TaskName은 필수 (표시용 이름. DB에 있는 Task 선택시 해당 taskName으로 저장, 없는 경우 입력한 이름으로 저장)
34- - stepOrder는 1부터 시작하는 연속된 숫자로, 로드맵 상 노드의 순서를 나타냄
35- - 노드들은 stepOrder 순으로 자동 정렬(멘토 로드맵은 선형으로만 구성)
36-
37- 사용 시나리오:
38- 1. TaskController로 Task 검색
39- 2. Task 선택 시 TaskId와 TaskName 획득
40- 3. Task 없는 경우 TaskId는 null, TaskName 직접 입력
41- 4. description(Task에 대한 멘토의 경험, 조언, 학습 방법 등) 입력
30+ ### 개요
31+ 멘토가 자신의 커리어 여정을 단계별로 기록한 로드맵을 생성합니다.
32+
33+ ### 제약 사항
34+ - **멘토당 1개의 로드맵만 생성 가능** (중복 시 409 에러)
35+ - **최소 1개 이상의 노드** 필요
36+ - **stepOrder는 1부터 시작하는 연속된 숫자** (예: 1,2,3,...)
37+ - **멘토 권한(MENTOR)** 필요
38+
39+ ### 노드(RoadmapNode) 구성
40+
41+ **필수 필드:**
42+ - `taskName`: 기술/단계 이름 (최대 100자)
43+ - `stepOrder`: 로드맵 상 순서 (1부터 시작, 중복 불가)
44+
45+ **선택 필드:**
46+ - `taskId`: 표준 Task ID (nullable)
47+ - Task 검색(`/tasks/search`)으로 선택 가능
48+ - null이면 자동으로 pending alias 등록 (관리자 승인 대기)
49+ - `learningAdvice`: 학습 조언/방법 (최대 2000자)
50+ - `recommendedResources`: 추천 자료 (최대 2000자)
51+ - `learningGoals`: 학습 목표 (최대 1000자)
52+ - `difficulty`: 난이도 (1-5)
53+ - `importance`: 중요도 (1-5)
54+ - `hoursPerDay`: 하루 학습 시간
55+ - `weeks`: 학습 주차
56+ - `estimatedHours`: 자동 계산 (hoursPerDay × weeks × 7)
57+
58+ ### 사용 시나리오
59+ 1. `/tasks/search`로 Task 검색
60+ 2. 원하는 Task 선택 → taskId, taskName 획득
61+ 3. 원하는 Task 없으면 → taskId는 null, taskName 직접 입력
62+ 4. 각 단계별 학습 정보 입력 (조언, 자료, 목표 등)
63+ 5. 로드맵 생성 요청
64+
65+ ### 응답 코드
66+ - **201**: 생성 성공
67+ - **400**: 유효성 검증 실패 (stepOrder 불연속/중복 등)
68+ - **403**: 멘토 권한 없음
69+ - **404**: 존재하지 않는 taskId 참조
70+ - **409**: 이미 로드맵 존재
71+
72+ ### 참고
73+ - 멘토 로드맵은 선형 구조 (순차적 학습 경로)
74+ - 로드맵 생성 후 직업 로드맵 통합 이벤트 발행 (비동기)
4275 """
4376 )
4477 @ PostMapping
@@ -58,12 +91,29 @@ public RsData<MentorRoadmapSaveResponse> create(@Valid @RequestBody MentorRoadma
5891 @ Operation (
5992 summary = "멘토 로드맵 상세 조회 (로드맵 ID)" ,
6093 description = """
61- 로드맵 ID로 멘토 로드맵 상세 정보를 조회합니다.
62- 로그인한 사용자만 조회할 수 있습니다 .
94+ ### 개요
95+ 로드맵 ID로 멘토 로드맵의 전체 정보를 조회합니다 .
6396
64- 반환 정보:
65- - 로드맵 기본 정보 (로드맵 ID, 멘토 ID, 제목, 설명, 생성일, 수정일 등)
97+ ### 권한
98+ - 로그인한 모든 사용자 조회 가능
99+
100+ ### 반환 정보
101+ - 로드맵 기본 정보 (id, mentorId, title, description)
66102 - 모든 노드 정보 (stepOrder 순으로 정렬)
103+ - 생성일, 수정일
104+
105+ ### 노드 정보 구조
106+ 각 노드는 다음 정보를 포함합니다:
107+ - taskId, taskName: Task 정보
108+ - learningAdvice, recommendedResources, learningGoals: 학습 가이드
109+ - difficulty, importance: 난이도/중요도 (1-5)
110+ - hoursPerDay, weeks, estimatedHours: 학습 시간 정보
111+ - stepOrder: 로드맵 상 순서
112+
113+ ### 응답 코드
114+ - **200**: 조회 성공
115+ - **401**: 인증 필요
116+ - **404**: 로드맵을 찾을 수 없음
67117 """
68118 )
69119 @ GetMapping ("/{id}" )
@@ -81,14 +131,25 @@ public RsData<MentorRoadmapResponse> getById(@PathVariable Long id) {
81131 @ Operation (
82132 summary = "멘토 로드맵 상세 조회 (멘토 ID)" ,
83133 description = """
84- 멘토 ID로 해당 멘토의 로드맵 상세 정보를 조회합니다.
85- 로그인한 사용자만 조회할 수 있습니다.
134+ ### 개요
135+ 멘토 ID로 해당 멘토의 로드맵 전체 정보를 조회합니다.
136+
137+ ### 권한
138+ - 로그인한 모든 사용자 조회 가능
86139
87- 반환 정보:
88- - 로드맵 기본 정보 (로드맵 ID, 멘토 ID, 제목, 설명, 생성일, 수정일 등 )
140+ ### 반환 정보
141+ - 로드맵 기본 정보 (id, mentorId, title, description )
89142 - 모든 노드 정보 (stepOrder 순으로 정렬)
143+ - 생성일, 수정일
90144
91- 주의: 멘토가 로드맵을 생성하지 않았다면 404 에러가 발생합니다.
145+ ### 응답 코드
146+ - **200**: 조회 성공
147+ - **401**: 인증 필요
148+ - **404**: 해당 멘토의 로드맵을 찾을 수 없음
149+
150+ ### 참고
151+ - 멘토가 로드맵을 생성하지 않았으면 404 에러 발생
152+ - 멘토 ID는 Member ID가 아닌 Mentor 엔티티의 ID입니다
92153 """
93154 )
94155 @ GetMapping ("/mentor/{mentorId}" )
@@ -103,7 +164,36 @@ public RsData<MentorRoadmapResponse> getByMentorId(@PathVariable Long mentorId)
103164 );
104165 }
105166
106- @ Operation (summary = "멘토 로드맵 수정" , description = "로드맵 ID로 로드맵을 찾아 수정합니다. 본인이 생성한 로드맵만 수정할 수 있습니다." )
167+ @ Operation (
168+ summary = "멘토 로드맵 수정" ,
169+ description = """
170+ ### 개요
171+ 로드맵 ID로 로드맵을 찾아 전체 내용을 수정합니다.
172+
173+ ### 권한
174+ - **본인이 생성한 로드맵만 수정 가능** (타인 수정 시 403 에러)
175+ - 멘토 권한(MENTOR) 필요
176+
177+ ### 수정 방식
178+ - **전체 교체 방식**: 기존 노드를 모두 삭제하고 새 노드로 교체
179+ - 로드맵 제목, 설명도 함께 수정
180+ - 생성 API와 동일한 유효성 검증 적용
181+
182+ ### 요청 형식
183+ - 생성 API와 동일한 Request Body 사용
184+ - 모든 노드를 다시 전송해야 함 (부분 수정 불가)
185+
186+ ### 응답 코드
187+ - **200**: 수정 성공
188+ - **400**: 유효성 검증 실패
189+ - **403**: 본인의 로드맵이 아님
190+ - **404**: 로드맵을 찾을 수 없음
191+
192+ ### 참고
193+ - 수정 후 직업 로드맵 통합 이벤트 발행 (비동기)
194+ - taskId가 null인 노드는 자동으로 pending alias 등록
195+ """
196+ )
107197 @ PutMapping ("/{id}" )
108198 @ PreAuthorize ("hasRole('MENTOR')" )
109199 public RsData <MentorRoadmapSaveResponse > update (@ PathVariable Long id , @ Valid @ RequestBody MentorRoadmapSaveRequest request ) {
@@ -118,7 +208,30 @@ public RsData<MentorRoadmapSaveResponse> update(@PathVariable Long id, @Valid @R
118208 );
119209 }
120210
121- @ Operation (summary = "멘토 로드맵 삭제" , description = "로드맵 ID로 로드맵을 삭제합니다. 본인이 생성한 로드맵만 삭제할 수 있습니다." )
211+ @ Operation (
212+ summary = "멘토 로드맵 삭제" ,
213+ description = """
214+ ### 개요
215+ 로드맵 ID로 로드맵을 삭제합니다.
216+
217+ ### 권한
218+ - **본인이 생성한 로드맵만 삭제 가능** (타인 삭제 시 403 에러)
219+ - 멘토 권한(MENTOR) 필요
220+
221+ ### 삭제 범위
222+ - 로드맵과 모든 노드가 함께 삭제됩니다 (Cascade)
223+ - 참조하던 Task는 삭제되지 않습니다 (Task는 공유 자원)
224+
225+ ### 응답 코드
226+ - **200**: 삭제 성공
227+ - **403**: 본인의 로드맵이 아님
228+ - **404**: 로드맵을 찾을 수 없음
229+
230+ ### 참고
231+ - 삭제 후 직업 로드맵 통합 이벤트 발행 (비동기)
232+ - 삭제된 로드맵은 복구할 수 없습니다
233+ """
234+ )
122235 @ DeleteMapping ("/{id}" )
123236 @ PreAuthorize ("hasRole('MENTOR')" )
124237 public RsData <Void > delete (@ PathVariable Long id ) {
0 commit comments