Spaces:
Running
Running
Commit ·
f7e886e
1
Parent(s): 1306e79
fyp
Browse files- app/models/message.py +11 -0
- app/routes/conversations.py +3 -0
- app/routes/websocket_chat.py +7 -0
- app/schemas/conversation.py +4 -0
- app/services/conversation_service.py +6 -0
app/models/message.py
CHANGED
|
@@ -22,6 +22,9 @@ class Message:
|
|
| 22 |
content: Optional[str] = None,
|
| 23 |
media: Optional[dict] = None,
|
| 24 |
property_card: Optional[dict] = None,
|
|
|
|
|
|
|
|
|
|
| 25 |
) -> dict:
|
| 26 |
"""Create message document for insertion"""
|
| 27 |
now = datetime.utcnow()
|
|
@@ -34,6 +37,10 @@ class Message:
|
|
| 34 |
"content": content,
|
| 35 |
"media": media, # {url, filename, size, mime_type, duration, thumbnail_url}
|
| 36 |
"property_card": property_card, # {listing_id, title, price, currency, bedrooms, bathrooms, location, image_url, listing_type}
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
"is_read": False,
|
| 38 |
"read_at": None,
|
| 39 |
# Edit tracking
|
|
@@ -139,6 +146,10 @@ class Message:
|
|
| 139 |
"content": message_doc.get("content") if not is_deleted else None,
|
| 140 |
"media": message_doc.get("media") if not is_deleted else None,
|
| 141 |
"property_card": message_doc.get("property_card") if not is_deleted else None,
|
|
|
|
|
|
|
|
|
|
|
|
|
| 142 |
"is_read": message_doc.get("is_read", False),
|
| 143 |
"read_at": Message._serialize_datetime(message_doc.get("read_at")),
|
| 144 |
# Edit fields
|
|
|
|
| 22 |
content: Optional[str] = None,
|
| 23 |
media: Optional[dict] = None,
|
| 24 |
property_card: Optional[dict] = None,
|
| 25 |
+
replied_to_message_id: Optional[str] = None,
|
| 26 |
+
replied_to_content: Optional[str] = None,
|
| 27 |
+
replied_to_sender: Optional[str] = None,
|
| 28 |
) -> dict:
|
| 29 |
"""Create message document for insertion"""
|
| 30 |
now = datetime.utcnow()
|
|
|
|
| 37 |
"content": content,
|
| 38 |
"media": media, # {url, filename, size, mime_type, duration, thumbnail_url}
|
| 39 |
"property_card": property_card, # {listing_id, title, price, currency, bedrooms, bathrooms, location, image_url, listing_type}
|
| 40 |
+
# Reply-to fields
|
| 41 |
+
"replied_to_message_id": replied_to_message_id,
|
| 42 |
+
"replied_to_content": replied_to_content, # Preview of replied message (truncated)
|
| 43 |
+
"replied_to_sender": replied_to_sender, # Name of original sender
|
| 44 |
"is_read": False,
|
| 45 |
"read_at": None,
|
| 46 |
# Edit tracking
|
|
|
|
| 146 |
"content": message_doc.get("content") if not is_deleted else None,
|
| 147 |
"media": message_doc.get("media") if not is_deleted else None,
|
| 148 |
"property_card": message_doc.get("property_card") if not is_deleted else None,
|
| 149 |
+
# Reply-to fields
|
| 150 |
+
"replied_to_message_id": message_doc.get("replied_to_message_id"),
|
| 151 |
+
"replied_to_content": message_doc.get("replied_to_content"),
|
| 152 |
+
"replied_to_sender": message_doc.get("replied_to_sender"),
|
| 153 |
"is_read": message_doc.get("is_read", False),
|
| 154 |
"read_at": Message._serialize_datetime(message_doc.get("read_at")),
|
| 155 |
# Edit fields
|
app/routes/conversations.py
CHANGED
|
@@ -265,6 +265,9 @@ async def send_message(
|
|
| 265 |
content=dto.content,
|
| 266 |
media=media,
|
| 267 |
property_card=dto.property_card.dict() if dto.property_card else None,
|
|
|
|
|
|
|
|
|
|
| 268 |
)
|
| 269 |
|
| 270 |
|
|
|
|
| 265 |
content=dto.content,
|
| 266 |
media=media,
|
| 267 |
property_card=dto.property_card.dict() if dto.property_card else None,
|
| 268 |
+
replied_to_message_id=dto.replied_to_message_id,
|
| 269 |
+
replied_to_content=dto.replied_to_content,
|
| 270 |
+
replied_to_sender=dto.replied_to_sender,
|
| 271 |
)
|
| 272 |
|
| 273 |
|
app/routes/websocket_chat.py
CHANGED
|
@@ -238,6 +238,10 @@ async def handle_send_message(user_id: str, user_name: str, user_avatar: Optiona
|
|
| 238 |
content = data.get("content")
|
| 239 |
media = data.get("media")
|
| 240 |
property_card = data.get("property_card")
|
|
|
|
|
|
|
|
|
|
|
|
|
| 241 |
|
| 242 |
# Auto-detect message type based on content
|
| 243 |
if property_card:
|
|
@@ -270,6 +274,9 @@ async def handle_send_message(user_id: str, user_name: str, user_avatar: Optiona
|
|
| 270 |
content=content,
|
| 271 |
media=media,
|
| 272 |
property_card=property_card,
|
|
|
|
|
|
|
|
|
|
| 273 |
)
|
| 274 |
|
| 275 |
# DEBUG: Log message_doc before inserting
|
|
|
|
| 238 |
content = data.get("content")
|
| 239 |
media = data.get("media")
|
| 240 |
property_card = data.get("property_card")
|
| 241 |
+
# Reply-to fields
|
| 242 |
+
replied_to_message_id = data.get("replied_to_message_id")
|
| 243 |
+
replied_to_content = data.get("replied_to_content")
|
| 244 |
+
replied_to_sender = data.get("replied_to_sender")
|
| 245 |
|
| 246 |
# Auto-detect message type based on content
|
| 247 |
if property_card:
|
|
|
|
| 274 |
content=content,
|
| 275 |
media=media,
|
| 276 |
property_card=property_card,
|
| 277 |
+
replied_to_message_id=replied_to_message_id,
|
| 278 |
+
replied_to_content=replied_to_content,
|
| 279 |
+
replied_to_sender=replied_to_sender,
|
| 280 |
)
|
| 281 |
|
| 282 |
# DEBUG: Log message_doc before inserting
|
app/schemas/conversation.py
CHANGED
|
@@ -124,6 +124,10 @@ class SendMessageDto(BaseModel):
|
|
| 124 |
content: Optional[str] = None
|
| 125 |
media_url: Optional[str] = None
|
| 126 |
property_card: Optional[PropertyCardDto] = None
|
|
|
|
|
|
|
|
|
|
|
|
|
| 127 |
|
| 128 |
|
| 129 |
class CallDto(BaseModel):
|
|
|
|
| 124 |
content: Optional[str] = None
|
| 125 |
media_url: Optional[str] = None
|
| 126 |
property_card: Optional[PropertyCardDto] = None
|
| 127 |
+
# Reply-to fields
|
| 128 |
+
replied_to_message_id: Optional[str] = None
|
| 129 |
+
replied_to_content: Optional[str] = None
|
| 130 |
+
replied_to_sender: Optional[str] = None
|
| 131 |
|
| 132 |
|
| 133 |
class CallDto(BaseModel):
|
app/services/conversation_service.py
CHANGED
|
@@ -388,6 +388,9 @@ class ConversationService:
|
|
| 388 |
content: Optional[str] = None,
|
| 389 |
media: Optional[dict] = None,
|
| 390 |
property_card: Optional[dict] = None,
|
|
|
|
|
|
|
|
|
|
| 391 |
) -> dict:
|
| 392 |
"""
|
| 393 |
Send a message in a conversation.
|
|
@@ -428,6 +431,9 @@ class ConversationService:
|
|
| 428 |
content=content,
|
| 429 |
media=media,
|
| 430 |
property_card=property_card,
|
|
|
|
|
|
|
|
|
|
| 431 |
)
|
| 432 |
|
| 433 |
result = await db.messages.insert_one(message_doc)
|
|
|
|
| 388 |
content: Optional[str] = None,
|
| 389 |
media: Optional[dict] = None,
|
| 390 |
property_card: Optional[dict] = None,
|
| 391 |
+
replied_to_message_id: Optional[str] = None,
|
| 392 |
+
replied_to_content: Optional[str] = None,
|
| 393 |
+
replied_to_sender: Optional[str] = None,
|
| 394 |
) -> dict:
|
| 395 |
"""
|
| 396 |
Send a message in a conversation.
|
|
|
|
| 431 |
content=content,
|
| 432 |
media=media,
|
| 433 |
property_card=property_card,
|
| 434 |
+
replied_to_message_id=replied_to_message_id,
|
| 435 |
+
replied_to_content=replied_to_content,
|
| 436 |
+
replied_to_sender=replied_to_sender,
|
| 437 |
)
|
| 438 |
|
| 439 |
result = await db.messages.insert_one(message_doc)
|