from fastapi import APIRouter, Depends from sqlalchemy.ext.asyncio import AsyncSession from app.auth.service import get_current_user from app.database.session import get_db from app.messages.repository import get_message_by_id from app.media.schemas import AttachmentCreateRequest, AttachmentRead, ChatAttachmentRead, UploadUrlRequest, UploadUrlResponse from app.media.service import generate_upload_url, list_attachments_for_chat, store_attachment_metadata from app.realtime.service import realtime_gateway from app.users.models import User router = APIRouter(prefix="/media", tags=["media"]) @router.post("/upload-url", response_model=UploadUrlResponse) async def create_upload_url( payload: UploadUrlRequest, _current_user: User = Depends(get_current_user), ) -> UploadUrlResponse: return await generate_upload_url(payload) @router.post("/attachments", response_model=AttachmentRead) async def create_attachment_metadata( payload: AttachmentCreateRequest, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ) -> AttachmentRead: attachment = await store_attachment_metadata(db, user_id=current_user.id, payload=payload) message = await get_message_by_id(db, attachment.message_id) if message: await realtime_gateway.publish_chat_updated(chat_id=message.chat_id) return attachment @router.get("/chats/{chat_id}/attachments", response_model=list[ChatAttachmentRead]) async def list_chat_attachments_endpoint( chat_id: int, limit: int = 100, before_id: int | None = None, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ) -> list[ChatAttachmentRead]: return await list_attachments_for_chat( db, user_id=current_user.id, chat_id=chat_id, limit=limit, before_id=before_id, )