# api/classes.py # 班级模块接口:增、查(分页)、改、逻辑删除 from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.orm import Session from core.deps import get_current_user, require_roles from dao.classes_dao import ClassDAO from database import get_db from model.user import User from scheme.classes import ClassAdd, ClassUpdate, ClassResponse, ClassListResponse router = APIRouter() # ---------- 创建班级 ---------- @router.post("/add", response_model=ClassResponse, summary="创建班级") async def add_class( class_data: ClassAdd, db: Session = Depends(get_db), current_user: User = Depends(require_roles("admin")), ): if class_data.class_id is not None: existing = ClassDAO.inspect_class_id_unq(db, class_data.class_id) if existing: raise HTTPException(status_code=409, detail="班级ID已存在(包括软删除记录)") return ClassDAO.add_class(db, class_data) # ---------- 查询班级列表(分页) ---------- @router.get("/total_query", response_model=ClassListResponse, summary="查询班级列表(分页)") async def get_classes( skip: int = Query(0, ge=0), limit: int = Query(100, ge=1, le=200), db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): total, items = ClassDAO.get_all(db, skip=skip, limit=limit) return ClassListResponse(total=total, items=items) # ---------- 根据 ID 查询单个班级 ---------- @router.get("/single_query", response_model=ClassResponse, summary="根据ID查询班级") async def get_class( class_id: int = Query(..., ge=1), db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): db_class = ClassDAO.get_active(db, class_id) if db_class is None: raise HTTPException(status_code=404, detail="班级不存在,或已被软删除") return db_class # ---------- 更新班级 ---------- @router.put("/update", response_model=ClassResponse, summary="更新班级信息") async def update_class( class_data: ClassUpdate, class_id: int = Query(..., ge=1, description="要更新的班级ID"), db: Session = Depends(get_db), current_user: User = Depends(require_roles("admin")), ): updated = ClassDAO.update(db, class_id, class_data) if updated is None: raise HTTPException(status_code=404, detail="班级不存在,或已被软删除") return updated # ---------- 逻辑删除班级 ---------- @router.delete("/delete", status_code=204, summary="逻辑删除班级(班级下有学生时拒绝)") async def delete_class( class_id: int = Query(..., ge=1, description="要删除的班级ID"), db: Session = Depends(get_db), current_user: User = Depends(require_roles("admin")), ): result = ClassDAO.delete_light(db, class_id) if result is False: raise HTTPException(status_code=404, detail="班级不存在,或已被软删除") if result == -1: raise HTTPException(status_code=409, detail="班级下仍有学生,不能删除") return None