Skip to content

Commit 242c090

Browse files
committed
시스템 메세지 DB에 저장
1 parent 3acac54 commit 242c090

File tree

3 files changed

+37
-9
lines changed

3 files changed

+37
-9
lines changed

app/models/chat.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#app/models/chat.py
12
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, UniqueConstraint, func
23
from sqlalchemy.orm import relationship
34
from app.core.db import Base
@@ -17,12 +18,14 @@ class ChatMessage(Base):
1718
__tablename__ = "chat_messages"
1819
id = Column(Integer, primary_key=True, index=True)
1920
room_id = Column(Integer, ForeignKey("chat_rooms.id", ondelete="CASCADE"), nullable=False, index=True)
20-
sender_id = Column(Integer, ForeignKey("users.userId", ondelete="CASCADE"), nullable=False, index=True)
21+
sender_id = Column(Integer, ForeignKey("users.userId", ondelete="CASCADE"), nullable=True, index=True) # ✅ 변경
2122
type = Column(String(20), nullable=False)
2223
content = Column(Text, nullable=False)
2324
created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
2425
room = relationship("ChatRoom", back_populates="messages")
2526

27+
28+
2629
class ChatRead(Base):
2730
__tablename__ = "chat_reads"
2831
id = Column(Integer, primary_key=True)

app/routers/chat_rest.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,13 @@ def list_messages(
7070

7171
messages: List[MessageItem] = []
7272
for m in rows:
73-
is_mine = m.sender_id == me.user_id
74-
read = db.query(ChatRead).filter(ChatRead.message_id == m.id).count() > 0
73+
if m.type == "SYSTEM":
74+
is_mine = False
75+
read = True # 시스템 메세지는 그냥 항상 읽은 걸로 취급
76+
else:
77+
is_mine = (m.sender_id == me.user_id)
78+
read = db.query(ChatRead).filter(ChatRead.message_id == m.id).count() > 0
79+
7580
messages.append(
7681
MessageItem(
7782
messageId=m.id,
@@ -151,19 +156,34 @@ async def update_deal_status(
151156
db.refresh(posting)
152157

153158
nick = me.nickname or "사용자"
154-
if new_status == "RESERVED":
159+
160+
if prev_status == "RESERVED" and new_status == "ACTIVE":
161+
msg_text = f"{nick}님이 예약을 취소했습니다"
162+
elif new_status == "RESERVED":
155163
msg_text = f"{nick}님이 예약을 요청했습니다"
156164
elif new_status == "COMPLETED":
157165
msg_text = f"{nick}님이 거래를 완료했습니다"
158166
else:
159167
msg_text = f"{nick}님이 거래 상태를 변경했습니다"
160168

161-
# ✅ 여기! 이제는 그냥 await로 보내기
169+
# ✅ 시스템 메시지를 ChatMessage 로 저장
170+
system_msg = ChatMessage(
171+
room_id=room.id,
172+
sender_id=None, # 시스템이라서 보낸 사람 없음
173+
type="SYSTEM",
174+
content=msg_text,
175+
)
176+
db.add(system_msg)
177+
db.commit()
178+
db.refresh(system_msg)
179+
180+
# ✅ 기존처럼 브로드캐스트 (필요하면 messageId도 같이 넘겨도 됨)
162181
await chat_ws.broadcast_deal_update(
163182
chat_id=room.id,
164183
deal_status=new_status,
165184
post_status=posting.status,
166185
system_message=msg_text,
186+
# 필요하면 system_message_id=system_msg.id 이런 식으로 확장
167187
)
168188

169189
return DealStatusOut(
@@ -175,4 +195,4 @@ async def update_deal_status(
175195
postStatus=posting.status,
176196
changedBy=me.user_id,
177197
changedAt=changed_at,
178-
)
198+
)

app/routers/chat_ws.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,15 @@ async def websocket_chat(websocket: WebSocket, chat_id: int, db: Session = Depen
146146
# REST API(update_deal_status)에서 호출함
147147
async def broadcast_deal_update(chat_id: int, deal_status: str, post_status: str, system_message: str):
148148
data = {
149-
"type": "deal_update",
149+
"type": "DEAL_UPDATE",
150150
"chatId": chat_id,
151151
"dealStatus": deal_status,
152152
"postStatus": post_status,
153-
"systemMessage": system_message,
153+
"systemMessage": {
154+
"messageId": system_msg.id,
155+
"content": system_msg.content,
156+
"sendAt": system_msg.created_at.isoformat()
157+
}
154158
}
155-
await broadcast(chat_id, data, exclude=None) # 자기 포함 모두에게 전송
159+
160+
await broadcast(chat_id, data)

0 commit comments

Comments
 (0)