64 lines
1.9 KiB
Python
64 lines
1.9 KiB
Python
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 |