chat_back/app/dao/message.py
2024-08-20 15:24:17 +04:00

60 lines
2 KiB
Python

from datetime import datetime, UTC
from uuid import uuid4, UUID
from app.chat.shemas import SMessageRaw, SMessageRawList
class MessageDAO:
def __init__(self, mongo_db):
self.message = mongo_db.message
async def send_message(
self,
user_id: int,
chat_id: int,
message: str | None,
image_url: str | None,
answer_id: UUID | None = None,
answer_message: str | None = None,
answer_image_url: str | None = None,
) -> UUID:
message_id = uuid4()
await self.message.insert_one(
{
"id": str(message_id),
"message": message,
"image_url": image_url,
"chat_id": chat_id,
"user_id": user_id,
"created_at": datetime.now(UTC),
"answer_id": str(answer_id) if answer_id else None,
"answer_message": answer_message,
"answer_image_url": answer_image_url,
"visibility": True,
}
)
return message_id
async def get_message_by_id(self, message_id: UUID) -> SMessageRaw:
message = await self.message.find_one({"id": str(message_id)})
return SMessageRaw.model_validate(message)
async def delete_message(self, message_id: UUID) -> None:
await self.message.update_one({"id": str(message_id)}, {"$set": {"visibility": False}})
async def get_some_messages(self, chat_id: int, message_number_from: int, messages_to_get: int) -> SMessageRawList:
cursor = self.message.find({"visibility": True, "chat_id": chat_id})
cursor.sort("created_at").skip(message_number_from)
return SMessageRawList.model_validate({"message_raw_list": await cursor.to_list(length=messages_to_get)})
async def edit_message(self, message_id: UUID, new_message: str, new_image_url: str) -> None:
await self.message.update_one(
{"id": str(message_id)},
{"$set": {"message": new_message, "image_url": new_image_url}}
)
async def get_messages_from_ids(self, messages_ids: list[UUID]) -> SMessageRawList:
cursor = self.message.find({"visibility": True, "id": {"$in": [str(message_id) for message_id in messages_ids]}})
return SMessageRawList.model_validate({"message_raw_list": await cursor.to_list(length=None) or None})