from typing import Optional from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.orm import Session from database import get_db from models.essay import EssayGrade from models.user import User from schemas.essay import EssayGradeCreate, EssayGradeOut from services.auth import get_current_user from services.ai_service import AIService from services.credits import spend_credits router = APIRouter(prefix="/api/essay-grades", tags=["作文批改"]) ai_service = AIService() @router.post("/", response_model=EssayGradeOut, status_code=201) async def create_essay_grade( data: EssayGradeCreate, current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): """Submit an essay for AI grading; the result is persisted automatically.""" account = spend_credits(db, current_user, "essay_grade", f"作文批改:{data.title[:40]}") db.commit() result = await ai_service.grade_essay( essay_text=data.essay_text, grade_level=data.grade_level, essay_type=data.essay_type, total_score=data.total_score, ) item = EssayGrade( user_id=current_user.id, title=data.title, essay_text=data.essay_text, grade_level=data.grade_level, essay_type=data.essay_type, total_score=data.total_score, result=result, ) db.add(item) db.commit() db.refresh(item) return item @router.get("/", response_model=list[EssayGradeOut]) def list_essay_grades( keyword: Optional[str] = None, skip: int = Query(0, ge=0), limit: int = Query(20, ge=1, le=100), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): query = db.query(EssayGrade).filter(EssayGrade.user_id == current_user.id) if keyword: query = query.filter(EssayGrade.title.contains(keyword)) return query.order_by(EssayGrade.updated_at.desc()).offset(skip).limit(limit).all() @router.get("/{grade_id}", response_model=EssayGradeOut) def get_essay_grade( grade_id: int, current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): item = db.query(EssayGrade).filter(EssayGrade.id == grade_id, EssayGrade.user_id == current_user.id).first() if not item: raise HTTPException(status_code=404, detail="批改记录不存在") return item @router.delete("/{grade_id}", status_code=204) def delete_essay_grade( grade_id: int, current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): item = db.query(EssayGrade).filter(EssayGrade.id == grade_id, EssayGrade.user_id == current_user.id).first() if not item: raise HTTPException(status_code=404, detail="批改记录不存在") db.delete(item) db.commit() return None