@@ -125,7 +125,16 @@ public List<PlanListResponse> getPlanList(User user) {
125125 */
126126 public PlanDetailResponse getPlanDetail (Long planId , User user ) {
127127 Plan plan = findPlanWithParticipantCheck (planId , user );
128+ return buildPlanDetailResponse (plan );
129+ }
128130
131+ /**
132+ * Plan 엔티티를 PlanDetailResponse로 변환 (공통 메서드)
133+ *
134+ * @param plan Plan 엔티티
135+ * @return 계획 상세 정보
136+ */
137+ private PlanDetailResponse buildPlanDetailResponse (Plan plan ) {
129138 List <PlanDetailResponse .ParticipantInfo > participants = plan .getParticipants ().stream ()
130139 .map (participant -> PlanDetailResponse .ParticipantInfo .builder ()
131140 .id (participant .getParticipantId ())
@@ -138,7 +147,7 @@ public PlanDetailResponse getPlanDetail(Long planId, User user) {
138147 // 타임라인 형태로 일정 정렬 (startAt 기준) - 메인 이벤트와 일반 일정 모두 포함
139148 // Concert 정보까지 포함하여 조회 (메인 이벤트의 Concert 정보 포함)
140149 List <Schedule > sortedSchedules = scheduleRepository
141- .findByPlan_PlanIdOrderByStartAtAsc (planId );
150+ .findByPlan_PlanIdOrderByStartAtAsc (plan . getPlanId () );
142151
143152 List <PlanDetailResponse .ScheduleInfo > schedules = sortedSchedules .stream ()
144153 .map (item -> {
@@ -717,15 +726,37 @@ public PlanShareLinkResponse generateShareLink(Long planId, User user) {
717726 }
718727
719728 /**
720- * 공유 링크로 플랜 참가
729+ * 공유 링크로 플랜 조회 (참가자 생성 없이 조회만)
730+ *
731+ * @param shareToken 공유 토큰 (UUID 기반 13자)
732+ * @param user 현재 로그인한 사용자
733+ * @return 플랜 상세 정보
734+ * @throws BusinessException 공유 링크가 유효하지 않은 경우
735+ */
736+ public PlanDetailResponse getPlanByShareToken (String shareToken , User user ) {
737+ // shareToken으로 Plan 찾기
738+ Plan plan = planRepository .findByShareToken (shareToken )
739+ .orElseThrow (() -> new BusinessException (PlanErrorCode .INVALID_SHARE_TOKEN ));
740+
741+ // 자기 자신의 플랜은 조회 불가
742+ if (plan .getUserId ().equals (user .getId ())) {
743+ throw new BusinessException (PlanErrorCode .USER_ALREADY_PARTICIPANT );
744+ }
745+
746+ // 참가자 체크 없이 조회 가능 (공유 링크이므로)
747+ return buildPlanDetailResponse (plan );
748+ }
749+
750+ /**
751+ * 공유 링크로 플랜 참가 수락 (참가자 생성)
721752 *
722753 * @param shareToken 공유 토큰 (UUID 기반 13자)
723754 * @param user 현재 로그인한 사용자
724755 * @return 플랜 상세 정보
725756 * @throws BusinessException 공유 링크가 유효하지 않은 경우, 이미 참가자인 경우
726757 */
727758 @ Transactional
728- public PlanDetailResponse joinPlanByShareToken (String shareToken , User user ) {
759+ public PlanDetailResponse acceptPlanInvitation (String shareToken , User user ) {
729760 // shareToken으로 Plan 찾기
730761 Plan plan = planRepository .findByShareToken (shareToken )
731762 .orElseThrow (() -> new BusinessException (PlanErrorCode .INVALID_SHARE_TOKEN ));
@@ -779,7 +810,6 @@ public void deleteShareLink(Long planId, User user) {
779810 planRepository .save (plan );
780811 }
781812
782- // 계획 공유 수락
783813 // 계획 공유 거절
784814 // 계획 공유 인원 추방
785815 // 계획 공유 나가기
0 commit comments