68 lines
2.3 KiB
Python
68 lines
2.3 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}})
|
|
await self.message.update_many(
|
|
{"answer_id": str(message_id)},
|
|
{"$set": {"answer_message": None, "answer_image_url": None}}
|
|
)
|
|
|
|
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}}
|
|
)
|
|
await self.message.update_many(
|
|
{"answer_id": str(message_id)},
|
|
{"$set": {"answer_message": new_message, "answer_image_url": new_image_url}}
|
|
)
|
|
|
|
async def get_messages_by_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})
|
|
|
|
|