11package com .back .domain .roadmap .roadmap .controller ;
22
3- import com .back .domain .member .member .entity .Member ;
3+ import com .back .domain .member .member .service .MemberStorage ;
4+ import com .back .domain .member .mentor .entity .Mentor ;
45import com .back .domain .roadmap .roadmap .dto .request .MentorRoadmapSaveRequest ;
56import com .back .domain .roadmap .roadmap .dto .response .MentorRoadmapSaveResponse ;
67import com .back .domain .roadmap .roadmap .dto .response .MentorRoadmapResponse ;
78import com .back .domain .roadmap .roadmap .service .MentorRoadmapService ;
8- import com .back .global .exception .ServiceException ;
99import com .back .global .rq .Rq ;
1010import com .back .global .rsData .RsData ;
1111import io .swagger .v3 .oas .annotations .Operation ;
1212import io .swagger .v3 .oas .annotations .tags .Tag ;
1313import jakarta .validation .Valid ;
1414import lombok .RequiredArgsConstructor ;
15+ import org .springframework .security .access .prepost .PreAuthorize ;
1516import org .springframework .web .bind .annotation .*;
1617
1718@ RestController
1819@ RequestMapping ("/mentor-roadmaps" )
1920@ RequiredArgsConstructor
20- @ Tag (name = "MentorRoadmap " , description = "멘토 로드맵 관리 API" )
21+ @ Tag (name = "MentorRoadmapController " , description = "멘토 로드맵 API" )
2122public class MentorRoadmapController {
2223 private final MentorRoadmapService mentorRoadmapService ;
24+ private final MemberStorage memberStorage ;
2325 private final Rq rq ;
2426
2527 @ Operation (
@@ -35,15 +37,16 @@ public class MentorRoadmapController {
3537 사용 시나리오:
3638 1. TaskController로 Task 검색
3739 2. Task 선택 시 TaskId와 TaskName 획득
38- 3. Task 없는 경우 TaskId null, TaskName 직접 입력
39- 4. 노드 설명과 입력
40+ 3. Task 없는 경우 TaskId는 null, TaskName 직접 입력
41+ 4. description(Task에 대한 멘토의 경험, 조언, 학습 방법 등) 입력
4042 """
4143 )
4244 @ PostMapping
45+ @ PreAuthorize ("hasRole('MENTOR')" )
4346 public RsData <MentorRoadmapSaveResponse > create (@ Valid @ RequestBody MentorRoadmapSaveRequest request ) {
44- Member member = validateMentorAuth ( );
47+ Mentor mentor = memberStorage . findMentorByMember ( rq . getActor () );
4548
46- MentorRoadmapSaveResponse response = mentorRoadmapService .create (member .getId (), request );
49+ MentorRoadmapSaveResponse response = mentorRoadmapService .create (mentor .getId (), request );
4750
4851 return new RsData <>(
4952 "201" ,
@@ -53,17 +56,19 @@ public RsData<MentorRoadmapSaveResponse> create(@Valid @RequestBody MentorRoadma
5356 }
5457
5558 @ Operation (
56- summary = "멘토 로드맵 상세 조회" ,
59+ summary = "멘토 로드맵 상세 조회 (로드맵 ID) " ,
5760 description = """
5861 로드맵 ID로 멘토 로드맵 상세 정보를 조회합니다.
62+ 로그인한 사용자만 조회할 수 있습니다.
5963
6064 반환 정보:
6165 - 로드맵 기본 정보 (로드맵 ID, 멘토 ID, 제목, 설명, 생성일, 수정일 등)
6266 - 모든 노드 정보 (stepOrder 순으로 정렬)
6367 """
6468 )
6569 @ GetMapping ("/{id}" )
66- public RsData <MentorRoadmapResponse > getByMentorId (@ PathVariable Long id ) {
70+ @ PreAuthorize ("isAuthenticated()" )
71+ public RsData <MentorRoadmapResponse > getById (@ PathVariable Long id ) {
6772 MentorRoadmapResponse response = mentorRoadmapService .getById (id );
6873
6974 return new RsData <>(
@@ -73,12 +78,38 @@ public RsData<MentorRoadmapResponse> getByMentorId(@PathVariable Long id) {
7378 );
7479 }
7580
81+ @ Operation (
82+ summary = "멘토 로드맵 상세 조회 (멘토 ID)" ,
83+ description = """
84+ 멘토 ID로 해당 멘토의 로드맵 상세 정보를 조회합니다.
85+ 로그인한 사용자만 조회할 수 있습니다.
86+
87+ 반환 정보:
88+ - 로드맵 기본 정보 (로드맵 ID, 멘토 ID, 제목, 설명, 생성일, 수정일 등)
89+ - 모든 노드 정보 (stepOrder 순으로 정렬)
90+
91+ 주의: 멘토가 로드맵을 생성하지 않았다면 404 에러가 발생합니다.
92+ """
93+ )
94+ @ GetMapping ("/mentor/{mentorId}" )
95+ @ PreAuthorize ("isAuthenticated()" )
96+ public RsData <MentorRoadmapResponse > getByMentorId (@ PathVariable Long mentorId ) {
97+ MentorRoadmapResponse response = mentorRoadmapService .getByMentorId (mentorId );
98+
99+ return new RsData <>(
100+ "200" ,
101+ "멘토 로드맵 조회 성공" ,
102+ response
103+ );
104+ }
105+
76106 @ Operation (summary = "멘토 로드맵 수정" , description = "로드맵 ID로 로드맵을 찾아 수정합니다. 본인이 생성한 로드맵만 수정할 수 있습니다." )
77107 @ PutMapping ("/{id}" )
108+ @ PreAuthorize ("hasRole('MENTOR')" )
78109 public RsData <MentorRoadmapSaveResponse > update (@ PathVariable Long id , @ Valid @ RequestBody MentorRoadmapSaveRequest request ) {
79- Member member = validateMentorAuth ( );
110+ Mentor mentor = memberStorage . findMentorByMember ( rq . getActor () );
80111
81- MentorRoadmapSaveResponse response = mentorRoadmapService .update (id , member .getId (), request );
112+ MentorRoadmapSaveResponse response = mentorRoadmapService .update (id , mentor .getId (), request );
82113
83114 return new RsData <>(
84115 "200" ,
@@ -89,11 +120,11 @@ public RsData<MentorRoadmapSaveResponse> update(@PathVariable Long id, @Valid @R
89120
90121 @ Operation (summary = "멘토 로드맵 삭제" , description = "로드맵 ID로 로드맵을 삭제합니다. 본인이 생성한 로드맵만 삭제할 수 있습니다." )
91122 @ DeleteMapping ("/{id}" )
92- public RsData <Void > delete ( @ PathVariable Long id ) {
123+ @ PreAuthorize ("hasRole('MENTOR')" )
124+ public RsData <Void > delete (@ PathVariable Long id ) {
125+ Mentor mentor = memberStorage .findMentorByMember (rq .getActor ());
93126
94- Member member = validateMentorAuth ();
95-
96- mentorRoadmapService .delete (id , member .getId ());
127+ mentorRoadmapService .delete (id , mentor .getId ());
97128
98129 return new RsData <>(
99130 "200" ,
@@ -102,15 +133,4 @@ public RsData<Void> delete( @PathVariable Long id) {
102133 );
103134 }
104135
105- // 멘토 권한 검증
106- private Member validateMentorAuth () {
107- Member member = rq .getActor ();
108- if (member == null ) {
109- throw new ServiceException ("401" , "로그인이 필요합니다." );
110- }
111- if (member .getRole () != Member .Role .MENTOR ) {
112- throw new ServiceException ("403" , "멘토만 접근 가능합니다." );
113- }
114- return member ;
115- }
116136}
0 commit comments