Skip to content

Commit 8e0c4ab

Browse files
authored
Merge pull request #95 from CommitField/Feature/89
Feature/89
2 parents 02c18e8 + 8d89ffd commit 8e0c4ab

File tree

14 files changed

+154
-49
lines changed

14 files changed

+154
-49
lines changed

β€Žsrc/main/java/cmf/commitField/domain/chat/chatMessage/dto/ChatMsgDto.javaβ€Ž

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
package cmf.commitField.domain.chat.chatMessage.dto;
22

3-
import lombok.AllArgsConstructor;
4-
import lombok.Getter;
5-
import lombok.NoArgsConstructor;
6-
import lombok.Setter;
3+
import lombok.*;
74

85
import java.time.LocalDateTime;
96

107
@Getter
118
@Setter
129
@NoArgsConstructor
1310
@AllArgsConstructor
11+
@Builder
1412
public class ChatMsgDto {
1513
private Long chatMsgId;
1614
private Long userId;

β€Žsrc/main/java/cmf/commitField/domain/chat/chatMessage/service/ChatMessageServiceImpl.javaβ€Ž

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import cmf.commitField.domain.chat.chatMessage.repository.ChatMessageRepository;
99
import cmf.commitField.domain.chat.chatRoom.entity.ChatRoom;
1010
import cmf.commitField.domain.chat.chatRoom.repository.ChatRoomRepository;
11+
import cmf.commitField.domain.chat.userChatRoom.entity.UserChatRoom;
12+
import cmf.commitField.domain.chat.userChatRoom.repository.UserChatRoomRepository;
1113
import cmf.commitField.domain.user.entity.User;
1214
import cmf.commitField.domain.user.repository.UserRepository;
1315
import cmf.commitField.global.error.ErrorCode;
@@ -17,8 +19,9 @@
1719
import org.springframework.transaction.annotation.Transactional;
1820

1921
import java.time.LocalDateTime;
22+
import java.util.ArrayList;
2023
import java.util.List;
21-
import java.util.stream.Collectors;
24+
import java.util.Optional;
2225

2326
@Service
2427
@RequiredArgsConstructor
@@ -28,6 +31,7 @@ public class ChatMessageServiceImpl implements ChatMessageService {
2831
private final UserRepository userRepository;
2932
private final ChatRoomRepository chatRoomRepository;
3033
private final ChatMessageCustomRepository chatMessageCustomRepository;
34+
private final UserChatRoomRepository userChatRoomRepository;
3135

3236
@Override
3337
public ChatMsgResponse sendMessage(ChatMsgRequest message, Long userId, Long roomId) {
@@ -61,13 +65,24 @@ public List<ChatMsgDto> getRoomChatMsgList(Long roomId, Long userId, Long lastId
6165
.orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_USER));
6266

6367
List<ChatMsg> chatMsgsList = chatMessageCustomRepository.findChatRoomIdByChatMsg(roomId, lastId);
64-
return chatMsgsList.stream().map(chatMsg -> new ChatMsgDto(
65-
chatMsg.getId(),
66-
chatMsg.getUser().getId(),
67-
chatMsg.getUser().getNickname(),
68-
chatMsg.getMessage(),
69-
chatMsg.getCreatedAt()
70-
))
71-
.collect(Collectors.toList());
68+
Optional<UserChatRoom> joinUser = userChatRoomRepository.findByUserIdAndChatRoomId(userId,roomId);
69+
if (joinUser.isEmpty()) {
70+
throw new CustomException(ErrorCode.NOT_FOUND_USER);
71+
}
72+
LocalDateTime joinDt = joinUser.get().getJoinDt();
73+
List<ChatMsgDto> chatMsgDtos = new ArrayList<>();
74+
for (ChatMsg chatMsg : chatMsgsList) {
75+
ChatMsgDto build = ChatMsgDto.builder()
76+
.chatMsgId(chatMsg.getId())
77+
.nickname(chatMsg.getUser().getNickname())
78+
.sendAt(chatMsg.getCreatedAt())
79+
.message(chatMsg.getMessage())
80+
.userId(chatMsg.getUser().getId())
81+
.build();
82+
if (build.getSendAt().isAfter(joinDt)) {
83+
chatMsgDtos.add(build);
84+
}
85+
}
86+
return chatMsgDtos;
7287
}
7388
}

