first commit
This commit is contained in:
48
backend/repositories/chat.py
Normal file
48
backend/repositories/chat.py
Normal file
@@ -0,0 +1,48 @@
|
||||
"""Репозиторий доступа к сообщениям чата (`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
|
||||
Reference in New Issue
Block a user