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", -1).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})