22
33import hackathon .soa .common .apiPayload .code .status .ErrorStatus ;
44import hackathon .soa .common .apiPayload .exception .CourseHandler ;
5+ import hackathon .soa .common .apiPayload .exception .GeneralException ;
56import hackathon .soa .common .apiPayload .exception .SegmentHandler ;
67import hackathon .soa .domain .course .repository .CourseRepository ;
8+ import hackathon .soa .domain .likes .LikesRepository ;
9+ import hackathon .soa .domain .member .MemberRepository ;
10+ import hackathon .soa .domain .search .SearchConverter ;
11+ import hackathon .soa .domain .search .dto .SearchResponseDTO ;
712import hackathon .soa .domain .segment .dto .SegmentResponseDTO ;
813import hackathon .soa .domain .segment .repository .CourseSegmentRepository ;
914import hackathon .soa .domain .segment .repository .MoveSegmentRepository ;
1015import hackathon .soa .domain .segment .repository .StaySegmentRepository ;
11- import hackathon .soa .entity .Course ;
12- import hackathon .soa .entity .CourseSegment ;
13- import hackathon .soa .entity .MoveSegment ;
14- import hackathon .soa .entity .StaySegment ;
16+ import hackathon .soa .entity .*;
1517import lombok .RequiredArgsConstructor ;
1618import lombok .extern .slf4j .Slf4j ;
1719import org .springframework .stereotype .Service ;
@@ -33,6 +35,8 @@ public class SegmentService {
3335 private final StaySegmentRepository staySegmentRepository ;
3436 private final MoveSegmentRepository moveSegmentRepository ;
3537 private final CourseRepository courseRepository ;
38+ private final MemberRepository memberRepository ;
39+ private final LikesRepository likesRepository ;
3640
3741 public SegmentResponseDTO .CourseDetailResponseDTO getCourseDetail (Long courseId , Long memberId ) {
3842 // 1. 코스 조회 및 작성자 확인
@@ -41,59 +45,45 @@ public SegmentResponseDTO.CourseDetailResponseDTO getCourseDetail(Long courseId,
4145
4246 boolean isOwner = course .getMember ().getId ().equals (memberId );
4347
44- // 2. 코스 세그먼트들을 순서대로 조회함
48+ // 2. 코스 기본 정보 및 좋아요 정보 조회
49+ SearchResponseDTO .SearchCourseResponseDTO courseInfo = getCourseById (memberId , courseId );
50+
51+ // 3. 코스 세그먼트들을 순서대로 조회
4552 List <CourseSegment > courseSegments = courseSegmentRepository .findByCourse_IdOrderBySegmentOrder (courseId );
4653
4754 if (courseSegments .isEmpty ()) {
4855 throw new CourseHandler (ErrorStatus .NOT_FOUND_COURSE );
4956 }
5057
51- // 3 . 각 세그먼트 정보를 조회하여 DTO 생성
58+ // 4 . 각 세그먼트 정보를 조회하여 DTO 생성
5259 List <SegmentResponseDTO .SegmentDetailDTO > segmentDetails = courseSegments .stream ()
53- .map (this :: buildSegmentDetail )
60+ .map (segment -> buildSegmentDetail ( segment , memberId ) )
5461 .collect (Collectors .toList ());
5562
56- return SegmentResponseDTO .CourseDetailResponseDTO .builder ()
57- .courseId (courseId )
58- .isOwner (isOwner )
59- .segments (segmentDetails )
60- .build ();
63+ // 5. SegmentConverter를 사용하여 최종 응답 DTO 생성
64+ return SegmentConverter .toCourseDetailResponseDTO (courseId , isOwner , courseInfo , segmentDetails );
6165 }
6266
63- private SegmentResponseDTO .SegmentDetailDTO buildSegmentDetail (CourseSegment courseSegment ) {
67+ private SegmentResponseDTO .SegmentDetailDTO buildSegmentDetail (CourseSegment courseSegment , Long memberId ) {
6468 Long segmentId = courseSegment .getId ();
6569
66- // 시간 포맷터 정의
67- DateTimeFormatter dateFormatter = DateTimeFormatter .ofPattern ("MM/dd(E)" , Locale .KOREAN );
68- DateTimeFormatter timeFormatter = DateTimeFormatter .ofPattern ("HH:mm" );
69-
7070 try {
7171 // 장소 세그먼트 먼저 확인 (@MapsId로 PK가 동일함)
7272 Optional <StaySegment > staySegment = staySegmentRepository .findById (segmentId );
7373 if (staySegment .isPresent ()) {
74- return SegmentResponseDTO .SegmentDetailDTO .builder ()
75- .segmentOrder (courseSegment .getSegmentOrder ())
76- .segmentType ("장소" )
77- .date (courseSegment .getStartTime ().format (dateFormatter ))
78- .startTime (courseSegment .getStartTime ().format (timeFormatter ))
79- .endTime (courseSegment .getEndTime ().format (timeFormatter ))
80- .staySegment (SegmentResponseDTO .StaySegmentDTO .from (staySegment .get ()))
81- .moveSegment (null )
82- .build ();
74+ // 현재 사용자가 이 장소 세그먼트에 참여했는지 확인
75+ boolean isParticipated = staySegment .get ().getSegmentParticipations ().stream ()
76+ .anyMatch (participation -> participation .getMember ().getId ().equals (memberId ));
77+
78+ // SegmentConverter를 사용하여 장소 세그먼트 DTO 생성
79+ return SegmentConverter .toSegmentDetailDTO (courseSegment , staySegment .get (), null , isParticipated );
8380 }
8481
8582 // 이동 세그먼트 확인 (@MapsId로 PK가 동일함)
8683 Optional <MoveSegment > moveSegment = moveSegmentRepository .findById (segmentId );
8784 if (moveSegment .isPresent ()) {
88- return SegmentResponseDTO .SegmentDetailDTO .builder ()
89- .segmentOrder (courseSegment .getSegmentOrder ())
90- .segmentType ("이동" )
91- .date (courseSegment .getStartTime ().format (dateFormatter ))
92- .startTime (courseSegment .getStartTime ().format (timeFormatter ))
93- .endTime (courseSegment .getEndTime ().format (timeFormatter ))
94- .staySegment (null )
95- .moveSegment (SegmentResponseDTO .MoveSegmentDTO .from (moveSegment .get ()))
96- .build ();
85+ // SegmentConverter를 사용하여 이동 세그먼트 DTO 생성
86+ return SegmentConverter .toSegmentDetailDTO (courseSegment , null , moveSegment .get (), false );
9787 }
9888
9989 throw new SegmentHandler (ErrorStatus .SEGMENT_NOT_FOUND );
@@ -103,4 +93,17 @@ private SegmentResponseDTO.SegmentDetailDTO buildSegmentDetail(CourseSegment cou
10393 throw new SegmentHandler (ErrorStatus .SEGMENT_DESERIALIZATION_ERROR );
10494 }
10595 }
96+
97+ public SearchResponseDTO .SearchCourseResponseDTO getCourseById (Long memberId , Long courseId ) {
98+
99+ Member member = memberRepository .findById (memberId )
100+ .orElseThrow (() -> new GeneralException (ErrorStatus .MEMBER_NOT_FOUND ));
101+
102+ Course course = courseRepository .findById (courseId )
103+ .orElseThrow (() -> new GeneralException (ErrorStatus .NOT_FOUND_COURSE ));
104+
105+ boolean liked = likesRepository .existsByCourseAndMember (course , member );
106+
107+ return SearchConverter .toSearchCourseResponseDTO (course , liked );
108+ }
106109}
0 commit comments