feat(realtime): sync message edits and deletes instantly
This commit is contained in:
@@ -77,7 +77,9 @@ async def edit_message(
|
||||
db: AsyncSession = Depends(get_db),
|
||||
current_user: User = Depends(get_current_user),
|
||||
) -> MessageRead:
|
||||
return await update_message(db, message_id=message_id, user_id=current_user.id, payload=payload)
|
||||
message = await update_message(db, message_id=message_id, user_id=current_user.id, payload=payload)
|
||||
await realtime_gateway.publish_message_updated(message=message)
|
||||
return message
|
||||
|
||||
|
||||
@router.delete("/{message_id}", status_code=status.HTTP_204_NO_CONTENT)
|
||||
@@ -91,6 +93,7 @@ async def remove_message(
|
||||
message = await get_message_by_id(db, message_id)
|
||||
await delete_message_for_all(db, message_id=message_id, user_id=current_user.id)
|
||||
if message:
|
||||
await realtime_gateway.publish_message_deleted(chat_id=message.chat_id, message_id=message_id)
|
||||
await realtime_gateway.publish_chat_updated(chat_id=message.chat_id)
|
||||
return
|
||||
await delete_message(db, message_id=message_id, user_id=current_user.id)
|
||||
|
||||
@@ -11,6 +11,8 @@ RealtimeEventName = Literal[
|
||||
"disconnect",
|
||||
"send_message",
|
||||
"receive_message",
|
||||
"message_updated",
|
||||
"message_deleted",
|
||||
"typing_start",
|
||||
"typing_stop",
|
||||
"message_read",
|
||||
|
||||
@@ -208,6 +208,27 @@ class RealtimeGateway:
|
||||
},
|
||||
)
|
||||
|
||||
async def publish_message_updated(self, *, message) -> None:
|
||||
message_data = MessageRead.model_validate(message).model_dump(mode="json")
|
||||
await self._publish_chat_event(
|
||||
message.chat_id,
|
||||
event="message_updated",
|
||||
payload={
|
||||
"chat_id": message.chat_id,
|
||||
"message": message_data,
|
||||
},
|
||||
)
|
||||
|
||||
async def publish_message_deleted(self, *, chat_id: int, message_id: int) -> None:
|
||||
await self._publish_chat_event(
|
||||
chat_id,
|
||||
event="message_deleted",
|
||||
payload={
|
||||
"chat_id": chat_id,
|
||||
"message_id": message_id,
|
||||
},
|
||||
)
|
||||
|
||||
async def _send_user_event(self, user_id: int, event: OutgoingRealtimeEvent) -> None:
|
||||
user_connections = self._connections.get(user_id, {})
|
||||
if not user_connections:
|
||||
|
||||
Reference in New Issue
Block a user