diff --git a/src/main/java/cmf/commitField/domain/chat/chatRoom/controller/ChatRoomController.java b/src/main/java/cmf/commitField/domain/chat/chatRoom/controller/ChatRoomController.java index 8b4d9b8..4100b50 100644 --- a/src/main/java/cmf/commitField/domain/chat/chatRoom/controller/ChatRoomController.java +++ b/src/main/java/cmf/commitField/domain/chat/chatRoom/controller/ChatRoomController.java @@ -213,6 +213,30 @@ public GlobalResponse getMyHeartRoomList( return GlobalResponse.success("좋아요 누른 채팅방 리스트 조회 완료", list); } + // 채팅방 제목 검색 조회 + @GetMapping("/room/search") + @LoginCheck + public GlobalResponse searchRoomName( + @RequestParam(name = "roomName") String roomName, + Pageable pageable) { + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication instanceof OAuth2AuthenticationToken) { + CustomOAuth2User principal = (CustomOAuth2User) authentication.getPrincipal(); + Long userId = principal.getId(); // Extract userId from the principal + + if (roomName.isEmpty()) { + throw new IllegalArgumentException("원하는 채팅방의 제목을 입력하세요."); + } + + List list = chatRoomService.searchRoomByTitle(roomName, userId, pageable); + return GlobalResponse.success(list); + } else { + throw new IllegalArgumentException("로그인 후에 이용해 주세요."); + } + } + diff --git a/src/main/java/cmf/commitField/domain/chat/chatRoom/repository/ChatRoomRepository.java b/src/main/java/cmf/commitField/domain/chat/chatRoom/repository/ChatRoomRepository.java index 2a114d5..08e3ee5 100644 --- a/src/main/java/cmf/commitField/domain/chat/chatRoom/repository/ChatRoomRepository.java +++ b/src/main/java/cmf/commitField/domain/chat/chatRoom/repository/ChatRoomRepository.java @@ -36,4 +36,7 @@ public interface ChatRoomRepository extends JpaRepository { @Query("SELECT c FROM ChatRoom c WHERE c.id IN :ids ORDER BY c.createdAt DESC") Page findChatRoomByInId(@Param("ids") List ids, Pageable pageable); + @Query("SELECT c FROM ChatRoom c WHERE c.title LIKE CONCAT('%', :title, '%')") + Page findChatRoomWithPartOfTitle(@Param("title") String title, Pageable pageable); + } \ No newline at end of file diff --git a/src/main/java/cmf/commitField/domain/chat/chatRoom/service/ChatRoomService.java b/src/main/java/cmf/commitField/domain/chat/chatRoom/service/ChatRoomService.java index 30a0772..c177193 100644 --- a/src/main/java/cmf/commitField/domain/chat/chatRoom/service/ChatRoomService.java +++ b/src/main/java/cmf/commitField/domain/chat/chatRoom/service/ChatRoomService.java @@ -35,4 +35,6 @@ public interface ChatRoomService { List myHeartRoomList(Long userId, Pageable pageable); void joinRoom(Long roomId, Long userId, ChatRoomRequest chatRoomRequest); + + List searchRoomByTitle(String roomName, Long userId, Pageable pageable); } diff --git a/src/main/java/cmf/commitField/domain/chat/chatRoom/service/ChatRoomServiceImpl.java b/src/main/java/cmf/commitField/domain/chat/chatRoom/service/ChatRoomServiceImpl.java index ccd9590..9fdbbf4 100644 --- a/src/main/java/cmf/commitField/domain/chat/chatRoom/service/ChatRoomServiceImpl.java +++ b/src/main/java/cmf/commitField/domain/chat/chatRoom/service/ChatRoomServiceImpl.java @@ -29,6 +29,7 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import static cmf.commitField.global.error.ErrorCode.NOT_FOUND_ROOM; import static java.time.LocalDateTime.now; @Service @@ -138,7 +139,7 @@ public void joinRoom(Long roomId, Long userId, ChatRoomRequest chatRoomRequest) // room 조회 ChatRoom chatRoom = chatRoomRepository.findById(roomId) // lock (기존) - .orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_ROOM)); + .orElseThrow(() -> new CustomException(NOT_FOUND_ROOM)); // user_chatroom 현재 인원 카운트 (비즈니스 로직) Long currentUserCount = userChatRoomRepository.countNonLockByChatRoomId(roomId); // lock (기존) @@ -205,16 +206,14 @@ public void outRoom(Long userId, Long roomId) { return; } // 방장이라면 방 삭제 - chatMessageRepository.deleteChatMsgByChatRoom_Id(roomId); //방 삭제 시 채팅도 다 삭제(필요 시) + chatMessageRepository.deleteChatMsgByChatRoom_Id(roomId); //방 삭제 시 채팅도 다 삭제 + // 방 삭제시 채탱 메세지 전체 삭제(포함) userChatRoomRepository.deleteUserChatRoomByChatRoom_Id(roomId); + + //채팅방 삭제 chatRoomRepository.deleteById(roomId); - // 방의 생성자와 현재 사용자가 같은지 확인 - boolean isCreator = Objects.equals(room.getRoomCreator(), userId); - // 방장 여부와 상관없이 항상 사용자-채팅방 연결만 제거 - // 방이 삭제되지 않고 목록에 계속 표시됨 - userChatRoomRepository.deleteUserChatRoomByChatRoom_IdAndUserId(roomId, userId); } // 방 삭제는 별도의 메소드로 분리 @@ -250,6 +249,31 @@ public void updateRoom(Long roomId, ChatRoomUpdateRequest chatRoomUpdateRequest, chatRoomRepository.save(room); } + @Override + @Transactional(readOnly = true) + public List searchRoomByTitle(String roomName, Long userId, Pageable pageable) { + getUser(userId); + Page search = chatRoomRepository.findChatRoomWithPartOfTitle(roomName, pageable); + + List searchRoomList = search.toList(); + List chatRoomDtos = new ArrayList<>(); + if (searchRoomList.isEmpty()) { + throw new CustomException(NOT_FOUND_ROOM); + } + + for (ChatRoom chatRoom : searchRoomList) { + ChatRoomDto build = ChatRoomDto.builder() + .id(chatRoom.getId()) + .title(chatRoom.getTitle()) + .heartCount(chatRoom.getHearts().size()) + .currentUserCount((long) chatRoom.getUserChatRooms().size()) + .userCountMax(chatRoom.getUserCountMax()) + .build(); + chatRoomDtos.add(build); + } + return chatRoomDtos; + } + private User getUser(Long userId) { return userRepository.findById(userId) .orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_USER)); diff --git a/src/main/java/cmf/commitField/domain/chat/chatRoom/service/CocurrencyChatRoomTest.java b/src/main/java/cmf/commitField/domain/chat/chatRoom/service/CocurrencyChatRoomTest.java index 3aa4cde..4aa83a6 100644 --- a/src/main/java/cmf/commitField/domain/chat/chatRoom/service/CocurrencyChatRoomTest.java +++ b/src/main/java/cmf/commitField/domain/chat/chatRoom/service/CocurrencyChatRoomTest.java @@ -3,6 +3,7 @@ //import cmf.commitField.domain.chat.chatRoom.entity.ChatRoom; //import cmf.commitField.domain.chat.chatRoom.repository.ChatRoomRepository; //import cmf.commitField.domain.chat.userChatRoom.repository.UserChatRoomRepository; +//import cmf.commitField.domain.user.service.UserService; //import org.springframework.beans.factory.annotation.Autowired; // //import java.util.ArrayList; diff --git a/src/main/java/cmf/commitField/domain/chat/userChatRoom/repository/UserChatRoomRepository.java b/src/main/java/cmf/commitField/domain/chat/userChatRoom/repository/UserChatRoomRepository.java index e21b73e..36fcb3a 100644 --- a/src/main/java/cmf/commitField/domain/chat/userChatRoom/repository/UserChatRoomRepository.java +++ b/src/main/java/cmf/commitField/domain/chat/userChatRoom/repository/UserChatRoomRepository.java @@ -23,10 +23,7 @@ public interface UserChatRoomRepository extends JpaRepository findByChatRoom_Id(Long chatRoomId); @Query("select u.user.id from UserChatRoom u where u.chatRoom.id = ?1") @@ -36,7 +33,6 @@ public interface UserChatRoomRepository extends JpaRepository findUserByChatRoomId(Long roomId); - Optional findByUserId(Long userId); //채팅방 join한 user Optional findByUserIdAndChatRoomId(Long userId, Long chatRoomId);