Skip to content

Commit 0d1d7ea

Browse files
committed
Feat: 방 비밀번호 기능 추가 및 채팅방 나가기
1 parent 02c18e8 commit 0d1d7ea

File tree

7 files changed

+47
-5
lines changed

7 files changed

+47
-5
lines changed

src/main/java/cmf/commitField/domain/chat/chatRoom/controller/ChatRoomController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,13 @@ public GlobalResponse<Object> createRoom(
4444

4545
//채팅방 입장
4646
@PostMapping("/room/join/{roomId}")
47-
public GlobalResponse<Object> joinRoom(@PathVariable Long roomId) {
47+
public GlobalResponse<Object> joinRoom(@PathVariable Long roomId, @RequestBody ChatRoomRequest chatRoomRequest) {
4848
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
4949

5050
if (authentication instanceof OAuth2AuthenticationToken) {
5151
CustomOAuth2User principal = (CustomOAuth2User) authentication.getPrincipal();
5252
Long userId = principal.getId(); // getId()를 통해 userId를 추출
53-
chatRoomService.joinRoom(roomId, userId); // userId를 전달
53+
chatRoomService.joinRoom(roomId, userId, chatRoomRequest); // userId를 전달
5454
return GlobalResponse.success("해당 채팅방에 입장하셨습니다");
5555
} else {
5656
throw new IllegalArgumentException("로그인 후에 이용해 주세요.");

src/main/java/cmf/commitField/domain/chat/chatRoom/controller/request/ChatRoomRequest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,7 @@ public class ChatRoomRequest {
2121
@Max(100)
2222
private Integer userCountMax;
2323

24+
@Length(min = 4, max = 20)
25+
private String password;
2426

2527
}

src/main/java/cmf/commitField/domain/chat/chatRoom/entity/ChatRoom.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ public class ChatRoom extends BaseEntity {
4141
@OneToMany(mappedBy = "chatRoom", fetch = FetchType.LAZY)
4242
private List<Heart> hearts;
4343

44+
private String password;
45+
46+
private Boolean isPrivate;
47+
4448
@Override
4549
public String toString() {
4650
return "ChatRoom{" +

src/main/java/cmf/commitField/domain/chat/chatRoom/service/ChatRoomService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,5 @@ public interface ChatRoomService {
3434

3535
List<ChatRoomDto> myHeartRoomList(Long userId, Pageable pageable);
3636

37+
void joinRoom(Long roomId, Long userId, ChatRoomRequest chatRoomRequest);
3738
}

src/main/java/cmf/commitField/domain/chat/chatRoom/service/ChatRoomServiceImpl.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public void createRoom(ChatRoomRequest chatRoomRequest, Long userId) {
5252
// 유저정보 조회
5353
User findUser = userRepository.findById(userId)
5454
.orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_USER));
55+
String password = chatRoomRequest.getPassword();
5556

5657
// findUser가 null이 아닐 경우, User의 ID를 사용
5758
if (findUser == null) {
@@ -65,7 +66,12 @@ public void createRoom(ChatRoomRequest chatRoomRequest, Long userId) {
6566
.userCountMax(chatRoomRequest.getUserCountMax())
6667
.createdAt(LocalDateTime.now())
6768
.modifiedAt(LocalDateTime.now())
69+
.isPrivate(false)
6870
.build();
71+
if (password != null) {
72+
chatRoom.setPassword(password);
73+
chatRoom.setIsPrivate(true);
74+
}
6975
ChatRoom savedChatRoom = chatRoomRepository.save(chatRoom);
7076

7177
// 연관관계 user_chat room 생성
@@ -76,6 +82,11 @@ public void createRoom(ChatRoomRequest chatRoomRequest, Long userId) {
7682
userChatRoomRepository.save(userChatRoom);
7783
}
7884

85+
@Override
86+
public void joinRoom(Long roomId, Long userId) {
87+
88+
}
89+
7990
// 방 조회 DTO 변환 메서드 추출
8091
private static List<ChatRoomDto> getChatRoomDtos(Page<ChatRoom> all) {
8192
return all.stream()
@@ -111,7 +122,7 @@ public List<ChatRoomDto> getUserByRoomPartList(Long userId, Pageable pageable) {
111122

112123
@Override
113124
@Transactional
114-
public void joinRoom(Long roomId, Long userId) {
125+
public void joinRoom(Long roomId, Long userId, ChatRoomRequest chatRoomRequest) {
115126
RLock lock = redissonClient.getLock("joinRoomLock:" + roomId);
116127
try {
117128
boolean available = lock.tryLock(1, TimeUnit.SECONDS);
@@ -129,6 +140,15 @@ public void joinRoom(Long roomId, Long userId) {
129140
// user_chatroom 현재 인원 카운트 (비즈니스 로직)
130141
Long currentUserCount = userChatRoomRepository.countNonLockByChatRoomId(roomId); // lock (기존)
131142

143+
if (chatRoom.getIsPrivate() && chatRoomRequest.getPassword() == null) {
144+
throw new CustomException(ErrorCode.NEED_TO_PASSWORD);
145+
146+
147+
148+
}
149+
if (chatRoom.getIsPrivate() && !chatRoomRequest.getPassword().equals(chatRoom.getPassword())) {
150+
throw new CustomException(ErrorCode.ROOM_PASSWORD_MISMATCH);
151+
}
132152
List<Long> userChatRoomByChatRoomId = userChatRoomRepository
133153
.findUserChatRoomByChatRoom_Id(roomId);
134154

@@ -160,6 +180,17 @@ public void joinRoom(Long roomId, Long userId) {
160180
@Transactional
161181
public void outRoom(Long userId, Long roomId) {
162182
ChatRoom room = getChatRoom(roomId);
183+
List<UserChatRoom> userByChatRoomId = userChatRoomRepository
184+
.findUserByChatRoomId(roomId);
185+
List<Long> userIds = new ArrayList<>();
186+
for (UserChatRoom userChatRoom : userByChatRoomId) {
187+
Long id = userChatRoom.getUser().getId();
188+
userIds.add(id);
189+
}
190+
// 만약 방에 없는데 나가기를 시도한 경우
191+
if (!userIds.contains(userId)) {
192+
throw new CustomException(ErrorCode.METHOD_NOT_ALLOWED);
193+
}
163194
// 방장이 아니라면
164195
if (!Objects.equals(room.getRoomCreator(), userId)) {
165196
userChatRoomRepository.deleteUserChatRoomByChatRoom_IdAndUserId(roomId, userId);

src/main/java/cmf/commitField/domain/chat/userChatRoom/repository/UserChatRoomRepository.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public interface UserChatRoomRepository extends JpaRepository<UserChatRoom, Long
3232
List<Long> findUserChatRoomByChatRoom_Id(Long chatRoomId);
3333

3434
List<UserChatRoom> findUserChatRoomByChatRoomId(Long roomId);
35-
35+
//out room 조회
36+
List<UserChatRoom> findUserByChatRoomId(Long roomId);
3637

3738
}

src/main/java/cmf/commitField/global/error/ErrorCode.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,10 @@ public enum ErrorCode {
3232

3333
TOKEN_EXPIRED(HttpStatus.BAD_REQUEST, "토큰이 만료되었습니다."),
3434

35-
// member
35+
// user_room
3636
MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "사용자를 찾을 수 없습니다"),
37+
NEED_TO_PASSWORD(HttpStatus.BAD_REQUEST, "비밀번호를 입력해야 합니다."),
38+
ROOM_PASSWORD_MISMATCH(HttpStatus.BAD_REQUEST, "방 비밀번호가 일치하지 않습니다."),
3739

3840
// season
3941
NOT_FOUND_SEASON(HttpStatus.NOT_FOUND, "시즌을 찾을 수 없습니다."),
@@ -57,6 +59,7 @@ public enum ErrorCode {
5759
NOT_EXIST_CLIENT(HttpStatus.NOT_FOUND, "채팅방에 사용자가 존재하지 않습니다."),
5860
NOT_ROOM_MEMBER(HttpStatus.FORBIDDEN, "채팅방에 속한 유저가 아닙니다."),
5961

62+
6063
//chatMessage
6164
EMPTY_MESSAGE(HttpStatus.BAD_REQUEST, "채팅 메시지는 공백으로 보낼 수 없습니다."),
6265
CHAT_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 채팅방의 메시지들을 찾지 못했습니다."),

0 commit comments

Comments
 (0)