import uuid from fastapi import FastAPI, HTTPException, Depends from sqlalchemy.orm import Session from .database import engine, Base, get_db from .models import Project, Markdown from .s3 import upload_to_s3, delete_from_s3 # 启动时创建表 Base.metadata.create_all(bind=engine) app = FastAPI(title="AI Notion Backend") @app.get("/health") def health(): return {"status": "ok"} # --- Project 接口 --- @app.post("/projects") def create_project(name: str, db: Session = Depends(get_db)): project = Project(name=name) db.add(project) db.commit() db.refresh(project) return project @app.delete("/projects/{project_id}") def delete_project(project_id: str, db: Session = Depends(get_db)): project = db.query(Project).filter(Project.id == project_id).first() if not project: raise HTTPException(status_code=404, detail="Project not found") # 1. 获取该项目下所有 Markdown 的 S3 keys 并从 S3 删除 s3_keys = [md.s3_key for md in project.markdowns] delete_from_s3(s3_keys) # 2. 从数据库删除项目(SQLAlchemy 会自动级联删除对应的 Markdown 记录) db.delete(project) db.commit() return {"message": f"Project {project_id} and associated files purged."} # --- Markdown 接口 --- @app.post("/projects/{project_id}/markdowns") def upload_markdown(project_id: str, title: str, content: str, db: Session = Depends(get_db)): # 验证项目是否存在 project = db.query(Project).filter(Project.id == project_id).first() if not project: raise HTTPException(status_code=404, detail="Project not found") # 生成 S3 路径 s3_key = f"projects/{project_id}/{uuid.uuid4()}.md" # 1. 业务逻辑分离:上传 S3 upload_to_s3(s3_key, content) # 2. 存入数据库记录 md_record = Markdown(title=title, s3_key=s3_key, project_id=project_id) db.add(md_record) db.commit() db.refresh(md_record) return md_record