From a8d8684c44cc9f2540760b7f04a0b9a714901487 Mon Sep 17 00:00:00 2001 From: Hanbi Date: Sun, 17 Nov 2024 14:32:14 +0900 Subject: [PATCH 1/8] =?UTF-8?q?feat(chatMessage):=20service=20=EB=A1=9C?= =?UTF-8?q?=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/domain/ChatMessage.java | 27 ++++++++++++-- .../chat/dto/mapper/ChatMessageMapper.java | 12 +++++++ .../chat/dto/request/ChatMessageRequest.java | 3 -- .../chat/service/ChatMessageService.java | 35 +++++++++++++++++++ 4 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/domain/ChatMessage.java b/src/main/java/site/coach_coach/coach_coach_server/chat/domain/ChatMessage.java index 8817a700..2a42814d 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/domain/ChatMessage.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/domain/ChatMessage.java @@ -7,14 +7,12 @@ import org.springframework.data.mongodb.core.mapping.Document; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import site.coach_coach.coach_coach_server.common.domain.RoleEnum; @Document(collection = "chat_messages") @Getter -@Builder @NoArgsConstructor @AllArgsConstructor public class ChatMessage { @@ -24,7 +22,30 @@ public class ChatMessage { private Long senderId; private RoleEnum senderRole; private String message; - private boolean isRead = false; + private boolean isRead; @CreationTimestamp private LocalDateTime createdAt; + + private ChatMessage( + Long chatRoomId, + Long senderId, + RoleEnum senderRole, + String message + ) { + this.chatRoomId = chatRoomId; + this.senderId = senderId; + this.senderRole = senderRole; + this.message = message; + this.isRead = false; + this.createdAt = LocalDateTime.now(); + } + + public static ChatMessage of( + Long chatRoomId, + Long senderId, + RoleEnum senderRole, + String message + ) { + return new ChatMessage(chatRoomId, senderId, senderRole, message); + } } diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/dto/mapper/ChatMessageMapper.java b/src/main/java/site/coach_coach/coach_coach_server/chat/dto/mapper/ChatMessageMapper.java index 10aa3259..aec3851e 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/dto/mapper/ChatMessageMapper.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/dto/mapper/ChatMessageMapper.java @@ -1,6 +1,7 @@ package site.coach_coach.coach_coach_server.chat.dto.mapper; import site.coach_coach.coach_coach_server.chat.domain.ChatMessage; +import site.coach_coach.coach_coach_server.chat.dto.request.ChatMessageRequest; import site.coach_coach.coach_coach_server.chat.dto.response.ChatMessageResponse; public class ChatMessageMapper { @@ -15,4 +16,15 @@ public static ChatMessageResponse toChatMessageResponse( chatMessage.getCreatedAt() ); } + + public static ChatMessage toChatMessage( + ChatMessageRequest messageRequest, Long chatRoomId + ) { + return ChatMessage.of( + chatRoomId, + messageRequest.senderId(), + messageRequest.senderRole(), + messageRequest.message() + ); + } } diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/dto/request/ChatMessageRequest.java b/src/main/java/site/coach_coach/coach_coach_server/chat/dto/request/ChatMessageRequest.java index ed9ce5cb..624d3100 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/dto/request/ChatMessageRequest.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/dto/request/ChatMessageRequest.java @@ -5,9 +5,6 @@ import site.coach_coach.coach_coach_server.common.domain.RoleEnum; public record ChatMessageRequest( - @NotNull - Long chatRoomId, - @NotNull Long senderId, diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java b/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java new file mode 100644 index 00000000..02ea5d1b --- /dev/null +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java @@ -0,0 +1,35 @@ +package site.coach_coach.coach_coach_server.chat.service; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import lombok.RequiredArgsConstructor; +import site.coach_coach.coach_coach_server.chat.domain.ChatMessage; +import site.coach_coach.coach_coach_server.chat.dto.mapper.ChatMessageMapper; +import site.coach_coach.coach_coach_server.chat.dto.request.ChatMessageRequest; +import site.coach_coach.coach_coach_server.chat.dto.response.ChatMessageResponse; +import site.coach_coach.coach_coach_server.chat.repository.ChatMessageRepository; +import site.coach_coach.coach_coach_server.chat.repository.ChatRoomRepository; +import site.coach_coach.coach_coach_server.common.constants.ErrorMessage; +import site.coach_coach.coach_coach_server.common.exception.NotFoundException; + +@Service +@RequiredArgsConstructor +public class ChatMessageService { + private final ChatRoomRepository chatRoomRepository; + private final ChatMessageRepository chatMessageRepository; + + @Transactional + public ChatMessageResponse addMessage( + Long chatRoomId, + ChatMessageRequest messageRequest + ) { + if (!chatRoomRepository.existsById(chatRoomId)) { + throw new NotFoundException(ErrorMessage.NOT_FOUND_CHAT_ROOM); + } + ChatMessage chatMessage = chatMessageRepository.save( + ChatMessageMapper.toChatMessage(messageRequest, chatRoomId) + ); + return ChatMessageMapper.toChatMessageResponse(chatMessage); + } +} From 04ad679f9af81788fb4f1c94e827677ca82b68f7 Mon Sep 17 00:00:00 2001 From: Hanbi Date: Sun, 17 Nov 2024 15:45:23 +0900 Subject: [PATCH 2/8] =?UTF-8?q?feat(chatMessage):=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EC=A0=84=EC=86=A1=20controller?= =?UTF-8?q?=20=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 --- .../controller/ChatMessageController.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/site/coach_coach/coach_coach_server/chat/controller/ChatMessageController.java diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/controller/ChatMessageController.java b/src/main/java/site/coach_coach/coach_coach_server/chat/controller/ChatMessageController.java new file mode 100644 index 00000000..92937fc5 --- /dev/null +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/controller/ChatMessageController.java @@ -0,0 +1,28 @@ +package site.coach_coach.coach_coach_server.chat.controller; + +import org.springframework.messaging.handler.annotation.DestinationVariable; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.messaging.handler.annotation.SendTo; +import org.springframework.stereotype.Controller; + +import lombok.RequiredArgsConstructor; +import site.coach_coach.coach_coach_server.chat.dto.request.ChatMessageRequest; +import site.coach_coach.coach_coach_server.chat.dto.response.ChatMessageResponse; +import site.coach_coach.coach_coach_server.chat.service.ChatMessageService; + +@Controller +@RequiredArgsConstructor +public class ChatMessageController { + + private final ChatMessageService chatMessageService; + + @MessageMapping("/chat-rooms/{chatRoomId}") + @SendTo("/sub/chat-rooms/{chatRoomId}") + public ChatMessageResponse sendMessage( + @DestinationVariable("chatRoomId") Long chatRoomId, + @Payload ChatMessageRequest messageRequest + ) { + return chatMessageService.addMessage(chatRoomId, messageRequest); + } +} From 8e25d743b3c10bfa47fe0711b51f97b6d8ffa87a Mon Sep 17 00:00:00 2001 From: Hanbi Date: Sun, 17 Nov 2024 16:49:07 +0900 Subject: [PATCH 3/8] =?UTF-8?q?refactor(chatMessage):=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=20=EC=A0=84=EC=86=A1=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/controller/ChatMessageController.java | 7 ++----- .../chat/service/ChatMessageService.java | 11 +++++------ 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/controller/ChatMessageController.java b/src/main/java/site/coach_coach/coach_coach_server/chat/controller/ChatMessageController.java index 92937fc5..ca02572d 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/controller/ChatMessageController.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/controller/ChatMessageController.java @@ -3,12 +3,10 @@ import org.springframework.messaging.handler.annotation.DestinationVariable; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.Payload; -import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.stereotype.Controller; import lombok.RequiredArgsConstructor; import site.coach_coach.coach_coach_server.chat.dto.request.ChatMessageRequest; -import site.coach_coach.coach_coach_server.chat.dto.response.ChatMessageResponse; import site.coach_coach.coach_coach_server.chat.service.ChatMessageService; @Controller @@ -18,11 +16,10 @@ public class ChatMessageController { private final ChatMessageService chatMessageService; @MessageMapping("/chat-rooms/{chatRoomId}") - @SendTo("/sub/chat-rooms/{chatRoomId}") - public ChatMessageResponse sendMessage( + public void sendMessage( @DestinationVariable("chatRoomId") Long chatRoomId, @Payload ChatMessageRequest messageRequest ) { - return chatMessageService.addMessage(chatRoomId, messageRequest); + chatMessageService.addMessage(chatRoomId, messageRequest); } } diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java b/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java index 02ea5d1b..dea302b5 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java @@ -1,5 +1,6 @@ package site.coach_coach.coach_coach_server.chat.service; +import org.springframework.messaging.simp.SimpMessageSendingOperations; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -7,7 +8,6 @@ import site.coach_coach.coach_coach_server.chat.domain.ChatMessage; import site.coach_coach.coach_coach_server.chat.dto.mapper.ChatMessageMapper; import site.coach_coach.coach_coach_server.chat.dto.request.ChatMessageRequest; -import site.coach_coach.coach_coach_server.chat.dto.response.ChatMessageResponse; import site.coach_coach.coach_coach_server.chat.repository.ChatMessageRepository; import site.coach_coach.coach_coach_server.chat.repository.ChatRoomRepository; import site.coach_coach.coach_coach_server.common.constants.ErrorMessage; @@ -18,18 +18,17 @@ public class ChatMessageService { private final ChatRoomRepository chatRoomRepository; private final ChatMessageRepository chatMessageRepository; + private final SimpMessageSendingOperations messagingTemplate; @Transactional - public ChatMessageResponse addMessage( - Long chatRoomId, - ChatMessageRequest messageRequest - ) { + public void addMessage(Long chatRoomId, ChatMessageRequest messageRequest) { if (!chatRoomRepository.existsById(chatRoomId)) { throw new NotFoundException(ErrorMessage.NOT_FOUND_CHAT_ROOM); } ChatMessage chatMessage = chatMessageRepository.save( ChatMessageMapper.toChatMessage(messageRequest, chatRoomId) ); - return ChatMessageMapper.toChatMessageResponse(chatMessage); + messagingTemplate.convertAndSend("/sub/chat-rooms/" + chatRoomId, + ChatMessageMapper.toChatMessageResponse(chatMessage)); } } From 7348395a961f24e73672536ef123c0e9353451c4 Mon Sep 17 00:00:00 2001 From: Hanbi Date: Sun, 17 Nov 2024 17:02:04 +0900 Subject: [PATCH 4/8] =?UTF-8?q?feat(chatMessage):=20sender=20role=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/service/ChatMessageService.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java b/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java index dea302b5..b94fd02b 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java @@ -6,11 +6,14 @@ import lombok.RequiredArgsConstructor; import site.coach_coach.coach_coach_server.chat.domain.ChatMessage; +import site.coach_coach.coach_coach_server.chat.domain.ChatRoom; import site.coach_coach.coach_coach_server.chat.dto.mapper.ChatMessageMapper; import site.coach_coach.coach_coach_server.chat.dto.request.ChatMessageRequest; import site.coach_coach.coach_coach_server.chat.repository.ChatMessageRepository; import site.coach_coach.coach_coach_server.chat.repository.ChatRoomRepository; import site.coach_coach.coach_coach_server.common.constants.ErrorMessage; +import site.coach_coach.coach_coach_server.common.domain.RoleEnum; +import site.coach_coach.coach_coach_server.common.exception.AccessDeniedException; import site.coach_coach.coach_coach_server.common.exception.NotFoundException; @Service @@ -22,13 +25,22 @@ public class ChatMessageService { @Transactional public void addMessage(Long chatRoomId, ChatMessageRequest messageRequest) { - if (!chatRoomRepository.existsById(chatRoomId)) { - throw new NotFoundException(ErrorMessage.NOT_FOUND_CHAT_ROOM); - } + ChatRoom chatRoom = chatRoomRepository.findById(chatRoomId) + .orElseThrow(() -> new NotFoundException(ErrorMessage.NOT_FOUND_CHAT_ROOM)); ChatMessage chatMessage = chatMessageRepository.save( ChatMessageMapper.toChatMessage(messageRequest, chatRoomId) ); messagingTemplate.convertAndSend("/sub/chat-rooms/" + chatRoomId, ChatMessageMapper.toChatMessageResponse(chatMessage)); } + + private RoleEnum determineSenderRole(ChatRoom chatRoom, Long senderId) { + if (chatRoom.getUser().getUserId().equals(senderId)) { + return RoleEnum.USER; + } else if (chatRoom.getCoach().getUser().getUserId().equals(senderId)) { + return RoleEnum.COACH; + } else { + throw new AccessDeniedException(); + } + } } From a64432c2fb7521d6aa4a749387ac931123b1a7da Mon Sep 17 00:00:00 2001 From: Hanbi Date: Sun, 17 Nov 2024 17:40:57 +0900 Subject: [PATCH 5/8] =?UTF-8?q?refactor(chatMessage):=20=EC=B1=84=ED=8C=85?= =?UTF-8?q?=20=EC=A0=84=EC=86=A1=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/controller/ChatMessageController.java | 6 +++++- .../chat/dto/mapper/ChatMessageMapper.java | 12 ------------ .../chat/dto/request/ChatMessageRequest.java | 8 -------- .../chat/service/ChatMessageService.java | 11 +++++------ 4 files changed, 10 insertions(+), 27 deletions(-) diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/controller/ChatMessageController.java b/src/main/java/site/coach_coach/coach_coach_server/chat/controller/ChatMessageController.java index ca02572d..e390fa29 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/controller/ChatMessageController.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/controller/ChatMessageController.java @@ -3,9 +3,11 @@ import org.springframework.messaging.handler.annotation.DestinationVariable; import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.stereotype.Controller; import lombok.RequiredArgsConstructor; +import site.coach_coach.coach_coach_server.auth.userdetails.CustomUserDetails; import site.coach_coach.coach_coach_server.chat.dto.request.ChatMessageRequest; import site.coach_coach.coach_coach_server.chat.service.ChatMessageService; @@ -18,8 +20,10 @@ public class ChatMessageController { @MessageMapping("/chat-rooms/{chatRoomId}") public void sendMessage( @DestinationVariable("chatRoomId") Long chatRoomId, + @AuthenticationPrincipal CustomUserDetails userDetails, @Payload ChatMessageRequest messageRequest ) { - chatMessageService.addMessage(chatRoomId, messageRequest); + Long senderId = userDetails.getUserId(); + chatMessageService.addMessage(chatRoomId, senderId, messageRequest); } } diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/dto/mapper/ChatMessageMapper.java b/src/main/java/site/coach_coach/coach_coach_server/chat/dto/mapper/ChatMessageMapper.java index aec3851e..10aa3259 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/dto/mapper/ChatMessageMapper.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/dto/mapper/ChatMessageMapper.java @@ -1,7 +1,6 @@ package site.coach_coach.coach_coach_server.chat.dto.mapper; import site.coach_coach.coach_coach_server.chat.domain.ChatMessage; -import site.coach_coach.coach_coach_server.chat.dto.request.ChatMessageRequest; import site.coach_coach.coach_coach_server.chat.dto.response.ChatMessageResponse; public class ChatMessageMapper { @@ -16,15 +15,4 @@ public static ChatMessageResponse toChatMessageResponse( chatMessage.getCreatedAt() ); } - - public static ChatMessage toChatMessage( - ChatMessageRequest messageRequest, Long chatRoomId - ) { - return ChatMessage.of( - chatRoomId, - messageRequest.senderId(), - messageRequest.senderRole(), - messageRequest.message() - ); - } } diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/dto/request/ChatMessageRequest.java b/src/main/java/site/coach_coach/coach_coach_server/chat/dto/request/ChatMessageRequest.java index 624d3100..48ea8f6d 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/dto/request/ChatMessageRequest.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/dto/request/ChatMessageRequest.java @@ -1,16 +1,8 @@ package site.coach_coach.coach_coach_server.chat.dto.request; import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import site.coach_coach.coach_coach_server.common.domain.RoleEnum; public record ChatMessageRequest( - @NotNull - Long senderId, - - @NotBlank - RoleEnum senderRole, - @NotBlank String message ) { diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java b/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java index b94fd02b..89e980fd 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java @@ -7,7 +7,6 @@ import lombok.RequiredArgsConstructor; import site.coach_coach.coach_coach_server.chat.domain.ChatMessage; import site.coach_coach.coach_coach_server.chat.domain.ChatRoom; -import site.coach_coach.coach_coach_server.chat.dto.mapper.ChatMessageMapper; import site.coach_coach.coach_coach_server.chat.dto.request.ChatMessageRequest; import site.coach_coach.coach_coach_server.chat.repository.ChatMessageRepository; import site.coach_coach.coach_coach_server.chat.repository.ChatRoomRepository; @@ -24,14 +23,14 @@ public class ChatMessageService { private final SimpMessageSendingOperations messagingTemplate; @Transactional - public void addMessage(Long chatRoomId, ChatMessageRequest messageRequest) { + public void addMessage(Long chatRoomId, Long senderId, ChatMessageRequest messageRequest) { ChatRoom chatRoom = chatRoomRepository.findById(chatRoomId) .orElseThrow(() -> new NotFoundException(ErrorMessage.NOT_FOUND_CHAT_ROOM)); - ChatMessage chatMessage = chatMessageRepository.save( - ChatMessageMapper.toChatMessage(messageRequest, chatRoomId) - ); + + RoleEnum senderRole = determineSenderRole(chatRoom, senderId); + messagingTemplate.convertAndSend("/sub/chat-rooms/" + chatRoomId, - ChatMessageMapper.toChatMessageResponse(chatMessage)); + ChatMessage.of(chatRoomId, senderId, senderRole, messageRequest.message())); } private RoleEnum determineSenderRole(ChatRoom chatRoom, Long senderId) { From b77fe805dc41575176c59ad7108abcb6e0cdc844 Mon Sep 17 00:00:00 2001 From: Hanbi Date: Sun, 17 Nov 2024 22:37:12 +0900 Subject: [PATCH 6/8] =?UTF-8?q?feat(chatMessage):=20role=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=A1=9C=EC=A7=81=20=EB=B0=8F=20=EC=B0=B8=EC=97=AC?= =?UTF-8?q?=EC=9E=90=20=ED=8C=90=EB=B3=84=20=EB=A1=9C=EC=A7=81=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 --- .../chat/service/ChatMessageService.java | 20 +++++++++++++++++++ .../chat/service/ChatRoomService.java | 10 +++++----- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java b/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java index 89e980fd..f3095bbd 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java @@ -21,12 +21,14 @@ public class ChatMessageService { private final ChatRoomRepository chatRoomRepository; private final ChatMessageRepository chatMessageRepository; private final SimpMessageSendingOperations messagingTemplate; + private final ChatRoomService chatRoomService; @Transactional public void addMessage(Long chatRoomId, Long senderId, ChatMessageRequest messageRequest) { ChatRoom chatRoom = chatRoomRepository.findById(chatRoomId) .orElseThrow(() -> new NotFoundException(ErrorMessage.NOT_FOUND_CHAT_ROOM)); + chatRoomService.validateUserRoleForChatRoom(senderId, chatRoom); RoleEnum senderRole = determineSenderRole(chatRoom, senderId); messagingTemplate.convertAndSend("/sub/chat-rooms/" + chatRoomId, @@ -42,4 +44,22 @@ private RoleEnum determineSenderRole(ChatRoom chatRoom, Long senderId) { throw new AccessDeniedException(); } } + + @Transactional + public void markMessagesAsRead(Long chatRoomId, Long userId) { + ChatRoom chatRoom = chatRoomRepository.findById(chatRoomId) + .orElseThrow(() -> new NotFoundException(ErrorMessage.NOT_FOUND_CHAT_ROOM)); + chatRoomService.validateUserRoleForChatRoom(userId, chatRoom); + RoleEnum senderRole = determineSenderRole(chatRoom, userId); + Long receiverId = determineReceiverId(chatRoom, userId, senderRole); + + } + + private Long determineReceiverId(ChatRoom chatRoom, Long senderId, RoleEnum role) { + if (role == RoleEnum.USER) { + return chatRoom.getCoach().getUser().getUserId(); + } else { + return chatRoom.getUser().getUserId(); + } + } } diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatRoomService.java b/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatRoomService.java index 163537f8..8de1fbce 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatRoomService.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatRoomService.java @@ -83,16 +83,16 @@ public List findChatRoomsForCoach(User user) { @Transactional(readOnly = true) public Slice findChatMessagesByChatRoomId(Long userId, Long chatRoomId, Pageable pageable) { - validateUserRoleForChatRoom(userId, chatRoomId); + ChatRoom chatRoom = chatRoomRepository.findById(chatRoomId) + .orElseThrow(() -> new NotFoundException(ErrorMessage.NOT_FOUND_CHAT_ROOM)); + validateUserRoleForChatRoom(userId, chatRoom); return chatMessageRepository .findByChatRoomIdOrderByCreatedAtDesc(chatRoomId, pageable) .map(ChatMessageMapper::toChatMessageResponse); } - private void validateUserRoleForChatRoom(Long userId, Long chatRoomId) { - ChatRoom chatRoom = chatRoomRepository.findById(chatRoomId) - .orElseThrow(() -> new NotFoundException(ErrorMessage.NOT_FOUND_CHAT_ROOM)); - + @Transactional(readOnly = true) + public void validateUserRoleForChatRoom(Long userId, ChatRoom chatRoom) { boolean isUser = chatRoom.getUser().getUserId().equals(userId); boolean isCoach = chatRoom.getCoach() != null && chatRoom.getCoach().getUser().getUserId().equals(userId); From f6b29f47ede8ccb57b7e8eb9b1b6215116ae57fa Mon Sep 17 00:00:00 2001 From: Hanbi Date: Mon, 18 Nov 2024 11:34:51 +0900 Subject: [PATCH 7/8] =?UTF-8?q?feat(chatMessage):=20=EC=B1=84=ED=8C=85=20?= =?UTF-8?q?=EC=9D=BD=EC=9D=8C=20=ED=91=9C=EC=8B=9C=20=EB=B0=8F=20=EC=95=88?= =?UTF-8?q?=20=EC=9D=BD=EC=9D=80=20=EC=B1=84=ED=8C=85=20=EA=B0=9C=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 --- .../chat/controller/ChatRoomController.java | 3 +++ .../chat/dto/mapper/ChatRoomMapper.java | 15 +++++++++++++++ .../chat/dto/response/CoachChatRoomsResponse.java | 1 + .../chat/dto/response/UserChatRoomsResponse.java | 1 + .../chat/repository/ChatMessageRepository.java | 8 ++++++++ .../chat/service/ChatMessageService.java | 11 ++++++++--- .../chat/service/ChatRoomService.java | 6 ++++-- 7 files changed, 40 insertions(+), 5 deletions(-) diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/controller/ChatRoomController.java b/src/main/java/site/coach_coach/coach_coach_server/chat/controller/ChatRoomController.java index 26de2741..41542243 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/controller/ChatRoomController.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/controller/ChatRoomController.java @@ -16,6 +16,7 @@ import site.coach_coach.coach_coach_server.chat.dto.response.ChatMessageResponse; import site.coach_coach.coach_coach_server.chat.dto.response.CoachChatRoomsResponse; import site.coach_coach.coach_coach_server.chat.dto.response.UserChatRoomsResponse; +import site.coach_coach.coach_coach_server.chat.service.ChatMessageService; import site.coach_coach.coach_coach_server.chat.service.ChatRoomService; import site.coach_coach.coach_coach_server.user.domain.User; @@ -24,6 +25,7 @@ @RequestMapping("/api") public class ChatRoomController { private final ChatRoomService chatRoomService; + private final ChatMessageService chatMessageService; @GetMapping("/v1/users/chat-rooms") public ResponseEntity> getUserChatRooms( @@ -50,6 +52,7 @@ public ResponseEntity> getChatMessages( Pageable pageable ) { Long userId = userDetails.getUserId(); + chatMessageService.markMessagesAsRead(chatRoomId, userId); Slice messages = chatRoomService .findChatMessagesByChatRoomId(userId, chatRoomId, pageable); return ResponseEntity.ok(messages); diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/dto/mapper/ChatRoomMapper.java b/src/main/java/site/coach_coach/coach_coach_server/chat/dto/mapper/ChatRoomMapper.java index 156b983a..01f33bab 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/dto/mapper/ChatRoomMapper.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/dto/mapper/ChatRoomMapper.java @@ -16,10 +16,16 @@ public class ChatRoomMapper { public static UserChatRoomsResponse toUserChatRoomsResponse( ChatRoom chatRoom, + Long userId, ChatMessageRepository chatMessageRepository ) { Coach coach = chatRoom.getCoach(); User coachUser = coach.getUser(); + + long unreadCount = chatMessageRepository.countByChatRoomIdAndSenderIdNotAndIsReadFalse( + chatRoom.getChatRoomId(), + userId + ); Optional lastMessage = findLastMessage(chatRoom, chatMessageRepository); return new UserChatRoomsResponse( chatRoom.getChatRoomId(), @@ -30,16 +36,24 @@ public static UserChatRoomsResponse toUserChatRoomsResponse( getCoachingSports(coach), coach.getActiveHours(), lastMessage.map(ChatMessage::getMessage).orElse(""), + unreadCount, lastMessage.map(ChatMessage::getCreatedAt).orElse(null) ); } public static CoachChatRoomsResponse toCoachChatRoomsResponse( ChatRoom chatRoom, + Long userId, ChatMessageRepository chatMessageRepository ) { User user = chatRoom.getUser(); Optional lastMessage = findLastMessage(chatRoom, chatMessageRepository); + + long unreadCount = chatMessageRepository.countByChatRoomIdAndSenderIdNotAndIsReadFalse( + chatRoom.getChatRoomId(), + userId + ); + return new CoachChatRoomsResponse( chatRoom.getChatRoomId(), user.getUserId(), @@ -47,6 +61,7 @@ public static CoachChatRoomsResponse toCoachChatRoomsResponse( user.getProfileImageUrl(), chatRoom.getMatching() != null && chatRoom.getMatching().getIsMatching(), lastMessage.map(ChatMessage::getMessage).orElse(""), + unreadCount, lastMessage.map(ChatMessage::getCreatedAt).orElse(null) ); } diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/dto/response/CoachChatRoomsResponse.java b/src/main/java/site/coach_coach/coach_coach_server/chat/dto/response/CoachChatRoomsResponse.java index 0813ad07..568dc229 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/dto/response/CoachChatRoomsResponse.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/dto/response/CoachChatRoomsResponse.java @@ -9,6 +9,7 @@ public record CoachChatRoomsResponse( String userProfileImageUrl, boolean isMatching, String lastMessage, + long unreadCount, LocalDateTime lastMessageCreatedAt ) { } diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/dto/response/UserChatRoomsResponse.java b/src/main/java/site/coach_coach/coach_coach_server/chat/dto/response/UserChatRoomsResponse.java index e9edeab4..a20826e6 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/dto/response/UserChatRoomsResponse.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/dto/response/UserChatRoomsResponse.java @@ -12,6 +12,7 @@ public record UserChatRoomsResponse( List coachingSports, String activeHours, String lastMessage, + long unreadCount, LocalDateTime lastMessageCreatedAt ) { } diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/repository/ChatMessageRepository.java b/src/main/java/site/coach_coach/coach_coach_server/chat/repository/ChatMessageRepository.java index 27491ca4..87188999 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/repository/ChatMessageRepository.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/repository/ChatMessageRepository.java @@ -4,7 +4,9 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.data.mongodb.repository.Query; import site.coach_coach.coach_coach_server.chat.domain.ChatMessage; @@ -12,4 +14,10 @@ public interface ChatMessageRepository extends MongoRepository findTopByChatRoomIdOrderByCreatedAt(Long chatRoomId); Slice findByChatRoomIdOrderByCreatedAtDesc(Long chatRoomId, Pageable pageable); + + long countByChatRoomIdAndSenderIdNotAndIsReadFalse(Long chatRoomId, Long senderId); + + @Modifying + @Query("{'chatRoomId': ?0, 'senderId': {$ne: ?1}, 'isRead': false}") + void markMessagesAsRead(Long chatRoomId, Long senderId); } diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java b/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java index f3095bbd..081ed271 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatMessageService.java @@ -52,14 +52,19 @@ public void markMessagesAsRead(Long chatRoomId, Long userId) { chatRoomService.validateUserRoleForChatRoom(userId, chatRoom); RoleEnum senderRole = determineSenderRole(chatRoom, userId); Long receiverId = determineReceiverId(chatRoom, userId, senderRole); - + chatMessageRepository.markMessagesAsRead(chatRoomId, receiverId); } private Long determineReceiverId(ChatRoom chatRoom, Long senderId, RoleEnum role) { if (role == RoleEnum.USER) { - return chatRoom.getCoach().getUser().getUserId(); + if (chatRoom.getUser().getUserId().equals(senderId)) { + return chatRoom.getCoach().getUser().getUserId(); + } } else { - return chatRoom.getUser().getUserId(); + if (chatRoom.getCoach().getUser().getUserId().equals(senderId)) { + return chatRoom.getUser().getUserId(); + } } + throw new AccessDeniedException(); } } diff --git a/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatRoomService.java b/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatRoomService.java index 8de1fbce..bdf5c817 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatRoomService.java +++ b/src/main/java/site/coach_coach/coach_coach_server/chat/service/ChatRoomService.java @@ -60,9 +60,10 @@ public Long createChatRoom(ChatRoomRequest chatRoomRequest) { @Transactional(readOnly = true) public List findChatRoomsForUser(User user) { + Long userId = user.getUserId(); return chatRoomRepository.findByUser(user) .stream() - .map(chatRoom -> ChatRoomMapper.toUserChatRoomsResponse(chatRoom, chatMessageRepository)) + .map(chatRoom -> ChatRoomMapper.toUserChatRoomsResponse(chatRoom, userId, chatMessageRepository)) .collect(Collectors.toList()); } @@ -75,9 +76,10 @@ public List findChatRoomsForCoach(User user) { Coach coach = coachRepository.findByUser(user) .orElseThrow(() -> new NotFoundException(ErrorMessage.NOT_FOUND_COACH)); + Long userId = user.getUserId(); return chatRoomRepository.findByCoach_CoachId(coach.getCoachId()) .stream() - .map(chatRoom -> ChatRoomMapper.toCoachChatRoomsResponse(chatRoom, chatMessageRepository)) + .map(chatRoom -> ChatRoomMapper.toCoachChatRoomsResponse(chatRoom, userId, chatMessageRepository)) .collect(Collectors.toList()); } From e8006159b55edd126b6f01b8a77d015f0b8518c8 Mon Sep 17 00:00:00 2001 From: Hanbi Date: Mon, 18 Nov 2024 14:54:45 +0900 Subject: [PATCH 8/8] =?UTF-8?q?feat:=20uri=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coach_coach/coach_coach_server/config/SecurityConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/site/coach_coach/coach_coach_server/config/SecurityConfig.java b/src/main/java/site/coach_coach/coach_coach_server/config/SecurityConfig.java index 9e4c669e..467d74a8 100644 --- a/src/main/java/site/coach_coach/coach_coach_server/config/SecurityConfig.java +++ b/src/main/java/site/coach_coach/coach_coach_server/config/SecurityConfig.java @@ -50,7 +50,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti authorizeRequests .requestMatchers("/api/v1/auth/login", "/api/v1/auth/signup", "/api/v1/test", "/api/v1/auth/check-email", "/api/v1/auth/check-nickname", "/api/v1/auth/reissue", - "/api/v1/auth", "/oauth2/", "/login/oauth2/").permitAll() + "/api/v1/auth", "/oauth2/", "/login/oauth2/", "/ws/**").permitAll() .anyRequest() .authenticated() )