Add func delete message

This commit is contained in:
2026-01-26 11:47:17 +03:00
parent 8ae1ef6040
commit 1dce2c7b0c
6 changed files with 112 additions and 20 deletions
+4
View File
@@ -35,6 +35,10 @@ async def send_message(message: MessageCreate, user: UserModel = Depends(get_cur
async def edit_message(message_update: MessageUpdate, user: UserModel = Depends(get_current_verified_user)) -> Message:
return await ChatService.update_message(user, message_update)
@router.delete("/message")
async def delete_message(message_id: uuid.UUID, user: UserModel = Depends(get_current_verified_user)):
await ChatService.delete_message(user, message_id)
return {"status": True, "message": "Message successfully deleted"}
@router.websocket("/ws")
async def websocket_endpoint(ws: WebSocket, user: UserModel = Depends(get_current_verified_user)):
+51 -4
View File
@@ -147,26 +147,41 @@ class ChatService:
for user_id in user_ids:
payload = {
"user_id": str(user_id),
"type": "send",
"data": message.model_dump(mode='json')
}
await redis_client.publish("messenger_updates", json.dumps(payload))
log.debug(f"Published message for user_id: {user_id}")
@classmethod
async def _delete_ws_message(cls, user_ids: List[int], message_id: uuid.UUID):
redis_client = await get_redis()
for user_id in user_ids:
payload = {
"user_id": str(user_id),
"type": "del",
"data": str(message_id)
}
await redis_client.publish("messenger_updates", json.dumps(payload))
log.debug(f"Published message for user_id: {user_id}")
@classmethod
async def update_message(cls, user: UserModel, message_update: MessageUpdate) -> Message:
async with async_session_maker() as session:
message_exist = await MessageDAO.find_one_or_none(
session,
and_(
MessageModel.id==message_update.id,
MessageModel.sender_id==user.id
)
MessageModel.id==message_update.id
)
if message_exist is None:
log.warning("Message not found", extra={"user_id": user.id, "message_id": message_update.id})
raise HTTPException(status.HTTP_404_NOT_FOUND, detail="Message not found")
if message_exist.sender_id != user.id:
log.warning("User does not have access to this message",
extra={"user_id": user.id, "message_id": message_update.id})
raise HTTPException(status.HTTP_403_FORBIDDEN, detail="Message not allowed")
message_update_db = await MessageDAO.update(
@@ -192,3 +207,35 @@ class ChatService:
await session.commit()
log.info("Message update successfully", extra={"user_id": user.id, "message_id": message_update.id})
return message_update_db
@classmethod
async def delete_message(cls, user: UserModel, message_id: uuid.UUID):
async with async_session_maker() as session:
message_exist = await MessageDAO.find_one_or_none(
session,
MessageModel.id==message_id,
)
if message_exist is None:
log.warning("Message not found", extra={"user_id": user.id, "message_id": message_id})
raise HTTPException(status.HTTP_404_NOT_FOUND, detail="Message not found")
if message_exist.sender_id != user.id:
log.warning("User does not have access to this message",
extra={"user_id": user.id, "message_id": message_id})
raise HTTPException(status.HTTP_403_FORBIDDEN, detail="Message not allowed")
members = await ParticipantDAO.find_all(
session,
None,
None,
ParticipantModel.chat_id==message_exist.chat_id
)
member_ids = [member.user_id for member in members]
await MessageDAO.delete(session, MessageModel.id==message_id)
await cls._delete_ws_message(member_ids, message_id)
await session.commit()
log.info("Message delete successfully", extra={"user_id": user.id, "message_id": message_exist.id})