β€Ž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: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,14 @@
2323
import org.springframework.stereotype.Service;
2424
import org.springframework.transaction.annotation.Transactional;
2525

26-
import java.time.LocalDateTime;
2726
import java.util.ArrayList;
2827
import java.util.List;
2928
import java.util.Objects;
3029
import java.util.concurrent.TimeUnit;
3130
import java.util.stream.Collectors;
3231

32+
import static java.time.LocalDateTime.now;
33+
3334
@Service
3435
@RequiredArgsConstructor
3536
public class ChatRoomServiceImpl implements ChatRoomService {
@@ -52,6 +53,7 @@ public void createRoom(ChatRoomRequest chatRoomRequest, Long userId) {
5253
// μœ μ €μ •λ³΄ 쑰회
5354
User findUser = userRepository.findById(userId)
5455
.orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_USER));
56+
String password = chatRoomRequest.getPassword();
5557

5658
// findUserκ°€ null이 아닐 경우, User의 IDλ₯Ό μ‚¬μš©
5759
if (findUser == null) {
@@ -63,19 +65,31 @@ public void createRoom(ChatRoomRequest chatRoomRequest, Long userId) {
6365
.roomCreator(findUser.getId())
6466
.title(chatRoomRequest.getTitle())
6567
.userCountMax(chatRoomRequest.getUserCountMax())
66-
.createdAt(LocalDateTime.now())
67-
.modifiedAt(LocalDateTime.now())
68+
.createdAt(now())
69+
.modifiedAt(now())
70+
.isPrivate(false)
6871
.build();
72+
if (password != null) {
73+
chatRoom.setPassword(password);
74+
chatRoom.setIsPrivate(true);
75+
}
6976
ChatRoom savedChatRoom = chatRoomRepository.save(chatRoom);
7077

7178
// 연관관계 user_chat room 생성
7279
UserChatRoom userChatRoom = UserChatRoom.builder()
7380
.user(findUser)
7481
.chatRoom(savedChatRoom)
82+
.joinDt(now())
7583
.build();
7684
userChatRoomRepository.save(userChatRoom);
7785
}
7886

87+
@Override
88+
public void joinRoom(Long roomId, Long userId) {
89+
90+
}
91+
92+
7993
// λ°© 쑰회 DTO λ³€ν™˜ λ©”μ„œλ“œ μΆ”μΆœ
8094
private static List<ChatRoomDto> getChatRoomDtos(Page<ChatRoom> all) {
8195
return all.stream()
@@ -111,7 +125,7 @@ public List<ChatRoomDto> getUserByRoomPartList(Long userId, Pageable pageable) {
111125

112126
@Override
113127
@Transactional
114-
public void joinRoom(Long roomId, Long userId) {
128+
public void joinRoom(Long roomId, Long userId, ChatRoomRequest chatRoomRequest) {
115129
RLock lock = redissonClient.getLock("joinRoomLock:" + roomId);
116130
try {
117131
boolean available = lock.tryLock(1, TimeUnit.SECONDS);
@@ -129,6 +143,15 @@ public void joinRoom(Long roomId, Long userId) {
129143
// user_chatroom ν˜„μž¬ 인원 카운트 (λΉ„μ¦ˆλ‹ˆμŠ€ 둜직)
130144
Long currentUserCount = userChatRoomRepository.countNonLockByChatRoomId(roomId); // lock (κΈ°μ‘΄)
131145

146+
if (chatRoom.getIsPrivate() && chatRoomRequest.getPassword() == null) {
147+
throw new CustomException(ErrorCode.NEED_TO_PASSWORD);
148+
149+
150+
151+
}
152+
if (chatRoom.getIsPrivate() && !chatRoomRequest.getPassword().equals(chatRoom.getPassword())) {
153+
throw new CustomException(ErrorCode.ROOM_PASSWORD_MISMATCH);
154+
}
132155
List<Long> userChatRoomByChatRoomId = userChatRoomRepository
133156
.findUserChatRoomByChatRoom_Id(roomId);
134157

@@ -144,6 +167,7 @@ public void joinRoom(Long roomId, Long userId) {
144167
UserChatRoom userChatRoom = UserChatRoom.builder()
145168
.user(findUser)
146169
.chatRoom(chatRoom)
170+
.joinDt(now())
147171
.build();
148172
userChatRoomRepository.save(userChatRoom);
149173
// λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 끝
@@ -160,6 +184,17 @@ public void joinRoom(Long roomId, Long userId) {
160184
@Transactional
161185
public void outRoom(Long userId, Long roomId) {
162186
ChatRoom room = getChatRoom(roomId);
187+
List<UserChatRoom> userByChatRoomId = userChatRoomRepository
188+
.findUserByChatRoomId(roomId);
189+
List<Long> userIds = new ArrayList<>();
190+
for (UserChatRoom userChatRoom : userByChatRoomId) {
191+
Long id = userChatRoom.getUser().getId();
192+
userIds.add(id);
193+
}
194+
// λ§Œμ•½ 방에 μ—†λŠ”λ° λ‚˜κ°€κΈ°λ₯Ό μ‹œλ„ν•œ 경우
195+
if (!userIds.contains(userId)) {
196+
throw new CustomException(ErrorCode.METHOD_NOT_ALLOWED);
197+
}
163198
// λ°©μž₯이 μ•„λ‹ˆλΌλ©΄
164199
if (!Objects.equals(room.getRoomCreator(), userId)) {
165200
userChatRoomRepository.deleteUserChatRoomByChatRoom_IdAndUserId(roomId, userId);
@@ -197,7 +232,7 @@ public void updateRoom(Long roomId, ChatRoomUpdateRequest chatRoomUpdateRequest,
197232
if (currentRoomTitle.equals(chatRoomUpdateRequest.getTitle())) {
198233
throw new CustomException(ErrorCode.REQUEST_SAME_AS_CURRENT_TITLE);
199234
}
200-
room.update(chatRoomUpdateRequest.getTitle(), LocalDateTime.now());
235+
room.update(chatRoomUpdateRequest.getTitle(), now());
201236
chatRoomRepository.save(room);
202237
}
203238

β€Žsrc/main/java/cmf/commitField/domain/chat/userChatRoom/entity/UserChatRoom.javaβ€Ž

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import lombok.*;
1111
import lombok.experimental.SuperBuilder;
1212

13+
import java.time.LocalDateTime;
14+
1315
@Entity
1416
@Getter
1517
@Setter
@@ -25,4 +27,7 @@ public class UserChatRoom extends BaseEntity {
2527
@ManyToOne(fetch = FetchType.LAZY)
2628
@JoinColumn(name = "chat_room_id",nullable = false)
2729
private ChatRoom chatRoom;
30+
31+
32+
private LocalDateTime joinDt;
2833
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.springframework.stereotype.Repository;
88

99
import java.util.List;
10+
import java.util.Optional;
1011

1112
@Repository
1213
public interface UserChatRoomRepository extends JpaRepository<UserChatRoom, Long> {
@@ -32,6 +33,11 @@ public interface UserChatRoomRepository extends JpaRepository<UserChatRoom, Long
3233
List<Long> findUserChatRoomByChatRoom_Id(Long chatRoomId);
3334

3435
List<UserChatRoom> findUserChatRoomByChatRoomId(Long roomId);
36+
//out room 쑰회
37+
List<UserChatRoom> findUserByChatRoomId(Long roomId);
3538

39+
Optional<UserChatRoom> findByUserId(Long userId);
40+
//μ±„νŒ…λ°© joinν•œ user
41+
Optional<UserChatRoom> findByUserIdAndChatRoomId(Long userId, Long chatRoomId);
3642

3743
}

β€Ž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)