Skip to content

Commit a32e42b

Browse files
committed
feat: 링크 클릭 시 해당 계획 조회로 로직 추가
1 parent 00e965b commit a32e42b

2 files changed

Lines changed: 54 additions & 10 deletions

File tree

src/main/java/com/back/web7_9_codecrete_be/domain/plans/controller/PlanController.java

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -258,17 +258,31 @@ public RsData<PlanShareLinkResponse> generateShareLink(@PathVariable Long planId
258258
}
259259

260260
/**
261-
* 공유 링크로 플랜 참가
261+
* 공유 링크로 플랜 조회 (참가자 생성 없이 조회만)
262262
*
263263
* @param shareToken 공유 토큰 (UUID 기반 13자)
264264
* @return 플랜 상세 정보 (200 OK)
265265
*/
266-
@PostMapping("/share/{shareToken}")
267-
@Operation(summary = "공유 링크로 플랜 참가", description = "공유 링크 토큰을 통해 플랜에 참가합니다. 유효한 공유 토큰이 필요하며, 이미 참가자인 경우 상태만 업데이트됩니다.")
268-
public RsData<PlanDetailResponse> joinPlanByShareToken(@PathVariable String shareToken) {
266+
@GetMapping("/share/{shareToken}")
267+
@Operation(summary = "공유 링크로 플랜 조회", description = "공유 링크 토큰을 통해 플랜을 조회합니다. 참가자 생성 없이 플랜 정보만 조회합니다.")
268+
public RsData<PlanDetailResponse> getPlanByShareToken(@PathVariable String shareToken) {
269269
User user = rq.getUser();
270-
PlanDetailResponse response = planService.joinPlanByShareToken(shareToken, user);
271-
return RsData.success("플랜 참가 성공", response);
270+
PlanDetailResponse response = planService.getPlanByShareToken(shareToken, user);
271+
return RsData.success("플랜 조회 성공", response);
272+
}
273+
274+
/**
275+
* 공유 링크로 플랜 참가 수락
276+
*
277+
* @param shareToken 공유 토큰 (UUID 기반 13자)
278+
* @return 플랜 상세 정보 (200 OK)
279+
*/
280+
@PostMapping("/share/{shareToken}/accept")
281+
@Operation(summary = "공유 링크로 플랜 참가 수락", description = "공유 링크 토큰을 통해 플랜 참가를 수락합니다. 참가자가 생성되며 상태가 ACCEPTED로 설정됩니다.")
282+
public RsData<PlanDetailResponse> acceptPlanInvitation(@PathVariable String shareToken) {
283+
User user = rq.getUser();
284+
PlanDetailResponse response = planService.acceptPlanInvitation(shareToken, user);
285+
return RsData.success("플랜 참가 수락 성공", response);
272286
}
273287

274288
/**

src/main/java/com/back/web7_9_codecrete_be/domain/plans/service/PlanService.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)