import asyncio from pathlib import Path import aiofiles from app.core.config import settings def get_upload_path(user_id: str, doc_id: str) -> Path: """Return /data/documents/{user_id}/{doc_id}.pdf, creating the directory if needed.""" user_dir = Path(settings.DATA_DIR) / user_id user_dir.mkdir(parents=True, exist_ok=True) return user_dir / f"{doc_id}.pdf" async def save_upload(file_data: bytes, user_id: str, doc_id: str) -> Path: dest = get_upload_path(user_id, doc_id) async with aiofiles.open(dest, "wb") as f: await f.write(file_data) return dest def delete_file(file_path: str) -> None: try: Path(file_path).unlink(missing_ok=True) except OSError: pass # log but do not raise — deletion failure must not 500