From 5781fd94a939a70cca3edc8d34306f197e9b9175 Mon Sep 17 00:00:00 2001 From: hs12 Date: Sat, 14 Sep 2024 18:34:12 +0900 Subject: [PATCH 01/23] =?UTF-8?q?[feat]=20:=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=20=EC=8B=9C=20=ED=81=AC=EB=A0=88=EB=94=A7=20?= =?UTF-8?q?=EC=B0=A8=EA=B0=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java b/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java index 8f7c386..bc71372 100644 --- a/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java +++ b/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java @@ -55,7 +55,7 @@ private ChatRoom(QuestionPost questionPost, Member inquirer, Member answerer) { this.inquirer = inquirer; this.answerer = answerer; this.isAccepted = false; - validateInquirerCredit(); + inquirer.decreaseCredit(2000); } public static ChatRoom of( @@ -65,10 +65,4 @@ public static ChatRoom of( ) { return new ChatRoom(questionPost, inquirer, answerer); } - - private void validateInquirerCredit() { - if (inquirer.getCredit() < 2000) { - throw new ValidationException(MemberErrorCode.NOT_ENOUGH_CREDIT); - } - } } From 375f50aec52428c1ccc5e7a87fdae3f8b25cdd94 Mon Sep 17 00:00:00 2001 From: hs12 Date: Sat, 14 Sep 2024 18:43:37 +0900 Subject: [PATCH 02/23] =?UTF-8?q?[feat]=20:=20=EC=B1=84=ED=8C=85=EB=B0=A9?= =?UTF-8?q?=20=EC=88=98=EB=9D=BD=20=EC=97=AC=EB=B6=80=20=ED=95=84=EB=93=9C?= =?UTF-8?q?=20->=20=EC=83=81=ED=83=9C=20enum=EC=9C=BC=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dnd/gongmuin/chat/domain/ChatRoom.java | 9 ++++++--- .../com/dnd/gongmuin/chat/domain/ChatStatus.java | 15 +++++++++++++++ .../com/dnd/gongmuin/chat/dto/ChatRoomMapper.java | 3 ++- .../chat/dto/response/ChatRoomDetailResponse.java | 2 +- 4 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/dnd/gongmuin/chat/domain/ChatStatus.java diff --git a/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java b/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java index bc71372..b37f62a 100644 --- a/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java +++ b/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java @@ -1,6 +1,7 @@ package com.dnd.gongmuin.chat.domain; import static jakarta.persistence.ConstraintMode.*; +import static jakarta.persistence.EnumType.*; import static jakarta.persistence.FetchType.*; import com.dnd.gongmuin.common.entity.TimeBaseEntity; @@ -11,6 +12,7 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.Enumerated; import jakarta.persistence.ForeignKey; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; @@ -47,14 +49,15 @@ public class ChatRoom extends TimeBaseEntity { foreignKey = @ForeignKey(NO_CONSTRAINT)) private Member answerer; - @Column(name = "is_accepted", nullable = false) - private boolean isAccepted; + @Enumerated(STRING) + @Column(name = "status", nullable = false) + private ChatStatus status; private ChatRoom(QuestionPost questionPost, Member inquirer, Member answerer) { this.questionPost = questionPost; this.inquirer = inquirer; this.answerer = answerer; - this.isAccepted = false; + this.status = ChatStatus.PENDING; inquirer.decreaseCredit(2000); } diff --git a/src/main/java/com/dnd/gongmuin/chat/domain/ChatStatus.java b/src/main/java/com/dnd/gongmuin/chat/domain/ChatStatus.java new file mode 100644 index 0000000..dd1b3fc --- /dev/null +++ b/src/main/java/com/dnd/gongmuin/chat/domain/ChatStatus.java @@ -0,0 +1,15 @@ +package com.dnd.gongmuin.chat.domain; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum ChatStatus { + + PENDING("요청중"), + ACCEPTED("수락됨"), + DENIED("거절됨"); + + private final String label; +} diff --git a/src/main/java/com/dnd/gongmuin/chat/dto/ChatRoomMapper.java b/src/main/java/com/dnd/gongmuin/chat/dto/ChatRoomMapper.java index 6f90e76..5cebcf4 100644 --- a/src/main/java/com/dnd/gongmuin/chat/dto/ChatRoomMapper.java +++ b/src/main/java/com/dnd/gongmuin/chat/dto/ChatRoomMapper.java @@ -38,7 +38,8 @@ public static ChatRoomDetailResponse toChatRoomDetailResponse(ChatRoom chatRoom) answerer.getJobGroup().getLabel(), answerer.getProfileImageNo() ), - chatRoom.isAccepted() + chatRoom.getStatus().getLabel() ); } + } diff --git a/src/main/java/com/dnd/gongmuin/chat/dto/response/ChatRoomDetailResponse.java b/src/main/java/com/dnd/gongmuin/chat/dto/response/ChatRoomDetailResponse.java index 5906f60..e59a481 100644 --- a/src/main/java/com/dnd/gongmuin/chat/dto/response/ChatRoomDetailResponse.java +++ b/src/main/java/com/dnd/gongmuin/chat/dto/response/ChatRoomDetailResponse.java @@ -7,6 +7,6 @@ public record ChatRoomDetailResponse( String targetJobGroup, String title, MemberInfo receiverInfo, - boolean isAccepted + String status ) { } From 0dc44eaba57b5c4e8f57797af3ae43cad13c7f1a Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 19:38:49 +0900 Subject: [PATCH 03/23] =?UTF-8?q?[feat]=20:=20=EC=B1=84=ED=8C=85=EB=B0=A9?= =?UTF-8?q?=20=EC=88=98=EB=9D=BD=20=EC=9D=91=EB=8B=B5=20DTO=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dnd/gongmuin/chat/dto/response/AcceptChatResponse.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/com/dnd/gongmuin/chat/dto/response/AcceptChatResponse.java diff --git a/src/main/java/com/dnd/gongmuin/chat/dto/response/AcceptChatResponse.java b/src/main/java/com/dnd/gongmuin/chat/dto/response/AcceptChatResponse.java new file mode 100644 index 0000000..5f64d56 --- /dev/null +++ b/src/main/java/com/dnd/gongmuin/chat/dto/response/AcceptChatResponse.java @@ -0,0 +1,7 @@ +package com.dnd.gongmuin.chat.dto.response; + +public record AcceptChatResponse( + String chatStatus, + int credit +) { +} From 6748dc4076d75d5bd893d595f844a65e2601d2b0 Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 19:39:26 +0900 Subject: [PATCH 04/23] =?UTF-8?q?[feat]=20:=20=EC=B1=84=ED=8C=85=EB=B0=A9?= =?UTF-8?q?=20=EC=88=98=EB=9D=BD=20=EA=B4=80=EB=A0=A8=20=EC=97=90=EB=9F=AC?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dnd/gongmuin/chat/exception/ChatErrorCode.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/dnd/gongmuin/chat/exception/ChatErrorCode.java b/src/main/java/com/dnd/gongmuin/chat/exception/ChatErrorCode.java index d26d0a5..fe31020 100644 --- a/src/main/java/com/dnd/gongmuin/chat/exception/ChatErrorCode.java +++ b/src/main/java/com/dnd/gongmuin/chat/exception/ChatErrorCode.java @@ -10,7 +10,9 @@ public enum ChatErrorCode implements ErrorCode { INVALID_MESSAGE_TYPE("메시지 타입을 올바르게 입력해주세요.", "CH_001"), - NOT_FOUND_CHAT_ROOM("해당 아이디의 채팅방이 존재하지 않습니다.", "CH_002"); + NOT_FOUND_CHAT_ROOM("해당 아이디의 채팅방이 존재하지 않습니다.", "CH_002"), + UNAUTHORIZED_REQUEST("채팅 수락을 하거나 거절할 권한이 없습니다.", "CH_003"), + UNABLE_TO_ACCEPT("이미 수락했거나 거절한 요청입니다.", "CH_004"); private final String message; private final String code; From 87f19b62318e02d7e112655bf476b405a134147f Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 19:40:19 +0900 Subject: [PATCH 05/23] =?UTF-8?q?[feat]=20:=20=EC=B1=84=ED=8C=85=EB=B0=A9?= =?UTF-8?q?=20=EC=97=94=ED=8B=B0=ED=8B=B0=20->=20=EC=9D=91=EB=8B=B5=20?= =?UTF-8?q?=EB=B3=80=ED=99=98=20=EB=A7=A4=ED=8D=BC=20=ED=95=A8=EC=88=98=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 --- .../java/com/dnd/gongmuin/chat/dto/ChatRoomMapper.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/dnd/gongmuin/chat/dto/ChatRoomMapper.java b/src/main/java/com/dnd/gongmuin/chat/dto/ChatRoomMapper.java index 5cebcf4..90e3f70 100644 --- a/src/main/java/com/dnd/gongmuin/chat/dto/ChatRoomMapper.java +++ b/src/main/java/com/dnd/gongmuin/chat/dto/ChatRoomMapper.java @@ -1,6 +1,7 @@ package com.dnd.gongmuin.chat.dto; import com.dnd.gongmuin.chat.domain.ChatRoom; +import com.dnd.gongmuin.chat.dto.response.AcceptChatResponse; import com.dnd.gongmuin.chat.dto.response.ChatRoomDetailResponse; import com.dnd.gongmuin.member.domain.Member; import com.dnd.gongmuin.question_post.domain.QuestionPost; @@ -42,4 +43,11 @@ public static ChatRoomDetailResponse toChatRoomDetailResponse(ChatRoom chatRoom) ); } + public static AcceptChatResponse toAcceptChatResponse(ChatRoom chatRoom){ + return new AcceptChatResponse( + chatRoom.getStatus().getLabel(), + chatRoom.getAnswerer().getCredit() + ); + } + } From fae7738c9f5dcbe7b1eb5fe9ee6cfe75d3d43151 Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 19:44:11 +0900 Subject: [PATCH 06/23] =?UTF-8?q?[feat]=20:=20=EC=B1=84=ED=8C=85=EB=B0=A9?= =?UTF-8?q?=20=EC=83=81=ED=83=9C=20=EB=B3=80=EA=B2=BD=20=ED=95=A8=EC=88=98?= =?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 --- .../java/com/dnd/gongmuin/chat/domain/ChatRoom.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java b/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java index b37f62a..9103025 100644 --- a/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java +++ b/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java @@ -4,10 +4,10 @@ import static jakarta.persistence.EnumType.*; import static jakarta.persistence.FetchType.*; +import com.dnd.gongmuin.chat.exception.ChatErrorCode; import com.dnd.gongmuin.common.entity.TimeBaseEntity; import com.dnd.gongmuin.common.exception.runtime.ValidationException; import com.dnd.gongmuin.member.domain.Member; -import com.dnd.gongmuin.member.exception.MemberErrorCode; import com.dnd.gongmuin.question_post.domain.QuestionPost; import jakarta.persistence.Column; @@ -68,4 +68,12 @@ public static ChatRoom of( ) { return new ChatRoom(questionPost, inquirer, answerer); } + + public void updateStatusAccepted() { + if (status != ChatStatus.PENDING) { + throw new ValidationException(ChatErrorCode.UNABLE_TO_ACCEPT); + } + status = ChatStatus.ACCEPTED; + answerer.increaseCredit(2000); + } } From d28dc7ba098a2b8c4551739a0351c7bad6d09664 Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 20:08:44 +0900 Subject: [PATCH 07/23] =?UTF-8?q?[feat]=20:=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EB=B3=B4=EC=83=81=20=ED=81=AC=EB=A0=88=EB=94=A7=20=EC=83=81?= =?UTF-8?q?=EC=88=98=EB=A1=9C=20=EC=B6=94=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java b/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java index 9103025..ec090d8 100644 --- a/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java +++ b/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java @@ -28,6 +28,8 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) public class ChatRoom extends TimeBaseEntity { + private static final int CHAT_REWARD = 2000; + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "chat_room_id", nullable = false) @@ -58,7 +60,7 @@ private ChatRoom(QuestionPost questionPost, Member inquirer, Member answerer) { this.inquirer = inquirer; this.answerer = answerer; this.status = ChatStatus.PENDING; - inquirer.decreaseCredit(2000); + inquirer.decreaseCredit(CHAT_REWARD); } public static ChatRoom of( @@ -74,6 +76,6 @@ public void updateStatusAccepted() { throw new ValidationException(ChatErrorCode.UNABLE_TO_ACCEPT); } status = ChatStatus.ACCEPTED; - answerer.increaseCredit(2000); + answerer.increaseCredit(CHAT_REWARD); } } From 48d38363ec75ab1293c98c3c5fec689fe85885b9 Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 20:09:19 +0900 Subject: [PATCH 08/23] =?UTF-8?q?[feat]=20:=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EC=88=98=EB=9D=BD=20=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/service/ChatRoomService.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main/java/com/dnd/gongmuin/chat/service/ChatRoomService.java b/src/main/java/com/dnd/gongmuin/chat/service/ChatRoomService.java index 5e6058b..083b0d8 100644 --- a/src/main/java/com/dnd/gongmuin/chat/service/ChatRoomService.java +++ b/src/main/java/com/dnd/gongmuin/chat/service/ChatRoomService.java @@ -5,16 +5,20 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.dnd.gongmuin.chat.domain.ChatRoom; import com.dnd.gongmuin.chat.dto.ChatMessageMapper; import com.dnd.gongmuin.chat.dto.ChatRoomMapper; import com.dnd.gongmuin.chat.dto.request.CreateChatRoomRequest; +import com.dnd.gongmuin.chat.dto.response.AcceptChatResponse; import com.dnd.gongmuin.chat.dto.response.ChatMessageResponse; import com.dnd.gongmuin.chat.dto.response.ChatRoomDetailResponse; +import com.dnd.gongmuin.chat.exception.ChatErrorCode; import com.dnd.gongmuin.chat.repository.ChatMessageRepository; import com.dnd.gongmuin.chat.repository.ChatRoomRepository; import com.dnd.gongmuin.common.dto.PageMapper; import com.dnd.gongmuin.common.dto.PageResponse; import com.dnd.gongmuin.common.exception.runtime.NotFoundException; +import com.dnd.gongmuin.common.exception.runtime.ValidationException; import com.dnd.gongmuin.member.domain.Member; import com.dnd.gongmuin.member.exception.MemberErrorCode; import com.dnd.gongmuin.member.repository.MemberRepository; @@ -50,6 +54,26 @@ public ChatRoomDetailResponse createChatRoom(CreateChatRoomRequest request, Memb ); } + @Transactional + public AcceptChatResponse acceptChat(Long chatRoomId, Member member) { + ChatRoom chatRoom = getChatRoomById(chatRoomId); + validateIfAnswerer(member, chatRoom); + chatRoom.updateStatusAccepted(); + + return ChatRoomMapper.toAcceptChatResponse(chatRoom); + } + + private static void validateIfAnswerer(Member member, ChatRoom chatRoom) { + if (member != chatRoom.getAnswerer()) { + throw new ValidationException(ChatErrorCode.UNAUTHORIZED_REQUEST); + } + } + + private ChatRoom getChatRoomById(Long id){ + return chatRoomRepository.findById(id) + .orElseThrow(() -> new NotFoundException(ChatErrorCode.NOT_FOUND_CHAT_ROOM)); + } + private QuestionPost getQuestionPostById(Long id) { return questionPostRepository.findById(id) .orElseThrow(() -> new NotFoundException(QuestionPostErrorCode.NOT_FOUND_QUESTION_POST)); From 8962821f781e0aceb982fe35b8a02774bd4ce0dc Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 20:09:29 +0900 Subject: [PATCH 09/23] =?UTF-8?q?[test]=20:=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EC=88=98=EB=9D=BD=20=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/service/ChatRoomServiceTest.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/test/java/com/dnd/gongmuin/chat/service/ChatRoomServiceTest.java b/src/test/java/com/dnd/gongmuin/chat/service/ChatRoomServiceTest.java index 127470f..faf8c37 100644 --- a/src/test/java/com/dnd/gongmuin/chat/service/ChatRoomServiceTest.java +++ b/src/test/java/com/dnd/gongmuin/chat/service/ChatRoomServiceTest.java @@ -19,7 +19,9 @@ import com.dnd.gongmuin.chat.domain.ChatMessage; import com.dnd.gongmuin.chat.domain.ChatRoom; +import com.dnd.gongmuin.chat.domain.ChatStatus; import com.dnd.gongmuin.chat.dto.request.CreateChatRoomRequest; +import com.dnd.gongmuin.chat.dto.response.AcceptChatResponse; import com.dnd.gongmuin.chat.dto.response.ChatMessageResponse; import com.dnd.gongmuin.chat.dto.response.ChatRoomDetailResponse; import com.dnd.gongmuin.chat.repository.ChatMessageRepository; @@ -40,6 +42,7 @@ class ChatRoomServiceTest { private final PageRequest pageRequest = PageRequest.of(0, 5); + private static final int CHAT_REWARD = 2000; @Mock private ChatMessageRepository chatMessageRepository; @@ -126,4 +129,30 @@ void createChatRoom_fail() { .isInstanceOf(ValidationException.class) .hasMessageContaining(MemberErrorCode.NOT_ENOUGH_CREDIT.getMessage()); } + + @DisplayName("[답변자가 채팅 요청을 수락할 수 있다.]") + @Test + void acceptChat() { + //given + Long chatRoomId = 1L; + Member inquirer = MemberFixture.member(1L); + Member answerer = MemberFixture.member(2L); + int previousCredit = answerer.getCredit(); + QuestionPost questionPost = QuestionPostFixture.questionPost(inquirer); + ChatRoom chatRoom = ChatRoomFixture.chatRoom(questionPost, inquirer, answerer); + + given(chatRoomRepository.findById(chatRoomId)) + .willReturn(Optional.of(chatRoom)); + + //when + AcceptChatResponse response = chatRoomService.acceptChat(chatRoomId, answerer); + + //then + assertAll( + () -> assertThat(response.chatStatus()) + .isEqualTo(ChatStatus.ACCEPTED.getLabel()), + () -> assertThat(response.credit()) + .isEqualTo(previousCredit+CHAT_REWARD) + ); + } } \ No newline at end of file From 1200c169231bf75edf6136e83453ffff26542023 Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 20:10:22 +0900 Subject: [PATCH 10/23] =?UTF-8?q?[feat]=20:=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EC=88=98=EB=9D=BD=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gongmuin/chat/controller/ChatRoomController.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/com/dnd/gongmuin/chat/controller/ChatRoomController.java b/src/main/java/com/dnd/gongmuin/chat/controller/ChatRoomController.java index a007e75..14be003 100644 --- a/src/main/java/com/dnd/gongmuin/chat/controller/ChatRoomController.java +++ b/src/main/java/com/dnd/gongmuin/chat/controller/ChatRoomController.java @@ -4,12 +4,14 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import com.dnd.gongmuin.chat.dto.request.CreateChatRoomRequest; +import com.dnd.gongmuin.chat.dto.response.AcceptChatResponse; import com.dnd.gongmuin.chat.dto.response.ChatMessageResponse; import com.dnd.gongmuin.chat.dto.response.ChatRoomDetailResponse; import com.dnd.gongmuin.chat.service.ChatRoomService; @@ -48,4 +50,14 @@ public ResponseEntity createChatRoom( ChatRoomDetailResponse response = chatRoomService.createChatRoom(request, member); return ResponseEntity.ok(response); } + + @Operation(summary = "채팅 수락 API", description = "채팅방에서 요청자와의 채팅을 수락한다.") + @PatchMapping("/api/chat-rooms/{chatRoomId}/accept") + public ResponseEntity acceptChat( + @PathVariable("chatRoomId") Long chatRoomId, + @AuthenticationPrincipal Member member + ) { + AcceptChatResponse response = chatRoomService.acceptChat(chatRoomId, member); + return ResponseEntity.ok(response); + } } From 19f6cad02ffb2aea43c3b0923e34add912ff6c6e Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 21:18:18 +0900 Subject: [PATCH 11/23] =?UTF-8?q?[feat]=20:=20=EB=8B=B5=EB=B3=80=EC=9E=90?= =?UTF-8?q?=EC=99=80=20=EB=A9=A4=EB=B2=84=20=EB=B9=84=EA=B5=90=20=EC=8B=9C?= =?UTF-8?q?=20=EC=95=84=EC=9D=B4=EB=94=94=EB=A1=9C=20=EB=8F=99=EC=9D=BC?= =?UTF-8?q?=EC=84=B1=20=EB=B9=84=EA=B5=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dnd/gongmuin/chat/service/ChatRoomService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/dnd/gongmuin/chat/service/ChatRoomService.java b/src/main/java/com/dnd/gongmuin/chat/service/ChatRoomService.java index 083b0d8..ee53003 100644 --- a/src/main/java/com/dnd/gongmuin/chat/service/ChatRoomService.java +++ b/src/main/java/com/dnd/gongmuin/chat/service/ChatRoomService.java @@ -1,5 +1,7 @@ package com.dnd.gongmuin.chat.service; +import java.util.Objects; + import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.stereotype.Service; @@ -64,7 +66,7 @@ public AcceptChatResponse acceptChat(Long chatRoomId, Member member) { } private static void validateIfAnswerer(Member member, ChatRoom chatRoom) { - if (member != chatRoom.getAnswerer()) { + if (!Objects.equals(member.getId(), chatRoom.getAnswerer().getId())){ throw new ValidationException(ChatErrorCode.UNAUTHORIZED_REQUEST); } } From 4495385716dbe5e7dcc87f4b57e931cb7bf83ca5 Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 21:19:38 +0900 Subject: [PATCH 12/23] =?UTF-8?q?[test]=20:=20=EC=B1=84=ED=8C=85=EB=B0=A9?= =?UTF-8?q?=20=EC=88=98=EB=9D=BD=20=EB=A1=9C=EC=A7=81=20=ED=86=B5=ED=95=A9?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ChatRoomControllerTest.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/test/java/com/dnd/gongmuin/chat/controller/ChatRoomControllerTest.java b/src/test/java/com/dnd/gongmuin/chat/controller/ChatRoomControllerTest.java index d818a60..79a61a3 100644 --- a/src/test/java/com/dnd/gongmuin/chat/controller/ChatRoomControllerTest.java +++ b/src/test/java/com/dnd/gongmuin/chat/controller/ChatRoomControllerTest.java @@ -11,9 +11,13 @@ import org.springframework.beans.factory.annotation.Autowired; import com.dnd.gongmuin.chat.domain.ChatMessage; +import com.dnd.gongmuin.chat.domain.ChatRoom; +import com.dnd.gongmuin.chat.domain.ChatStatus; import com.dnd.gongmuin.chat.dto.request.CreateChatRoomRequest; import com.dnd.gongmuin.chat.repository.ChatMessageRepository; +import com.dnd.gongmuin.chat.repository.ChatRoomRepository; import com.dnd.gongmuin.common.fixture.ChatMessageFixture; +import com.dnd.gongmuin.common.fixture.ChatRoomFixture; import com.dnd.gongmuin.common.fixture.MemberFixture; import com.dnd.gongmuin.common.fixture.QuestionPostFixture; import com.dnd.gongmuin.common.support.ApiTestSupport; @@ -25,6 +29,8 @@ @DisplayName("[ChatMessage 통합 테스트]") class ChatRoomControllerTest extends ApiTestSupport { + private static final int CHAT_REWARD = 2000; + @Autowired private ChatMessageRepository chatMessageRepository; @@ -34,6 +40,9 @@ class ChatRoomControllerTest extends ApiTestSupport { @Autowired private QuestionPostRepository questionPostRepository; + @Autowired + private ChatRoomRepository chatRoomRepository; + @DisplayName("[채팅방 아이디로 메시지를 조회할 수 있다.]") @Test void getChatMessages() throws Exception { @@ -64,4 +73,18 @@ void createChatRoom() throws Exception { .andExpect(status().isOk()); } + @DisplayName("[답변자가 채팅 요청을 수락할 수 있다.]") + @Test + void acceptChatRoom() throws Exception { + Member inquirer = memberRepository.save(MemberFixture.member4()); + QuestionPost questionPost = questionPostRepository.save(QuestionPostFixture.questionPost(inquirer)); + ChatRoom chatRoom = chatRoomRepository.save(ChatRoomFixture.chatRoom(questionPost, inquirer, loginMember)); + int previousAnswererCredit = chatRoom.getAnswerer().getCredit(); + + mockMvc.perform(patch("/api/chat-rooms/{chatRoomId}/accept", 1L) + .cookie(accessToken)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.chatStatus").value(ChatStatus.ACCEPTED.getLabel())) + .andExpect(jsonPath("$.credit").value(previousAnswererCredit + CHAT_REWARD)); + } } \ No newline at end of file From 19d3a75c24c6c14a3ded4f07e9221ba51fc14b94 Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 21:55:10 +0900 Subject: [PATCH 13/23] =?UTF-8?q?[test]=20:=20=EA=B0=81=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=81=9D=EB=82=A0=20=EB=95=8C=EB=A7=88?= =?UTF-8?q?=EB=8B=A4=20DB=20=EC=B4=88=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gongmuin/chat/controller/ChatRoomControllerTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/test/java/com/dnd/gongmuin/chat/controller/ChatRoomControllerTest.java b/src/test/java/com/dnd/gongmuin/chat/controller/ChatRoomControllerTest.java index 79a61a3..3036fc2 100644 --- a/src/test/java/com/dnd/gongmuin/chat/controller/ChatRoomControllerTest.java +++ b/src/test/java/com/dnd/gongmuin/chat/controller/ChatRoomControllerTest.java @@ -6,6 +6,7 @@ import java.util.List; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -43,6 +44,13 @@ class ChatRoomControllerTest extends ApiTestSupport { @Autowired private ChatRoomRepository chatRoomRepository; + @AfterEach + void teardown() { + memberRepository.deleteAll(); + questionPostRepository.deleteAll(); + chatRoomRepository.deleteAll(); + } + @DisplayName("[채팅방 아이디로 메시지를 조회할 수 있다.]") @Test void getChatMessages() throws Exception { From 9fd756fd749ff2fc5720ab2c597640e3d311bb2c Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 21:57:25 +0900 Subject: [PATCH 14/23] =?UTF-8?q?[test]=20:=20=EC=8B=A4=EC=A0=9C=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=EB=90=98=EB=8A=94=20=EC=B1=84=ED=8C=85?= =?UTF-8?q?=EB=B0=A9=20=EC=95=84=EC=9D=B4=EB=94=94=20=ED=95=A0=EB=8B=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dnd/gongmuin/chat/controller/ChatRoomControllerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/dnd/gongmuin/chat/controller/ChatRoomControllerTest.java b/src/test/java/com/dnd/gongmuin/chat/controller/ChatRoomControllerTest.java index 3036fc2..03da530 100644 --- a/src/test/java/com/dnd/gongmuin/chat/controller/ChatRoomControllerTest.java +++ b/src/test/java/com/dnd/gongmuin/chat/controller/ChatRoomControllerTest.java @@ -89,7 +89,7 @@ void acceptChatRoom() throws Exception { ChatRoom chatRoom = chatRoomRepository.save(ChatRoomFixture.chatRoom(questionPost, inquirer, loginMember)); int previousAnswererCredit = chatRoom.getAnswerer().getCredit(); - mockMvc.perform(patch("/api/chat-rooms/{chatRoomId}/accept", 1L) + mockMvc.perform(patch("/api/chat-rooms/{chatRoomId}/accept", chatRoom.getId()) .cookie(accessToken)) .andExpect(status().isOk()) .andExpect(jsonPath("$.chatStatus").value(ChatStatus.ACCEPTED.getLabel())) From d7fccf17e567f2fe2600e1681844c72093165e8a Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 22:09:47 +0900 Subject: [PATCH 15/23] =?UTF-8?q?[feat]=20:=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EC=83=81=ED=83=9C=20ENUM=20=ED=95=84=EB=93=9C=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/dnd/gongmuin/chat/domain/ChatStatus.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/dnd/gongmuin/chat/domain/ChatStatus.java b/src/main/java/com/dnd/gongmuin/chat/domain/ChatStatus.java index dd1b3fc..562a14d 100644 --- a/src/main/java/com/dnd/gongmuin/chat/domain/ChatStatus.java +++ b/src/main/java/com/dnd/gongmuin/chat/domain/ChatStatus.java @@ -9,7 +9,7 @@ public enum ChatStatus { PENDING("요청중"), ACCEPTED("수락됨"), - DENIED("거절됨"); + REJECTED("거절됨"); private final String label; } From ea70e92e5764f171059bf205349b93060e586cd3 Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 22:10:57 +0900 Subject: [PATCH 16/23] =?UTF-8?q?[style]=20:=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20ENUM=20=ED=95=84=EB=93=9C=EB=AA=85=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java | 2 +- .../java/com/dnd/gongmuin/chat/exception/ChatErrorCode.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java b/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java index ec090d8..c663a70 100644 --- a/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java +++ b/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java @@ -73,7 +73,7 @@ public static ChatRoom of( public void updateStatusAccepted() { if (status != ChatStatus.PENDING) { - throw new ValidationException(ChatErrorCode.UNABLE_TO_ACCEPT); + throw new ValidationException(ChatErrorCode.UNABLE_TO_CHANGE_CHAT_STATUS); } status = ChatStatus.ACCEPTED; answerer.increaseCredit(CHAT_REWARD); diff --git a/src/main/java/com/dnd/gongmuin/chat/exception/ChatErrorCode.java b/src/main/java/com/dnd/gongmuin/chat/exception/ChatErrorCode.java index fe31020..f266e08 100644 --- a/src/main/java/com/dnd/gongmuin/chat/exception/ChatErrorCode.java +++ b/src/main/java/com/dnd/gongmuin/chat/exception/ChatErrorCode.java @@ -12,7 +12,7 @@ public enum ChatErrorCode implements ErrorCode { INVALID_MESSAGE_TYPE("메시지 타입을 올바르게 입력해주세요.", "CH_001"), NOT_FOUND_CHAT_ROOM("해당 아이디의 채팅방이 존재하지 않습니다.", "CH_002"), UNAUTHORIZED_REQUEST("채팅 수락을 하거나 거절할 권한이 없습니다.", "CH_003"), - UNABLE_TO_ACCEPT("이미 수락했거나 거절한 요청입니다.", "CH_004"); + UNABLE_TO_CHANGE_CHAT_STATUS("이미 수락했거나 거절한 요청입니다.", "CH_004"); private final String message; private final String code; From 815757d29da8eaf13124c9f726236a442662ce4e Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 22:11:52 +0900 Subject: [PATCH 17/23] =?UTF-8?q?[feat]=20:=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EA=B1=B0=EC=A0=88=20=EC=8B=9C=20=EC=83=81=ED=83=9C=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java b/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java index c663a70..6ee3898 100644 --- a/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java +++ b/src/main/java/com/dnd/gongmuin/chat/domain/ChatRoom.java @@ -78,4 +78,12 @@ public void updateStatusAccepted() { status = ChatStatus.ACCEPTED; answerer.increaseCredit(CHAT_REWARD); } + + public void updateStatusRejected() { + if (status != ChatStatus.PENDING) { + throw new ValidationException(ChatErrorCode.UNABLE_TO_CHANGE_CHAT_STATUS); + } + status = ChatStatus.REJECTED; + inquirer.increaseCredit(CHAT_REWARD); + } } From 45e97e834aebf31d4aff482a025f3e611ce3ed99 Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 22:12:27 +0900 Subject: [PATCH 18/23] =?UTF-8?q?[feat]=20:=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EA=B1=B0=EC=A0=88=20=EC=9D=91=EB=8B=B5=20dto=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/dnd/gongmuin/chat/dto/ChatRoomMapper.java | 7 +++++++ .../dnd/gongmuin/chat/dto/response/RejectChatResponse.java | 6 ++++++ 2 files changed, 13 insertions(+) create mode 100644 src/main/java/com/dnd/gongmuin/chat/dto/response/RejectChatResponse.java diff --git a/src/main/java/com/dnd/gongmuin/chat/dto/ChatRoomMapper.java b/src/main/java/com/dnd/gongmuin/chat/dto/ChatRoomMapper.java index 90e3f70..81217f1 100644 --- a/src/main/java/com/dnd/gongmuin/chat/dto/ChatRoomMapper.java +++ b/src/main/java/com/dnd/gongmuin/chat/dto/ChatRoomMapper.java @@ -3,6 +3,7 @@ import com.dnd.gongmuin.chat.domain.ChatRoom; import com.dnd.gongmuin.chat.dto.response.AcceptChatResponse; import com.dnd.gongmuin.chat.dto.response.ChatRoomDetailResponse; +import com.dnd.gongmuin.chat.dto.response.RejectChatResponse; import com.dnd.gongmuin.member.domain.Member; import com.dnd.gongmuin.question_post.domain.QuestionPost; import com.dnd.gongmuin.question_post.dto.response.MemberInfo; @@ -50,4 +51,10 @@ public static AcceptChatResponse toAcceptChatResponse(ChatRoom chatRoom){ ); } + public static RejectChatResponse toRejectChatResponse(ChatRoom chatRoom){ + return new RejectChatResponse( + chatRoom.getStatus().getLabel() + ); + } + } diff --git a/src/main/java/com/dnd/gongmuin/chat/dto/response/RejectChatResponse.java b/src/main/java/com/dnd/gongmuin/chat/dto/response/RejectChatResponse.java new file mode 100644 index 0000000..ae22300 --- /dev/null +++ b/src/main/java/com/dnd/gongmuin/chat/dto/response/RejectChatResponse.java @@ -0,0 +1,6 @@ +package com.dnd.gongmuin.chat.dto.response; + +public record RejectChatResponse( + String chatStatus +) { +} From 7f2df726008eb778df05e704f704f0151f353e97 Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 22:12:46 +0900 Subject: [PATCH 19/23] =?UTF-8?q?[feat]=20:=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EA=B1=B0=EC=A0=88=20=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dnd/gongmuin/chat/service/ChatRoomService.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/dnd/gongmuin/chat/service/ChatRoomService.java b/src/main/java/com/dnd/gongmuin/chat/service/ChatRoomService.java index ee53003..04b0eb0 100644 --- a/src/main/java/com/dnd/gongmuin/chat/service/ChatRoomService.java +++ b/src/main/java/com/dnd/gongmuin/chat/service/ChatRoomService.java @@ -14,6 +14,7 @@ import com.dnd.gongmuin.chat.dto.response.AcceptChatResponse; import com.dnd.gongmuin.chat.dto.response.ChatMessageResponse; import com.dnd.gongmuin.chat.dto.response.ChatRoomDetailResponse; +import com.dnd.gongmuin.chat.dto.response.RejectChatResponse; import com.dnd.gongmuin.chat.exception.ChatErrorCode; import com.dnd.gongmuin.chat.repository.ChatMessageRepository; import com.dnd.gongmuin.chat.repository.ChatRoomRepository; @@ -65,6 +66,15 @@ public AcceptChatResponse acceptChat(Long chatRoomId, Member member) { return ChatRoomMapper.toAcceptChatResponse(chatRoom); } + @Transactional + public RejectChatResponse rejectChat(Long chatRoomId, Member member) { + ChatRoom chatRoom = getChatRoomById(chatRoomId); + validateIfAnswerer(member, chatRoom); + chatRoom.updateStatusRejected(); + + return ChatRoomMapper.toRejectChatResponse(chatRoom); + } + private static void validateIfAnswerer(Member member, ChatRoom chatRoom) { if (!Objects.equals(member.getId(), chatRoom.getAnswerer().getId())){ throw new ValidationException(ChatErrorCode.UNAUTHORIZED_REQUEST); From f66c595cb76c88611b0a1305481169c0f4e8b7f6 Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 22:12:58 +0900 Subject: [PATCH 20/23] =?UTF-8?q?[feat]=20:=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EA=B1=B0=EC=A0=88=20controller=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?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 --- .../gongmuin/chat/controller/ChatRoomController.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/com/dnd/gongmuin/chat/controller/ChatRoomController.java b/src/main/java/com/dnd/gongmuin/chat/controller/ChatRoomController.java index 14be003..20a65cb 100644 --- a/src/main/java/com/dnd/gongmuin/chat/controller/ChatRoomController.java +++ b/src/main/java/com/dnd/gongmuin/chat/controller/ChatRoomController.java @@ -14,6 +14,7 @@ import com.dnd.gongmuin.chat.dto.response.AcceptChatResponse; import com.dnd.gongmuin.chat.dto.response.ChatMessageResponse; import com.dnd.gongmuin.chat.dto.response.ChatRoomDetailResponse; +import com.dnd.gongmuin.chat.dto.response.RejectChatResponse; import com.dnd.gongmuin.chat.service.ChatRoomService; import com.dnd.gongmuin.common.dto.PageResponse; import com.dnd.gongmuin.member.domain.Member; @@ -60,4 +61,14 @@ public ResponseEntity acceptChat( AcceptChatResponse response = chatRoomService.acceptChat(chatRoomId, member); return ResponseEntity.ok(response); } + + @Operation(summary = "채팅 거절 API", description = "채팅방에서 요청자와의 채팅을 거절한다.") + @PatchMapping("/api/chat-rooms/{chatRoomId}/reject") + public ResponseEntity rejectChat( + @PathVariable("chatRoomId") Long chatRoomId, + @AuthenticationPrincipal Member member + ) { + RejectChatResponse response = chatRoomService.rejectChat(chatRoomId, member); + return ResponseEntity.ok(response); + } } From 46bf9d0160c8ec2b03bf468663e4a40e5c8b9d7c Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 22:19:09 +0900 Subject: [PATCH 21/23] =?UTF-8?q?[test]=20:=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EA=B1=B0=EC=A0=88=20=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/service/ChatRoomServiceTest.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/test/java/com/dnd/gongmuin/chat/service/ChatRoomServiceTest.java b/src/test/java/com/dnd/gongmuin/chat/service/ChatRoomServiceTest.java index faf8c37..d583816 100644 --- a/src/test/java/com/dnd/gongmuin/chat/service/ChatRoomServiceTest.java +++ b/src/test/java/com/dnd/gongmuin/chat/service/ChatRoomServiceTest.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Optional; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -24,6 +25,7 @@ import com.dnd.gongmuin.chat.dto.response.AcceptChatResponse; import com.dnd.gongmuin.chat.dto.response.ChatMessageResponse; import com.dnd.gongmuin.chat.dto.response.ChatRoomDetailResponse; +import com.dnd.gongmuin.chat.dto.response.RejectChatResponse; import com.dnd.gongmuin.chat.repository.ChatMessageRepository; import com.dnd.gongmuin.chat.repository.ChatRoomRepository; import com.dnd.gongmuin.common.exception.runtime.ValidationException; @@ -155,4 +157,25 @@ void acceptChat() { .isEqualTo(previousCredit+CHAT_REWARD) ); } + + @DisplayName("[답변자가 채팅 요청을 거절할 수 있다.]") + @Test + void rejectChat() { + //given + Long chatRoomId = 1L; + Member inquirer = MemberFixture.member(1L); + Member answerer = MemberFixture.member(2L); + QuestionPost questionPost = QuestionPostFixture.questionPost(inquirer); + ChatRoom chatRoom = ChatRoomFixture.chatRoom(questionPost, inquirer, answerer); + + given(chatRoomRepository.findById(chatRoomId)) + .willReturn(Optional.of(chatRoom)); + + //when + RejectChatResponse response = chatRoomService.rejectChat(chatRoomId, answerer); + + //then + assertThat(response.chatStatus()) + .isEqualTo(ChatStatus.REJECTED.getLabel()); + } } \ No newline at end of file From 2ef0f9fcf888f2a238c08ac4602193b760501113 Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 22:19:21 +0900 Subject: [PATCH 22/23] =?UTF-8?q?[test]=20:=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EA=B1=B0=EC=A0=88=20=EB=A1=9C=EC=A7=81=20=ED=86=B5=ED=95=A9=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/controller/ChatRoomControllerTest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/test/java/com/dnd/gongmuin/chat/controller/ChatRoomControllerTest.java b/src/test/java/com/dnd/gongmuin/chat/controller/ChatRoomControllerTest.java index 03da530..9626c9c 100644 --- a/src/test/java/com/dnd/gongmuin/chat/controller/ChatRoomControllerTest.java +++ b/src/test/java/com/dnd/gongmuin/chat/controller/ChatRoomControllerTest.java @@ -95,4 +95,17 @@ void acceptChatRoom() throws Exception { .andExpect(jsonPath("$.chatStatus").value(ChatStatus.ACCEPTED.getLabel())) .andExpect(jsonPath("$.credit").value(previousAnswererCredit + CHAT_REWARD)); } + + @DisplayName("[답변자가 채팅 요청을 거절할 수 있다.]") + @Test + void rejectChatRoom() throws Exception { + Member inquirer = memberRepository.save(MemberFixture.member4()); + QuestionPost questionPost = questionPostRepository.save(QuestionPostFixture.questionPost(inquirer)); + ChatRoom chatRoom = chatRoomRepository.save(ChatRoomFixture.chatRoom(questionPost, inquirer, loginMember)); + + mockMvc.perform(patch("/api/chat-rooms/{chatRoomId}/reject", chatRoom.getId()) + .cookie(accessToken)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.chatStatus").value(ChatStatus.REJECTED.getLabel())); + } } \ No newline at end of file From ab69788a45585a4713a292be540f5c0820a18f25 Mon Sep 17 00:00:00 2001 From: hs12 Date: Mon, 16 Sep 2024 22:20:06 +0900 Subject: [PATCH 23/23] =?UTF-8?q?[style]=20:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=A6=AC=ED=8F=AC=EB=A9=A7=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dnd/gongmuin/chat/dto/ChatRoomMapper.java | 4 ++-- .../dnd/gongmuin/chat/service/ChatRoomService.java | 14 +++++++------- .../gongmuin/chat/service/ChatRoomServiceTest.java | 8 +++----- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/dnd/gongmuin/chat/dto/ChatRoomMapper.java b/src/main/java/com/dnd/gongmuin/chat/dto/ChatRoomMapper.java index 81217f1..620083d 100644 --- a/src/main/java/com/dnd/gongmuin/chat/dto/ChatRoomMapper.java +++ b/src/main/java/com/dnd/gongmuin/chat/dto/ChatRoomMapper.java @@ -44,14 +44,14 @@ public static ChatRoomDetailResponse toChatRoomDetailResponse(ChatRoom chatRoom) ); } - public static AcceptChatResponse toAcceptChatResponse(ChatRoom chatRoom){ + public static AcceptChatResponse toAcceptChatResponse(ChatRoom chatRoom) { return new AcceptChatResponse( chatRoom.getStatus().getLabel(), chatRoom.getAnswerer().getCredit() ); } - public static RejectChatResponse toRejectChatResponse(ChatRoom chatRoom){ + public static RejectChatResponse toRejectChatResponse(ChatRoom chatRoom) { return new RejectChatResponse( chatRoom.getStatus().getLabel() ); diff --git a/src/main/java/com/dnd/gongmuin/chat/service/ChatRoomService.java b/src/main/java/com/dnd/gongmuin/chat/service/ChatRoomService.java index 04b0eb0..24343e5 100644 --- a/src/main/java/com/dnd/gongmuin/chat/service/ChatRoomService.java +++ b/src/main/java/com/dnd/gongmuin/chat/service/ChatRoomService.java @@ -40,6 +40,12 @@ public class ChatRoomService { private final MemberRepository memberRepository; private final QuestionPostRepository questionPostRepository; + private static void validateIfAnswerer(Member member, ChatRoom chatRoom) { + if (!Objects.equals(member.getId(), chatRoom.getAnswerer().getId())) { + throw new ValidationException(ChatErrorCode.UNAUTHORIZED_REQUEST); + } + } + @Transactional(readOnly = true) public PageResponse getChatMessages(Long chatRoomId, Pageable pageable) { Slice responsePage = chatMessageRepository @@ -75,13 +81,7 @@ public RejectChatResponse rejectChat(Long chatRoomId, Member member) { return ChatRoomMapper.toRejectChatResponse(chatRoom); } - private static void validateIfAnswerer(Member member, ChatRoom chatRoom) { - if (!Objects.equals(member.getId(), chatRoom.getAnswerer().getId())){ - throw new ValidationException(ChatErrorCode.UNAUTHORIZED_REQUEST); - } - } - - private ChatRoom getChatRoomById(Long id){ + private ChatRoom getChatRoomById(Long id) { return chatRoomRepository.findById(id) .orElseThrow(() -> new NotFoundException(ChatErrorCode.NOT_FOUND_CHAT_ROOM)); } diff --git a/src/test/java/com/dnd/gongmuin/chat/service/ChatRoomServiceTest.java b/src/test/java/com/dnd/gongmuin/chat/service/ChatRoomServiceTest.java index d583816..55ecee1 100644 --- a/src/test/java/com/dnd/gongmuin/chat/service/ChatRoomServiceTest.java +++ b/src/test/java/com/dnd/gongmuin/chat/service/ChatRoomServiceTest.java @@ -7,7 +7,6 @@ import java.util.List; import java.util.Optional; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -43,9 +42,8 @@ @ExtendWith(MockitoExtension.class) class ChatRoomServiceTest { - private final PageRequest pageRequest = PageRequest.of(0, 5); private static final int CHAT_REWARD = 2000; - + private final PageRequest pageRequest = PageRequest.of(0, 5); @Mock private ChatMessageRepository chatMessageRepository; @@ -135,7 +133,7 @@ void createChatRoom_fail() { @DisplayName("[답변자가 채팅 요청을 수락할 수 있다.]") @Test void acceptChat() { - //given + //given Long chatRoomId = 1L; Member inquirer = MemberFixture.member(1L); Member answerer = MemberFixture.member(2L); @@ -154,7 +152,7 @@ void acceptChat() { () -> assertThat(response.chatStatus()) .isEqualTo(ChatStatus.ACCEPTED.getLabel()), () -> assertThat(response.credit()) - .isEqualTo(previousCredit+CHAT_REWARD) + .isEqualTo(previousCredit + CHAT_REWARD) ); }