From 9864265551ebd746c133d7a1b3d5e71e2be5dad9 Mon Sep 17 00:00:00 2001 From: Namgyu11 <103015031+Namgyu11@users.noreply.github.com> Date: Tue, 27 Aug 2024 23:23:25 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=EA=B0=80=20=EB=8F=99=ED=96=89=20=EC=8B=A0=EC=B2=AD=EC=9D=84=20?= =?UTF-8?q?=EC=B7=A8=EC=86=8C=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 신청자가 동행 게시물에 대한 신청을 취소할 수 있는 API를 추가했습니다. - 기존 PendingRequest.java 파일 삭제. - 이미 신청한 사용자가 신청을 다시 할 수 있도록 로직을 수정. - PendingStatus에 DEFAULT 상태를 추가하여 신청 취소 시 사용할 수 있도록 했습니다. Signed-off-by: Namgyu11 <103015031+Namgyu11@users.noreply.github.com> --- .../pending_list/dto/PendingRequest.java | 9 -- .../entity/type/PendingStatus.java | 4 +- .../service/PendingListService.java | 7 +- .../service/impl/PendingListServiceImpl.java | 89 +++++++++++++------ .../web/PendingListController.java | 9 ++ 5 files changed, 77 insertions(+), 41 deletions(-) delete mode 100644 src/main/java/connectripbe/connectrip_be/pending_list/dto/PendingRequest.java 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..aa24e74a 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 @@ -217,10 +238,26 @@ public PendingResponse rejectPending(Long memberId, Long accompanyPostId) { .build(); } + // 신청자가 해당 신청을 취소한다면 다시 신청 가능 @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(); } /** 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)); + } } From 3f8ed145bc921a8a69836ec6e3785243cc9d2322 Mon Sep 17 00:00:00 2001 From: Namgyu11 <103015031+Namgyu11@users.noreply.github.com> Date: Tue, 27 Aug 2024 23:27:04 +0900 Subject: [PATCH 2/2] =?UTF-8?q?add:=20cancelPending=20=EC=A3=BC=EC=84=9D?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Namgyu11 <103015031+Namgyu11@users.noreply.github.com> --- .../service/impl/PendingListServiceImpl.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) 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 aa24e74a..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 @@ -211,7 +211,7 @@ public PendingResponse acceptPending(Long memberId, Long accompanyPostId) { /** * 사용자의 동행 신청을 거절합니다. *

- * - 신청 상태를 REJECTED로 변경합니다. + * 신청 상태를 REJECTED로 변경합니다. * * @param memberId 거절할 사용자의 ID * @param accompanyPostId 신청한 게시물의 ID @@ -238,7 +238,15 @@ 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); @@ -260,6 +268,7 @@ public PendingResponse cancelPending(Long memberId, Long accompanyPostId) { .build(); } + /** * 이메일을 통해 MemberEntity 를 조회합니다. *