From bb6fc50d71326f5296499044288f9f5fb60c9a11 Mon Sep 17 00:00:00 2001 From: luke Date: Wed, 29 May 2024 17:29:30 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=EC=B1=84=ED=8C=85=EB=B0=A9=20?= =?UTF-8?q?=EB=82=98=EA=B0=80=EA=B8=B0=20api(#102)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../be/chatting/controller/ChatController.java | 18 ++++++++++++++++-- .../yeonba/be/chatting/entity/ChatRoom.java | 9 +++++++++ .../chatmessage/ChatMessageCommand.java | 6 ++++++ .../chatmessage/ChatMessageRepository.java | 2 ++ .../repository/chatroom/ChatRoomCommand.java | 5 +++++ .../be/chatting/service/ChatService.java | 16 +++++++++++++--- 6 files changed, 51 insertions(+), 5 deletions(-) diff --git a/be/src/main/java/yeonba/be/chatting/controller/ChatController.java b/be/src/main/java/yeonba/be/chatting/controller/ChatController.java index 4d4ffeec..ee73b564 100644 --- a/be/src/main/java/yeonba/be/chatting/controller/ChatController.java +++ b/be/src/main/java/yeonba/be/chatting/controller/ChatController.java @@ -15,6 +15,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -37,8 +38,6 @@ public class ChatController { @MessageMapping("/chat") public void chat(ChatPublishRequest request) { - log.info("chatting test log {}", request.getContent()); - chatService.publish(request); } @@ -103,4 +102,19 @@ public ResponseEntity> acceptRequestedChat( .ok() .body(new CustomResponse<>()); } + + @Operation(summary = "채팅방 나가기", description = "채팅방을 나갈 수 있습니다.") + @ApiResponse(responseCode = "200", description = "채팅방 나가기 정상 처리") + @DeleteMapping("/chat-rooms/{roomId}") + public ResponseEntity> leaveChatRoom( + @RequestAttribute("userId") long userId, + @Parameter(description = "채팅방 ID", example = "1") + @PathVariable long roomId) { + + chatService.leaveChatRoom(userId, roomId); + + return ResponseEntity + .ok() + .body(new CustomResponse<>()); + } } diff --git a/be/src/main/java/yeonba/be/chatting/entity/ChatRoom.java b/be/src/main/java/yeonba/be/chatting/entity/ChatRoom.java index 0d5754e1..9acdbd34 100644 --- a/be/src/main/java/yeonba/be/chatting/entity/ChatRoom.java +++ b/be/src/main/java/yeonba/be/chatting/entity/ChatRoom.java @@ -18,6 +18,8 @@ import lombok.NoArgsConstructor; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; +import yeonba.be.exception.ChatException; +import yeonba.be.exception.GeneralException; import yeonba.be.user.entity.User; @Table(name = "chat_rooms") @@ -61,4 +63,11 @@ public void activeRoom() { this.active = true; } + + public void validateRoom(User user) { + + if (!this.sender.equals(user) && !this.receiver.equals(user)) { + throw new GeneralException(ChatException.NOT_YOUR_CHAT_ROOM); + } + } } diff --git a/be/src/main/java/yeonba/be/chatting/repository/chatmessage/ChatMessageCommand.java b/be/src/main/java/yeonba/be/chatting/repository/chatmessage/ChatMessageCommand.java index f9137e37..0a878df0 100644 --- a/be/src/main/java/yeonba/be/chatting/repository/chatmessage/ChatMessageCommand.java +++ b/be/src/main/java/yeonba/be/chatting/repository/chatmessage/ChatMessageCommand.java @@ -3,6 +3,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import yeonba.be.chatting.entity.ChatMessage; +import yeonba.be.chatting.entity.ChatRoom; @Component @RequiredArgsConstructor @@ -14,4 +15,9 @@ public ChatMessage save(ChatMessage message) { return chatMessageRepository.save(message); } + + public void deleteAllByChatRoom(ChatRoom chatRoom) { + + chatMessageRepository.deleteAllByChatRoom(chatRoom); + } } diff --git a/be/src/main/java/yeonba/be/chatting/repository/chatmessage/ChatMessageRepository.java b/be/src/main/java/yeonba/be/chatting/repository/chatmessage/ChatMessageRepository.java index 4bcc60a3..f53e41d8 100644 --- a/be/src/main/java/yeonba/be/chatting/repository/chatmessage/ChatMessageRepository.java +++ b/be/src/main/java/yeonba/be/chatting/repository/chatmessage/ChatMessageRepository.java @@ -14,4 +14,6 @@ public interface ChatMessageRepository extends JpaRepository int countByChatRoomIdAndReadIsFalse(long chatRoomId); List findAllByChatRoomOrderBySentAtDesc(ChatRoom chatRoom); + + void deleteAllByChatRoom(ChatRoom chatRoom); } diff --git a/be/src/main/java/yeonba/be/chatting/repository/chatroom/ChatRoomCommand.java b/be/src/main/java/yeonba/be/chatting/repository/chatroom/ChatRoomCommand.java index 9089594a..d53fc068 100644 --- a/be/src/main/java/yeonba/be/chatting/repository/chatroom/ChatRoomCommand.java +++ b/be/src/main/java/yeonba/be/chatting/repository/chatroom/ChatRoomCommand.java @@ -14,4 +14,9 @@ public ChatRoom createChatRoom(ChatRoom chatRoom) { return chatRoomRepository.save(chatRoom); } + + public void delete(ChatRoom chatRoom) { + + chatRoomRepository.delete(chatRoom); + } } diff --git a/be/src/main/java/yeonba/be/chatting/service/ChatService.java b/be/src/main/java/yeonba/be/chatting/service/ChatService.java index 028798f8..34eff734 100644 --- a/be/src/main/java/yeonba/be/chatting/service/ChatService.java +++ b/be/src/main/java/yeonba/be/chatting/service/ChatService.java @@ -72,9 +72,7 @@ public List getChatMessages(long userId, long roomId) { ChatRoom chatRoom = chatRoomQuery.findById(roomId); - if (!user.equals(chatRoom.getSender()) && !user.equals(chatRoom.getReceiver())) { - throw new GeneralException(ChatException.NOT_YOUR_CHAT_ROOM); - } + chatRoom.validateRoom(user); List chatMessages = chatMessageQuery.findAllByChatRoom(chatRoom); @@ -181,4 +179,16 @@ public void acceptRequestedChat(long userId, long notificationId) { eventPublisher.publishEvent(notificationSendEvent); } + + @Transactional + public void leaveChatRoom(long userId, long roomId) { + + User user = userQuery.findById(userId); + ChatRoom chatRoom = chatRoomQuery.findById(roomId); + + chatRoom.validateRoom(user); + + chatRoomCommand.delete(chatRoom); + chatMessageCommand.deleteAllByChatRoom(chatRoom); + } } From c3810f481cb7550835ab5fe0b93ed1cf465e244a Mon Sep 17 00:00:00 2001 From: luke Date: Wed, 29 May 2024 17:40:02 +0900 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20=EC=B1=84=ED=8C=85=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EC=9D=BD=EC=9D=8C=20=EC=B2=98=EB=A6=AC(#1?= =?UTF-8?q?02)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/yeonba/be/chatting/entity/ChatMessage.java | 4 ++++ .../java/yeonba/be/chatting/service/ChatService.java | 11 ++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/be/src/main/java/yeonba/be/chatting/entity/ChatMessage.java b/be/src/main/java/yeonba/be/chatting/entity/ChatMessage.java index 3f4a2e7a..6fdb9a75 100644 --- a/be/src/main/java/yeonba/be/chatting/entity/ChatMessage.java +++ b/be/src/main/java/yeonba/be/chatting/entity/ChatMessage.java @@ -62,4 +62,8 @@ public ChatMessage(ChatRoom chatRoom, User sender, User receiver, String content this.sentAt = sentAt; this.read = false; } + + public void readMessage() { + this.read = true; + } } diff --git a/be/src/main/java/yeonba/be/chatting/service/ChatService.java b/be/src/main/java/yeonba/be/chatting/service/ChatService.java index 34eff734..46ff5ecb 100644 --- a/be/src/main/java/yeonba/be/chatting/service/ChatService.java +++ b/be/src/main/java/yeonba/be/chatting/service/ChatService.java @@ -77,9 +77,14 @@ public List getChatMessages(long userId, long roomId) { List chatMessages = chatMessageQuery.findAllByChatRoom(chatRoom); return chatMessages.stream() - .map(chatMessage -> new ChatMessageResponse(chatMessage.getSender().getId(), - chatMessage.getSender().getNickname(), - chatMessage.getContent(), chatMessage.getSentAt())) + .map(chatMessage -> { + if (!chatMessage.isRead()) { + chatMessage.readMessage(); + } + return new ChatMessageResponse(chatMessage.getSender().getId(), + chatMessage.getSender().getNickname(), chatMessage.getContent(), + chatMessage.getSentAt()); + }) .toList(); } From c15174a8ba0accbaecc4bd897fd4f6289a983d1b Mon Sep 17 00:00:00 2001 From: luke Date: Wed, 29 May 2024 17:46:26 +0900 Subject: [PATCH 3/5] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=9D=98=EC=A1=B4=EC=84=B1=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0(102)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/yeonba/be/chatting/controller/ChatController.java | 5 ----- be/src/main/java/yeonba/be/chatting/service/ChatService.java | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/be/src/main/java/yeonba/be/chatting/controller/ChatController.java b/be/src/main/java/yeonba/be/chatting/controller/ChatController.java index ee73b564..d60d2ea7 100644 --- a/be/src/main/java/yeonba/be/chatting/controller/ChatController.java +++ b/be/src/main/java/yeonba/be/chatting/controller/ChatController.java @@ -5,13 +5,8 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.tags.Tag; import java.util.List; -import java.util.Set; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.listener.ChannelTopic; -import org.springframework.data.redis.listener.RedisMessageListenerContainer; -import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; import org.springframework.http.ResponseEntity; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.stereotype.Controller; diff --git a/be/src/main/java/yeonba/be/chatting/service/ChatService.java b/be/src/main/java/yeonba/be/chatting/service/ChatService.java index 46ff5ecb..9003926c 100644 --- a/be/src/main/java/yeonba/be/chatting/service/ChatService.java +++ b/be/src/main/java/yeonba/be/chatting/service/ChatService.java @@ -78,7 +78,7 @@ public List getChatMessages(long userId, long roomId) { return chatMessages.stream() .map(chatMessage -> { - if (!chatMessage.isRead()) { + if (!chatMessage.isRead() && chatMessage.getReceiver().equals(user)) { chatMessage.readMessage(); } return new ChatMessageResponse(chatMessage.getSender().getId(), From f7066c9dbc837ec6c59583006461219006cbe5ad Mon Sep 17 00:00:00 2001 From: luke Date: Wed, 29 May 2024 17:49:04 +0900 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20api=20=EB=AA=85=EC=84=B8=EC=84=9C?= =?UTF-8?q?=20=EC=88=98=EC=A0=95(#102)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/yeonba/be/user/dto/request/UserQueryRequest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/be/src/main/java/yeonba/be/user/dto/request/UserQueryRequest.java b/be/src/main/java/yeonba/be/user/dto/request/UserQueryRequest.java index 0be6bd3d..1aa306b1 100644 --- a/be/src/main/java/yeonba/be/user/dto/request/UserQueryRequest.java +++ b/be/src/main/java/yeonba/be/user/dto/request/UserQueryRequest.java @@ -18,7 +18,7 @@ public class UserQueryRequest { 조회 기준 - 즐겨찾는 이성 : FAVORITES - 나에게 관심 있는 이성(나에게 화살을 보낸 이성) : ARROW_SENDERS - - 나에게 화살을 보낸 이성 : ARROW_RECEIVERS""", + - 내가 화살을 보낸 이성 : ARROW_RECEIVERS""", example = "FAVORITES", in = ParameterIn.QUERY) @NotBlank(message = "조회 기준은 반드시 입력되어야 합니다.") From e59dccd8b8b91437295dba8d039f54652e39b901 Mon Sep 17 00:00:00 2001 From: luke Date: Wed, 29 May 2024 18:10:19 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20=EB=8F=99=EC=8B=9C=EC=97=90=20?= =?UTF-8?q?=EC=97=AC=EB=9F=AC=20=EB=B0=B0=ED=8F=AC=EA=B0=80=20=EB=B0=9C?= =?UTF-8?q?=EC=83=9D=ED=95=A0=20=EA=B2=BD=EC=9A=B0=20=EC=B5=9C=EC=8B=A0?= =?UTF-8?q?=EC=9D=98=20=EA=B2=83=EB=A7=8C=20=EC=9C=A0=EC=A7=80=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/TestCi.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/TestCi.yml b/.github/workflows/TestCi.yml index d878e17c..e3bec159 100644 --- a/.github/workflows/TestCi.yml +++ b/.github/workflows/TestCi.yml @@ -10,6 +10,10 @@ env: permissions: contents: read +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: build: runs-on: ubuntu-latest