49 lines
1.7 KiB
Python
49 lines
1.7 KiB
Python
"""Репозиторий доступа к сообщениям чата (`chat_messages`)."""
|
||
|
||
import uuid
|
||
|
||
from sqlalchemy import select
|
||
from sqlalchemy.ext.asyncio import AsyncSession
|
||
|
||
from models.chat import ChatMessage
|
||
|
||
|
||
class ChatMessageRepository:
|
||
"""Инкапсулирует SQL-запросы к сообщениям чата конкретной сессии конференции."""
|
||
|
||
def __init__(self, session: AsyncSession) -> None:
|
||
self._session = session
|
||
|
||
async def add(
|
||
self,
|
||
*,
|
||
session_id: uuid.UUID,
|
||
user_id: uuid.UUID | None,
|
||
guest_access_id: uuid.UUID | None,
|
||
author_name: str,
|
||
text: str,
|
||
) -> ChatMessage:
|
||
"""Добавить сообщение чата и вернуть строку с проставленными `id`/`created_at`."""
|
||
message = ChatMessage(
|
||
session_id=session_id,
|
||
user_id=user_id,
|
||
guest_access_id=guest_access_id,
|
||
author_name=author_name,
|
||
text=text,
|
||
)
|
||
self._session.add(message)
|
||
await self._session.flush()
|
||
return message
|
||
|
||
async def last_for_session(self, session_id: uuid.UUID, *, limit: int) -> list[ChatMessage]:
|
||
"""Последние `limit` сообщений сессии в хронологическом порядке (от старых к новым)."""
|
||
result = await self._session.execute(
|
||
select(ChatMessage)
|
||
.where(ChatMessage.session_id == session_id)
|
||
.order_by(ChatMessage.created_at.desc())
|
||
.limit(limit)
|
||
)
|
||
rows = list(result.scalars().all())
|
||
rows.reverse()
|
||
return rows
|