diff --git a/src/main/java/connectripbe/connectrip_be/pending_list/dto/PendingRequest.java b/src/main/java/connectripbe/connectrip_be/pending_list/dto/PendingRequest.java deleted file mode 100644 index 3ee02787..00000000 --- a/src/main/java/connectripbe/connectrip_be/pending_list/dto/PendingRequest.java +++ /dev/null @@ -1,9 +0,0 @@ -package connectripbe.connectrip_be.pending_list.dto; - -import lombok.Builder; - -@Builder -public record PendingRequest( -) { - -} diff --git a/src/main/java/connectripbe/connectrip_be/pending_list/entity/type/PendingStatus.java b/src/main/java/connectripbe/connectrip_be/pending_list/entity/type/PendingStatus.java index 44539cf6..3fa407d8 100644 --- a/src/main/java/connectripbe/connectrip_be/pending_list/entity/type/PendingStatus.java +++ b/src/main/java/connectripbe/connectrip_be/pending_list/entity/type/PendingStatus.java @@ -10,8 +10,8 @@ public enum PendingStatus { PENDING("대기중"), ACCEPTED("수락"), REJECTED("거절"), - EXIT_ROOM("나감") - ; + EXIT_ROOM("나감"), + DEFAULT("기본"); private final String message; } diff --git a/src/main/java/connectripbe/connectrip_be/pending_list/service/PendingListService.java b/src/main/java/connectripbe/connectrip_be/pending_list/service/PendingListService.java index 55980068..d05f6613 100644 --- a/src/main/java/connectripbe/connectrip_be/pending_list/service/PendingListService.java +++ b/src/main/java/connectripbe/connectrip_be/pending_list/service/PendingListService.java @@ -17,14 +17,13 @@ public interface PendingListService { // 사용자가 해당 게시물에 신청하는 api PendingResponse accompanyPending(Long memberId, Long accompanyPostId); - // - 신청을 수락한다면(수락된다면) 채팅방 참여 멤버로 등록 + // 신청을 수락한다면(수락된다면) 채팅방 참여 멤버로 등록 PendingResponse acceptPending(Long memberId, Long accompanyPostId); - // - 신청자가 거절 당한다면 해당 게시물에 다시 신청 못 함. + // 신청자가 거절 당한다면 해당 게시물에 다시 신청 못 함. PendingResponse rejectPending(Long memberId, Long accompanyPostId); - // TODO 신청자가 해당 신청을 취소하는 api - // - 신청자가 해당 신청을 취소한다면 다시 신청 가능 + // 신청자가 해당 신청을 취소한다면 다시 신청 가능 PendingResponse cancelPending(Long memberId, Long accompanyPostId); diff --git a/src/main/java/connectripbe/connectrip_be/pending_list/service/impl/PendingListServiceImpl.java b/src/main/java/connectripbe/connectrip_be/pending_list/service/impl/PendingListServiceImpl.java index 83d7f380..978c1e40 100644 --- a/src/main/java/connectripbe/connectrip_be/pending_list/service/impl/PendingListServiceImpl.java +++ b/src/main/java/connectripbe/connectrip_be/pending_list/service/impl/PendingListServiceImpl.java @@ -104,13 +104,13 @@ public PendingResponse getMyPendingStatus(Long memberId, Long accompanyPostId) { .status("NONE") .build(); } else { - return null; + throw e; } } } /** - * 현재 로그인한 사용자가 특정 동행 게시물에 대해 새로운 동행 신청을 생성. + * 사용자가 동행 게시물에 신청합니다. * * @param accompanyPostId 신청할 게시물의 ID * @param memberId 현재 로그인한 사용자의 아이디 @@ -124,37 +124,58 @@ public PendingResponse accompanyPending(Long memberId, Long accompanyPostId) { // 게시물 ID로 AccompanyPostEntity 조회 AccompanyPostEntity accompanyPost = getAccompanyPost(accompanyPostId); - // 게시물 작성자와 현재 로그인한 사용자가 같은지 확인 - if (accompanyPost.getMemberEntity().getId().equals(memberId)) { - throw new GlobalException(ErrorCode.WRITE_YOURSELF); - } + try { + // 게시물 작성자와 현재 로그인한 사용자가 같은지 확인 + if (accompanyPost.getMemberEntity().getId().equals(memberId)) { + throw new GlobalException(ErrorCode.WRITE_YOURSELF); + } - // 이미 신청한 사용자인지 확인 - if (pendingListRepository.existsByMemberAndAccompanyPost(member, accompanyPost)) { - throw new GlobalException(ErrorCode.PENDING_ALREADY_EXISTS); - } + // 이미 신청한 사용자인지 확인 + if (pendingListRepository.existsByMemberAndAccompanyPost(member, accompanyPost)) { + throw new GlobalException(ErrorCode.PENDING_ALREADY_EXISTS); + } - // 새로운 PendingListEntity 생성 - PendingListEntity pendingListEntity = PendingListEntity.builder() - .member(member) - .accompanyPost(accompanyPost) - .status(PendingStatus.PENDING) - .build(); + // 새로운 PendingListEntity 생성 + PendingListEntity pendingListEntity = PendingListEntity.builder() + .member(member) + .accompanyPost(accompanyPost) + .status(PendingStatus.PENDING) + .build(); - // 생성된 엔티티를 저장 - PendingListEntity saved = pendingListRepository.save(pendingListEntity); + // 생성된 엔티티를 저장 + PendingListEntity saved = pendingListRepository.save(pendingListEntity); - // 저장된 신청 상태를 반환 - return PendingResponse.builder() - .status(saved.getStatus().toString()) - .build(); + // 저장된 신청 상태를 반환 + return PendingResponse.builder() + .status(saved.getStatus().toString()) + .build(); + + } catch (GlobalException e) { + if (ErrorCode.PENDING_ALREADY_EXISTS.equals(e.getErrorCode())) { + // 이미 존재하는 신청 상태를 조회 + PendingListEntity existingPending = pendingListRepository.findByAccompanyPostAndMember(accompanyPost, + member) + .orElseThrow(() -> new GlobalException(ErrorCode.PENDING_NOT_FOUND)); + + // 상태가 DEFAULT라면 PENDING으로 업데이트 + if (existingPending.getStatus().equals(PendingStatus.DEFAULT)) { + existingPending.updateStatus(PendingStatus.PENDING); + pendingListRepository.save(existingPending); + } + + // 현재 상태를 반환 + return PendingResponse.builder() + .status(existingPending.getStatus().toString()) + .build(); + } else { + throw e; + } + } } /** - * 사용자의 동행 신청을 수락합니다. - *

- * - 신청 상태를 ACCEPTED로 변경하고, 해당 사용자를 채팅방에 추가합니다. + * 사용자의 동행 신청을 수락. - 신청 상태를 ACCEPTE D로 변경하고, 해당 사용자를 채팅방에 추가. * * @param memberId 수락할 사용자의 ID * @param accompanyPostId 신청한 게시물의 ID @@ -190,7 +211,7 @@ public PendingResponse acceptPending(Long memberId, Long accompanyPostId) { /** * 사용자의 동행 신청을 거절합니다. *

- * - 신청 상태를 REJECTED로 변경합니다. + * 신청 상태를 REJECTED로 변경합니다. * * @param memberId 거절할 사용자의 ID * @param accompanyPostId 신청한 게시물의 ID @@ -217,12 +238,37 @@ public PendingResponse rejectPending(Long memberId, Long accompanyPostId) { .build(); } + + /** + * 사용자가 자신이 신청한 동행 신청을 취소 . 사용자가 현재 PENDING 상태인 동행 신청을 취소하고, 상태를 DEFAULT 로 변경. 상태가 PENDING 이 아닌 경우, 예외를 발생. + * + * @param memberId 신청을 취소할 사용자의 ID + * @param accompanyPostId 신청을 취소할 게시물의 ID + * @return PendingResponse 신청 취소 후의 상태를 반환하는 객체 (DEFAULT 상태) + * @throws GlobalException 신청 상태를 찾을 수 없거나, 상태가 PENDING 이 아닌 경우 예외 발생 + */ @Override public PendingResponse cancelPending(Long memberId, Long accompanyPostId) { + MemberEntity member = getMember(memberId); + AccompanyPostEntity accompanyPost = getAccompanyPost(accompanyPostId); - return null; + PendingListEntity pending = pendingListRepository.findByAccompanyPostAndMember(accompanyPost, member) + .orElseThrow(() -> new GlobalException(ErrorCode.PENDING_NOT_FOUND)); + + // 상태가 PENDING 인 경우에만 취소 가능 + if (!pending.getStatus().equals(PendingStatus.PENDING)) { + throw new GlobalException(ErrorCode.PENDING_NOT_FOUND); + } + + pending.updateStatus(PendingStatus.DEFAULT); + pendingListRepository.save(pending); + + return PendingResponse.builder() + .status(pending.getStatus().toString()) + .build(); } + /** * 이메일을 통해 MemberEntity 를 조회합니다. * diff --git a/src/main/java/connectripbe/connectrip_be/pending_list/web/PendingListController.java b/src/main/java/connectripbe/connectrip_be/pending_list/web/PendingListController.java index 6bf6ba13..1edb0d06 100644 --- a/src/main/java/connectripbe/connectrip_be/pending_list/web/PendingListController.java +++ b/src/main/java/connectripbe/connectrip_be/pending_list/web/PendingListController.java @@ -63,4 +63,13 @@ public ResponseEntity rejectPending( ) { return ResponseEntity.ok(pendingListService.rejectPending(memberId, id)); } + + // 사용자가 본인이 신청한 동행 신청 취소 + @PostMapping("/cancel") + public ResponseEntity cancelPending( + @AuthenticationPrincipal Long memberId, + @PathVariable Long id + ) { + return ResponseEntity.ok(pendingListService.cancelPending(memberId, id)); + } }