99import com .back .web7_9_codecrete_be .domain .plans .dto .response .PlanDetailResponse ;
1010import com .back .web7_9_codecrete_be .domain .plans .dto .response .PlanListResponse ;
1111import com .back .web7_9_codecrete_be .domain .plans .dto .response .PlanResponse ;
12+ import com .back .web7_9_codecrete_be .domain .plans .dto .response .PlanShareLinkResponse ;
1213import com .back .web7_9_codecrete_be .domain .plans .dto .response .ScheduleResponse ;
1314import com .back .web7_9_codecrete_be .domain .plans .dto .response .ScheduleListResponse ;
1415import com .back .web7_9_codecrete_be .domain .plans .dto .response .ScheduleDeleteResponse ;
@@ -212,75 +213,89 @@ public RsData<Void> updateParticipantRole(
212213 }
213214
214215 /**
215- * 계획 공유 초대
216+ * 계획 공유 인원 추방
216217 *
217218 * @param planId 계획 ID
219+ * @param participantId 참가자 ID
218220 * @return 성공 메시지 (200 OK)
219221 */
220- @ PostMapping ("/invite/{planId}" )
221- @ Operation (summary = "계획 공유 초대" , description = "다른 사용자에게 계획 공유를 초대합니다. 계획의 소유자 또는 편집 권한이 있는 사용자만 초대할 수 있습니다. 초대된 사용자는 수락 또는 거절할 수 있습니다." )
222- public RsData <Void > invitePlan (@ PathVariable Long planId ) {
222+ @ DeleteMapping ("/kick/{planId}/{participantId}" )
223+ @ Operation (summary = "계획 공유 인원 추방" , description = "계획에 참여 중인 사용자를 추방합니다. 계획의 소유자만 다른 참가자를 추방할 수 있으며, 소유자 자신은 추방할 수 없습니다." )
224+ public RsData <Void > kickParticipant (
225+ @ PathVariable Long planId ,
226+ @ PathVariable Long participantId ) {
223227 User user = rq .getUser ();
224228 // TODO: 구현 필요
225- return RsData .success ("계획 공유 초대 성공" , null );
229+ return RsData .success ("참가자 추방 성공" , null );
226230 }
227231
228232 /**
229- * 계획 공유 수락
233+ * 계획 공유 나가기
230234 *
231235 * @param planId 계획 ID
232236 * @return 성공 메시지 (200 OK)
233237 */
234- @ PostMapping ("/accept /{planId}" )
235- @ Operation (summary = "계획 공유 수락 " , description = "받은 계획 공유 초대를 수락합니다. 수락 시 해당 계획에 참가자로 추가되며, 초대 시 설정된 역할(Editor 또는 Viewer)로 참여하게 됩니다 ." )
236- public RsData <Void > acceptPlanInvite (@ PathVariable Long planId ) {
238+ @ DeleteMapping ("/quit /{planId}" )
239+ @ Operation (summary = "계획 공유 나가기 " , description = "공유된 계획에서 나갑니다. 계획의 소유자가 아닌 참가자만 사용할 수 있으며, 나가기 시 해당 계획의 참가자 목록에서 제거됩니다 ." )
240+ public RsData <Void > quitPlan (@ PathVariable Long planId ) {
237241 User user = rq .getUser ();
238242 // TODO: 구현 필요
239- return RsData .success ("계획 공유 수락 성공" , null );
243+ return RsData .success ("계획 나가기 성공" , null );
240244 }
241245
242246 /**
243- * 계획 공유 거절
247+ * 공유 링크 생성 (UUID 기반 13자)
244248 *
245249 * @param planId 계획 ID
246- * @return 성공 메시지 (200 OK)
250+ * @return 공유 링크 정보 (200 OK)
247251 */
248- @ PostMapping ("/deny/ {planId}" )
249- @ Operation (summary = "계획 공유 거절 " , description = "받은 계획 공유 초대를 거절합니다. 거절 시 해당 계획에 참가자로 추가되지 않으며, 초대 상태가 거절로 변경됩니다 ." )
250- public RsData <Void > denyPlanInvite (@ PathVariable Long planId ) {
252+ @ PostMapping ("/{planId}/share/link " )
253+ @ Operation (summary = "공유 링크 생성 " , description = "플랜 공유를 위한 UUID 기반 13자 토큰 링크를 생성합니다. 계획의 소유자 또는 편집 권한이 있는 사용자만 링크를 생성할 수 있습니다 ." )
254+ public RsData <PlanShareLinkResponse > generateShareLink (@ PathVariable Long planId ) {
251255 User user = rq .getUser ();
252- // TODO: 구현 필요
253- return RsData .success ("계획 공유 거절 성공" , null );
256+ PlanShareLinkResponse response = planService . generateShareLink ( planId , user );
257+ return RsData .success ("공유 링크 생성 성공" , response );
254258 }
255259
256260 /**
257- * 계획 공유 인원 추방
261+ * 공유 링크로 플랜 조회 (참가자 생성 없이 조회만)
258262 *
259- * @param planId 계획 ID
260- * @param participantId 참가자 ID
261- * @return 성공 메시지 (200 OK)
263+ * @param shareToken 공유 토큰 (UUID 기반 13자)
264+ * @return 플랜 상세 정보 (200 OK)
262265 */
263- @ DeleteMapping ("/kick/{planId}/{participantId}" )
264- @ Operation (summary = "계획 공유 인원 추방" , description = "계획에 참여 중인 사용자를 추방합니다. 계획의 소유자만 다른 참가자를 추방할 수 있으며, 소유자 자신은 추방할 수 없습니다." )
265- public RsData <Void > kickParticipant (
266- @ PathVariable Long planId ,
267- @ PathVariable Long participantId ) {
266+ @ GetMapping ("/share/{shareToken}" )
267+ @ Operation (summary = "공유 링크로 플랜 조회" , description = "공유 링크 토큰을 통해 플랜을 조회합니다. 참가자 생성 없이 플랜 정보만 조회합니다." )
268+ public RsData <PlanDetailResponse > getPlanByShareToken (@ PathVariable String shareToken ) {
268269 User user = rq .getUser ();
269- // TODO: 구현 필요
270- return RsData .success ("참가자 추방 성공" , null );
270+ PlanDetailResponse response = planService . getPlanByShareToken ( shareToken , user );
271+ return RsData .success ("플랜 조회 성공" , response );
271272 }
272273
273274 /**
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 );
286+ }
287+
288+ /**
289+ * 공유 링크 삭제
275290 *
276291 * @param planId 계획 ID
277292 * @return 성공 메시지 (200 OK)
278293 */
279- @ DeleteMapping ("/quit/ {planId}" )
280- @ Operation (summary = "계획 공유 나가기 " , description = "공유된 계획에서 나갑니다 . 계획의 소유자가 아닌 참가자만 사용할 수 있으며, 나가기 시 해당 계획의 참가자 목록에서 제거됩니다 ." )
281- public RsData <Void > quitPlan (@ PathVariable Long planId ) {
294+ @ DeleteMapping ("/{planId}/share/link " )
295+ @ Operation (summary = "공유 링크 삭제 " , description = "생성된 공유 링크를 삭제합니다 . 계획의 소유자 또는 편집 권한이 있는 사용자만 링크를 삭제할 수 있습니다 ." )
296+ public RsData <Void > deleteShareLink (@ PathVariable Long planId ) {
282297 User user = rq .getUser ();
283- // TODO: 구현 필요
284- return RsData .success ("계획 나가기 성공" , null );
298+ planService . deleteShareLink ( planId , user );
299+ return RsData .success ("공유 링크 삭제 성공" , null );
285300 }
286301}
0 commit comments