Skip to content

Commit be6d93b

Browse files
authored
feat: 채팅방 멤버수, 업데이트 시간 추가 (#112)
* feat: 채팅 참가 멤버수 도메인 추가 * feat: 마지막 채팅 시간 도메인 추가 * feat: 프론트 채팅 멤버수, 마지막 채팅 시간 표시 * refact: chatroom column 추가 * chore: Java 스타일 수정 * refact: Count 쿼리 적용 * refact: 마지막 채팅 시간 관련 도메인 수정 * refact: 도메인 수정으로 인한 DDL 파일 작성
1 parent 01f6f33 commit be6d93b

8 files changed

Lines changed: 55 additions & 16 deletions

File tree

NBE_5_7_2_02TEAM/src/main/java/io/twogether/nbe_5_7_2_02team/chat/dao/ChatMemberRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,6 @@ public interface ChatMemberRepository extends JpaRepository<ChatMember, Long> {
1717
List<ChatMember> findByMember(Member member);
1818

1919
void deleteByChatRoom(ChatRoom chatRoom);
20+
21+
long countByChatRoom(ChatRoom chatRoom);
2022
}

NBE_5_7_2_02TEAM/src/main/java/io/twogether/nbe_5_7_2_02team/chat/domain/ChatRoom.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.twogether.nbe_5_7_2_02team.global.common.BaseEntity;
44
import io.twogether.nbe_5_7_2_02team.post.domain.Post;
55

6+
import jakarta.persistence.Column;
67
import jakarta.persistence.Entity;
78
import jakarta.persistence.GeneratedValue;
89
import jakarta.persistence.GenerationType;
@@ -14,9 +15,11 @@
1415
import lombok.Builder;
1516
import lombok.Getter;
1617
import lombok.NoArgsConstructor;
18+
import lombok.Setter;
1719

1820
@Entity
1921
@Getter
22+
@Setter
2023
@NoArgsConstructor(access = AccessLevel.PROTECTED)
2124
public class ChatRoom extends BaseEntity {
2225

@@ -28,7 +31,13 @@ public class ChatRoom extends BaseEntity {
2831
@JoinColumn(name = "post_id")
2932
private Post post;
3033

31-
@Builder
34+
@Column(name = "member_count")
35+
private Long memberCount = 0L;
36+
37+
@Column(name = "last_chat_id")
38+
private Long lastChatId = 0L;
39+
40+
@Builder(toBuilder = true)
3241
public ChatRoom(Post post) {
3342
this.post = post;
3443
}

NBE_5_7_2_02TEAM/src/main/java/io/twogether/nbe_5_7_2_02team/chat/dto/response/ChatRoomGetResponse.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,25 @@
55
import lombok.Builder;
66
import lombok.Getter;
77

8+
import java.time.LocalDateTime;
9+
810
@Getter
911
@Builder
1012
public class ChatRoomGetResponse {
1113

1214
private final Long id;
1315
private final Long postId;
1416
private final String title;
17+
private final Long memberCount;
18+
private final LocalDateTime updatedAt;
1519

1620
public static ChatRoomGetResponse from(ChatRoom chatroom) {
1721
return ChatRoomGetResponse.builder()
1822
.id(chatroom.getId())
1923
.postId(chatroom.getPost().getId())
2024
.title(chatroom.getPost().getTitle())
25+
.memberCount(chatroom.getMemberCount())
26+
.updatedAt(chatroom.getUpdatedAt())
2127
.build();
2228
}
2329
}

NBE_5_7_2_02TEAM/src/main/java/io/twogether/nbe_5_7_2_02team/chat/service/ChatMemberService.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,21 @@ public Long createChatMember(Long chatroomId, UserDetails userDetails) {
7171
throw new ErrorException(CHAT_MEMBER_ALREADY_EXISTS);
7272
}
7373

74-
return chatMemberRepository
75-
.save(
76-
ChatMember.builder()
77-
.chatRoom(chatRoom)
78-
.member(member)
79-
.chatMemberStatus(ONLINE)
80-
.build())
81-
.getId();
74+
Long id =
75+
chatMemberRepository
76+
.save(
77+
ChatMember.builder()
78+
.chatRoom(chatRoom)
79+
.member(member)
80+
.chatMemberStatus(ONLINE)
81+
.build())
82+
.getId();
83+
84+
long size = chatMemberRepository.countByChatRoom(chatRoom);
85+
86+
chatRoom.setMemberCount(size);
87+
88+
return id;
8289
}
8390

8491
@Transactional

NBE_5_7_2_02TEAM/src/main/java/io/twogether/nbe_5_7_2_02team/chat/service/ChatMessageService.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,9 @@ public ChatMessageGetResponse createChatMessage(
8080
.build())
8181
.getId();
8282

83-
ChatMessage chatMessage = chatMessageRepository.findById(chatMessageId).get();
83+
ChatMessage chatMessage = chatMessageRepository.findById(chatMessageId).orElseThrow();
84+
85+
chatRoom.setLastChatId(chatMessageId);
8486

8587
return ChatMessageGetResponse.from(chatMessage);
8688
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-- chat_room 테이블에 member_count, last_chat_id 컬럼 추가
2+
ALTER TABLE chat_room
3+
ADD COLUMN member_count bigint NOT NULL DEFAULT 0;
4+
ALTER TABLE chat_room
5+
ADD COLUMN last_chat_id bigint;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
-- chat_room 테이블에 member_count, last_chat_id 컬럼 추가
2+
ALTER TABLE chat_room
3+
ADD COLUMN member_count bigint NOT NULL DEFAULT 0;
4+
ALTER TABLE chat_room
5+
ADD COLUMN last_chat_id bigint;

frontend/src/components/ChatRoomItem.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ interface ChatRoom {
44
id: number
55
post_id: number
66
title: string
7+
member_count: number;
8+
updated_at: Date;
79
}
810

911
interface ChatRoomItemComponentProps {
@@ -32,9 +34,10 @@ function ChatRoomItem({ chatRoom, onRoomSelect, isActive = false, isCompact = fa
3234
<div className="flex items-center mb-2">
3335
<h3 className="text-[15px] font-semibold text-[#050505] truncate">{chatRoom.title}</h3>
3436
</div>
35-
{/* <div className="text-[13px] text-[#65676b] mb-2">
36-
Room ID: {chatRoom.id} • Post ID: {chatRoom.post_id}
37-
</div> */}
37+
<div className="text-[13px] text-[#65676b] mb-2">
38+
멤버: {chatRoom.member_count}</div>
39+
<div className="text-[13px] text-[#65676b] mb-2"> 업데이트: {new Date(chatRoom.updated_at).toLocaleString("ko-KR", { year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit" })}
40+
</div >
3841
<button
3942
className="bg-[#1877f2] hover:bg-[#166fe5] text-white rounded-md py-2 text-sm font-medium transition-colors w-full"
4043
onClick={(e) => {
@@ -51,9 +54,9 @@ function ChatRoomItem({ chatRoom, onRoomSelect, isActive = false, isCompact = fa
5154
<div className="flex items-center flex-1 min-w-0 mr-3">
5255
<div className="w-full">
5356
<h3 className="text-[15px] font-semibold text-[#050505] truncate">{chatRoom.title}</h3>
54-
{/* <div className="text-[13px] text-[#65676b]">
55-
Room ID: {chatRoom.id}Post ID: {chatRoom.post_id}
56-
</div> */}
57+
<div className="text-[13px] text-[#65676b]">
58+
멤버: {chatRoom.member_count}업데이트: {new Date(chatRoom.updated_at).toLocaleString("ko-KR", { year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit" })}
59+
</div>
5760
</div>
5861
</div>
5962
<button

0 commit comments

Comments
 (0)