from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.media.models import Attachment from app.messages.models import Message async def create_attachment( db: AsyncSession, *, message_id: int, file_url: str, file_type: str, file_size: int, ) -> Attachment: attachment = Attachment( message_id=message_id, file_url=file_url, file_type=file_type, file_size=file_size, ) db.add(attachment) await db.flush() return attachment async def get_attachment_by_id(db: AsyncSession, attachment_id: int) -> Attachment | None: return await db.get(Attachment, attachment_id) async def list_chat_attachments( db: AsyncSession, *, chat_id: int, limit: int = 100, before_id: int | None = None, ) -> list[tuple[Attachment, Message]]: stmt = ( select(Attachment, Message) .join(Message, Message.id == Attachment.message_id) .where(Message.chat_id == chat_id) .order_by(Attachment.id.desc()) .limit(limit) ) if before_id is not None: stmt = stmt.where(Attachment.id < before_id) result = await db.execute(stmt) return [(row[0], row[1]) for row in result.all()]