from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.dependencies import get_db, get_current_user from app.models.user import User from app.models.project import Project from app.models.generation_record import GenerationRecord from app.schemas.project import ProjectCreate, ProjectOut from app.utils.id_gen import generate_id router = APIRouter(prefix="/projects", tags=["projects"]) @router.get("", response_model=list[ProjectOut]) async def list_projects( current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): result = await db.execute( select(Project) .where(Project.user_id == current_user.id) .order_by(Project.created_at.desc()) ) return result.scalars().all() @router.post("", response_model=ProjectOut) async def create_project( req: ProjectCreate, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): project = Project( id=generate_id(), user_id=current_user.id, name=req.name, industry=req.industry, ) db.add(project) await db.flush() return project @router.delete("/{project_id}") async def delete_project( project_id: str, current_user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): result = await db.execute( select(Project).where( Project.id == project_id, Project.user_id == current_user.id, ) ) project = result.scalar_one_or_none() if not project: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="项目不存在") # Cascade delete generation records from sqlalchemy import delete await db.execute( delete(GenerationRecord).where(GenerationRecord.project_id == project_id) ) await db.delete(project) await db.flush() return {"message": "ok"}