Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
79 changes: 59 additions & 20 deletions src/main/java/goorm/ddok/chat/controller/ChatController.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,20 +48,27 @@ public ResponseEntity<ApiResponseDto<ChatListResponse>> getPrivateChats(
@RequestParam(value = "search", required = false) String search,
@Parameter(description = "페이지 번호 (0부터 시작)") @RequestParam(defaultValue = "0") int page,
@Parameter(description = "페이지 크기 (최대 100)") @RequestParam(defaultValue = "10") int size,
Authentication authentication) {
@AuthenticationPrincipal CustomUserDetails loginUser
) {

if (search != null && search.trim().isEmpty()) {
throw new GlobalException(ErrorCode.INVALID_SEARCH_KEYWORD);
}

if (loginUser == null) {
throw new GlobalException(ErrorCode.UNAUTHORIZED);
}

Long userId = loginUser.getId();

if (size > 100) size = 100;

Pageable pageable = PageRequest.of(page, size);
String email = authentication.getName();

ChatListResponse response =
(search == null)
? chatRoomQueryService.getPrivateChats(email, pageable)
: chatRoomQueryService.searchPrivateChats(email, search.trim(), pageable);
? chatRoomQueryService.getPrivateChats(userId, pageable)
: chatRoomQueryService.searchPrivateChats(userId, search.trim(), pageable);

return ResponseEntity.ok(ApiResponseDto.of(200, "개인 채팅 목록 조회 성공", response));
}
Expand All @@ -87,20 +94,27 @@ public ResponseEntity<ApiResponseDto<ChatListResponse>> getTeamChats(
@RequestParam(value = "search", required = false) String search,
@Parameter(description = "페이지 번호 (0부터 시작)") @RequestParam(defaultValue = "0") int page,
@Parameter(description = "페이지 크기 (최대 100)") @RequestParam(defaultValue = "10") int size,
Authentication authentication) {
@AuthenticationPrincipal CustomUserDetails loginUser
) {

if (search != null && search.trim().isEmpty()) {
throw new GlobalException(ErrorCode.INVALID_SEARCH_KEYWORD);
}

if (loginUser == null) {
throw new GlobalException(ErrorCode.UNAUTHORIZED);
}

if (size > 100) size = 100;

Long userId = loginUser.getId();

Pageable pageable = PageRequest.of(page, size);
String email = authentication.getName();

ChatListResponse response =
(search == null)
? chatRoomQueryService.getTeamChats(email, pageable)
: chatRoomQueryService.searchTeamChats(email, search.trim(), pageable);
? chatRoomQueryService.getTeamChats(userId, pageable)
: chatRoomQueryService.searchTeamChats(userId, search.trim(), pageable);

return ResponseEntity.ok(ApiResponseDto.of(200, "팀 채팅 목록 조회 성공", response));
}
Expand Down Expand Up @@ -128,13 +142,20 @@ public ResponseEntity<ApiResponseDto<ChatListResponse>> getTeamChats(
public ResponseEntity<ApiResponseDto<ChatMembersResponse>> getMembers(
@Parameter(description = "채팅방 ID", example = "123", required = true, in = ParameterIn.PATH)
@PathVariable Long roomId,
Authentication authentication) {
@AuthenticationPrincipal CustomUserDetails loginUser
) {

if (roomId == null || roomId <= 0) {
throw new GlobalException(ErrorCode.INVALID_ROOM_ID);
}
String email = authentication.getName();
ChatMembersResponse response = chatRoomQueryService.getRoomMembers(roomId, email);

if (loginUser == null) {
throw new GlobalException(ErrorCode.UNAUTHORIZED);
}

Long userId = loginUser.getId();

ChatMembersResponse response = chatRoomQueryService.getRoomMembers(roomId, userId);

return ResponseEntity.ok(ApiResponseDto.of(200, "채팅방 인원 조회 성공", response));
}
Expand All @@ -160,14 +181,20 @@ public ResponseEntity<ApiResponseDto<ChatMessageResponse>> sendMessage(
@Parameter(description = "채팅방 ID", example = "1", required = true, in = ParameterIn.PATH)
@PathVariable Long roomId,
@Valid @RequestBody ChatMessageRequest request,
Authentication authentication) {
@AuthenticationPrincipal CustomUserDetails loginUser
) {

if (!StringUtils.hasText(request.getContentText())) {
throw new GlobalException(ErrorCode.CHAT_MESSAGE_INVALID);
}

String email = authentication.getName();
ChatMessageResponse response = chatMessageService.sendMessage(email, roomId, request);
if (loginUser == null) {
throw new GlobalException(ErrorCode.UNAUTHORIZED);
}

Long userId = loginUser.getId();

ChatMessageResponse response = chatMessageService.sendMessage(userId, roomId, request);

return ResponseEntity.ok(ApiResponseDto.of(200, "메시지 전송 성공", response));
}
Expand All @@ -180,18 +207,24 @@ public ResponseEntity<ApiResponseDto<ChatMessageListResponse>> getMessages(
@RequestParam(value = "search", required = false) String search,
@Parameter(description = "페이지 번호 (0부터 시작)") @RequestParam(defaultValue = "0") int page,
@Parameter(description = "페이지 크기 (최대 100)") @RequestParam(defaultValue = "10") int size,
Authentication authentication) {
@AuthenticationPrincipal CustomUserDetails loginUser
) {

if (search != null && search.trim().isEmpty()) {
throw new GlobalException(ErrorCode.INVALID_SEARCH_KEYWORD);
}

if (loginUser == null) {
throw new GlobalException(ErrorCode.UNAUTHORIZED);
}
if (size > 100) size = 100;

Long userId = loginUser.getId();

Pageable pageable = PageRequest.of(page, size);
String email = authentication.getName();

ChatMessageListResponse response =
chatMessageService.getChatMessages(email, roomId, pageable, search);
chatMessageService.getChatMessages(userId, roomId, pageable, search);

return ResponseEntity.ok(ApiResponseDto.of(200, "채팅방 메세지 조회 성공", response));
}
Expand All @@ -202,10 +235,16 @@ public ResponseEntity<ApiResponseDto<ChatReadResponse>> sendReadMessage(
@Parameter(description = "채팅방 ID", example = "123", required = true, in = ParameterIn.PATH)
@PathVariable Long roomId,
@Valid @RequestBody LastReadMessageRequest request,
Authentication authentication) {
@AuthenticationPrincipal CustomUserDetails loginUser
) {

if (loginUser == null) {
throw new GlobalException(ErrorCode.UNAUTHORIZED);
}

Long userId = loginUser.getId();

String email = authentication.getName();
ChatReadResponse response = chatMessageService.lastReadMessage(email, roomId, request);
ChatReadResponse response = chatMessageService.lastReadMessage(userId, roomId, request);

return ResponseEntity.ok(ApiResponseDto.of(200, "메세지 읽음 처리 완료", response));
}
Expand Down
16 changes: 8 additions & 8 deletions src/main/java/goorm/ddok/chat/service/ChatMessageService.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ public class ChatMessageService {
private final ChatMessageRepository chatMessageRepository;
private final UserRepository userRepository;

private User getUserByEmail(String email) {
return userRepository.findByEmail(email)
private User getUserById(Long userId) {
return userRepository.findById(userId)
.orElseThrow(() -> new GlobalException(ErrorCode.USER_NOT_FOUND));
}

Expand All @@ -44,8 +44,8 @@ private ChatRoom getRoomById(Long roomId) {

// 메시지 전송
@Transactional
public ChatMessageResponse sendMessage(String email, Long roomId, ChatMessageRequest request) {
User sender = getUserByEmail(email);
public ChatMessageResponse sendMessage(Long userId, Long roomId, ChatMessageRequest request) {
User sender = getUserById(userId);
ChatRoom room = getRoomById(roomId);

if (!chatRoomMemberRepository.existsByRoomAndUser(room, sender)) {
Expand Down Expand Up @@ -80,8 +80,8 @@ public ChatMessageResponse sendMessage(String email, Long roomId, ChatMessageReq

// 채팅 메시지 목록/검색
@Transactional
public ChatMessageListResponse getChatMessages(String email, Long roomId, Pageable pageable, String search) {
User me = getUserByEmail(email);
public ChatMessageListResponse getChatMessages(Long userId, Long roomId, Pageable pageable, String search) {
User me = getUserById(userId);
ChatRoom room = getRoomById(roomId);

if (!chatRoomMemberRepository.existsByRoomAndUserAndDeletedAtIsNull(room, me)) {
Expand Down Expand Up @@ -114,8 +114,8 @@ public ChatMessageListResponse getChatMessages(String email, Long roomId, Pageab

// 마지막 읽은 메시지 처리
@Transactional
public ChatReadResponse lastReadMessage(String email, Long roomId, LastReadMessageRequest request) {
User me = getUserByEmail(email);
public ChatReadResponse lastReadMessage(Long userId, Long roomId, LastReadMessageRequest request) {
User me = getUserById(userId);
ChatRoom roomRef = chatRepository.getReferenceById(roomId);

ChatRoomMember member = chatRoomMemberRepository.findByRoomAndUser(roomRef, me)
Expand Down
24 changes: 12 additions & 12 deletions src/main/java/goorm/ddok/chat/service/ChatRoomQueryService.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,14 @@ public class ChatRoomQueryService {
private final UserRepository userRepository;
private final ChatMapper chatMapper;

private User getUserByEmail(String email) {
return userRepository.findByEmail(email)
private User getUserById(Long id) {
return userRepository.findById(id)
.orElseThrow(() -> new GlobalException(ErrorCode.USER_NOT_FOUND));
}

// 1:1 채팅 목록 조회
public ChatListResponse getPrivateChats(String email, Pageable pageable) {
User me = getUserByEmail(email);
public ChatListResponse getPrivateChats(Long userId, Pageable pageable) {
User me = getUserById(userId);
Page<ChatRoom> page = chatRepository.pageRoomsByMemberAndTypeOrderByRecent(
me, ChatRoomType.PRIVATE, pageable);
List<ChatRoomResponse> chats = chatMapper.toChatRoomDtoList(page.getContent(), me.getId());
Expand All @@ -52,8 +52,8 @@ public ChatListResponse getPrivateChats(String email, Pageable pageable) {
}

// 팀 채팅 목록 조회
public ChatListResponse getTeamChats(String email, Pageable pageable) {
User me = getUserByEmail(email);
public ChatListResponse getTeamChats(Long userId, Pageable pageable) {
User me = getUserById(userId);
Page<ChatRoom> page = chatRepository.pageRoomsByMemberAndTypeOrderByRecent(
me, ChatRoomType.GROUP, pageable);
List<ChatRoomResponse> chats = chatMapper.toChatRoomDtoList(page.getContent(), me.getId());
Expand All @@ -65,8 +65,8 @@ public ChatListResponse getTeamChats(String email, Pageable pageable) {
}

// 1:1 채팅 목록 검색
public ChatListResponse searchPrivateChats(String email, String search, Pageable pageable) {
User me = getUserByEmail(email);
public ChatListResponse searchPrivateChats(Long userId, String search, Pageable pageable) {
User me = getUserById(userId);
Page<ChatRoom> page = chatRepository.pagePrivateRoomsByMemberAndPeerNickname(
me, search, pageable);
List<ChatRoomResponse> chats = chatMapper.toChatRoomDtoList(page.getContent(), me.getId());
Expand All @@ -78,8 +78,8 @@ public ChatListResponse searchPrivateChats(String email, String search, Pageable
}

// 팀 채팅 목록 검색
public ChatListResponse searchTeamChats(String email, String search, Pageable pageable) {
User me = getUserByEmail(email);
public ChatListResponse searchTeamChats(Long userId, String search, Pageable pageable) {
User me = getUserById(userId);
Page<ChatRoom> page = chatRepository.pageGroupRoomsByMemberAndRoomOrMemberName(
me, search, pageable);
List<ChatRoomResponse> chats = chatMapper.toChatRoomDtoList(page.getContent(), me.getId());
Expand All @@ -91,8 +91,8 @@ public ChatListResponse searchTeamChats(String email, String search, Pageable pa
}

// 채팅 멤버 조회
public ChatMembersResponse getRoomMembers(Long roomId, String email) {
User me = getUserByEmail(email);
public ChatMembersResponse getRoomMembers(Long roomId, Long userId) {
User me = getUserById(userId);
ChatRoom roomRef = chatRepository.getReferenceById(roomId);

boolean isMember = chatRoomMemberRepository.existsByRoomAndUserAndDeletedAtIsNull(roomRef, me);
Expand Down
6 changes: 2 additions & 4 deletions src/main/java/goorm/ddok/chat/ws/ChatWsController.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,12 @@ public void send(@DestinationVariable Long roomId,

User user = userRepository.findById(userId)
.orElseThrow(() -> new GlobalException(ErrorCode.USER_NOT_FOUND));
String email = user.getEmail();

if (payload.getContentType() == null) {
payload.setContentType(ChatContentType.TEXT);
}

ChatMessageResponse saved = chatMessageService.sendMessage(email, roomId, payload);
ChatMessageResponse saved = chatMessageService.sendMessage(userId, roomId, payload);

messagingTemplate.convertAndSend("/sub/chats/" + roomId, saved);
}
Expand All @@ -67,9 +66,8 @@ public void enter(@DestinationVariable Long roomId,

User user = userRepository.findById(userId)
.orElseThrow(() -> new GlobalException(ErrorCode.USER_NOT_FOUND));
String email = user.getEmail();

ChatMessageResponse saved = chatMessageService.sendMessage(email, roomId, payload);
ChatMessageResponse saved = chatMessageService.sendMessage(userId, roomId, payload);
messagingTemplate.convertAndSend("/sub/chats/" + roomId, saved);
}
}
Loading