from typing import List from fastapi import APIRouter, Depends, File, UploadFile, status from fastapi.responses import FileResponse from app.database import get_database from app.models.todo import Attachment from app.services.file_service import FileService router = APIRouter(prefix="/api/todos", tags=["attachments"]) def _get_service(db=Depends(get_database)) -> FileService: return FileService(db) @router.post( "/{todo_id}/attachments", response_model=list[Attachment], status_code=status.HTTP_201_CREATED, ) async def upload_attachments( todo_id: str, files: List[UploadFile] = File(...), service: FileService = Depends(_get_service), ): """파일 업로드 (최대 5개, 파일당 10MB)""" return await service.upload_files(todo_id, files) @router.get("/{todo_id}/attachments/{attachment_id}/download") async def download_attachment( todo_id: str, attachment_id: str, service: FileService = Depends(_get_service), ): """파일 다운로드""" file_path, filename = await service.get_file_info(todo_id, attachment_id) return FileResponse( path=str(file_path), filename=filename, media_type="application/octet-stream", ) @router.delete( "/{todo_id}/attachments/{attachment_id}", status_code=status.HTTP_204_NO_CONTENT, ) async def delete_attachment( todo_id: str, attachment_id: str, service: FileService = Depends(_get_service), ): """첨부파일 삭제""" await service.delete_attachment(todo_id, attachment_id)