Skip to content

[채팅 관련 API] 채팅방 나가기, 채팅 메시지 읽음 처리 #104

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
May 29, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 16 additions & 7 deletions be/src/main/java/yeonba/be/chatting/controller/ChatController.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,12 @@
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;
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;
Expand All @@ -37,8 +33,6 @@ public class ChatController {
@MessageMapping("/chat")
public void chat(ChatPublishRequest request) {

log.info("chatting test log {}", request.getContent());

chatService.publish(request);
}

Expand Down Expand Up @@ -103,4 +97,19 @@ public ResponseEntity<CustomResponse<Void>> acceptRequestedChat(
.ok()
.body(new CustomResponse<>());
}

@Operation(summary = "채팅방 나가기", description = "채팅방을 나갈 수 있습니다.")
@ApiResponse(responseCode = "200", description = "채팅방 나가기 정상 처리")
@DeleteMapping("/chat-rooms/{roomId}")
public ResponseEntity<CustomResponse<Void>> leaveChatRoom(
@RequestAttribute("userId") long userId,
@Parameter(description = "채팅방 ID", example = "1")
@PathVariable long roomId) {

chatService.leaveChatRoom(userId, roomId);

return ResponseEntity
.ok()
.body(new CustomResponse<>());
}
}
4 changes: 4 additions & 0 deletions be/src/main/java/yeonba/be/chatting/entity/ChatMessage.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
9 changes: 9 additions & 0 deletions be/src/main/java/yeonba/be/chatting/entity/ChatRoom.java
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down Expand Up @@ -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);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -14,4 +15,9 @@ public ChatMessage save(ChatMessage message) {

return chatMessageRepository.save(message);
}

public void deleteAllByChatRoom(ChatRoom chatRoom) {

chatMessageRepository.deleteAllByChatRoom(chatRoom);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,6 @@ public interface ChatMessageRepository extends JpaRepository<ChatMessage, Long>
int countByChatRoomIdAndReadIsFalse(long chatRoomId);

List<ChatMessage> findAllByChatRoomOrderBySentAtDesc(ChatRoom chatRoom);

void deleteAllByChatRoom(ChatRoom chatRoom);
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,9 @@ public ChatRoom createChatRoom(ChatRoom chatRoom) {

return chatRoomRepository.save(chatRoom);
}

public void delete(ChatRoom chatRoom) {

chatRoomRepository.delete(chatRoom);
}
}
27 changes: 21 additions & 6 deletions be/src/main/java/yeonba/be/chatting/service/ChatService.java
Original file line number Diff line number Diff line change
Expand Up @@ -72,16 +72,19 @@ public List<ChatMessageResponse> 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<ChatMessage> 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.getReceiver().equals(user)) {
chatMessage.readMessage();
}
return new ChatMessageResponse(chatMessage.getSender().getId(),
chatMessage.getSender().getNickname(), chatMessage.getContent(),
chatMessage.getSentAt());
})
.toList();
}

Expand Down Expand Up @@ -181,4 +184,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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public class UserQueryRequest {
조회 기준
- 즐겨찾는 이성 : FAVORITES
- 나에게 관심 있는 이성(나에게 화살을 보낸 이성) : ARROW_SENDERS
- 나에게 화살을 보낸 이성 : ARROW_RECEIVERS""",
- 내가 화살을 보낸 이성 : ARROW_RECEIVERS""",
example = "FAVORITES",
in = ParameterIn.QUERY)
@NotBlank(message = "조회 기준은 반드시 입력되어야 합니다.")
Expand Down
Loading