from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from typing import List, Optional from database import get_db from models import Class, Teacher from schemas import ClassCreate, ClassUpdate, ClassBase router = APIRouter(prefix="/api/classes", tags=["classes"]) @router.get("/", response_model=List[ClassBase]) def list_classes(db: Session = Depends(get_db), skip: int = 0, limit: int = 100): classes = db.query(Class).filter(Class.is_deleted == False).offset(skip).limit(limit).all() return classes @router.get("/{class_id}", response_model=ClassBase) def get_class(class_id: int, db: Session = Depends(get_db)): cls = db.query(Class).filter(Class.id == class_id, Class.is_deleted == False).first() if not cls: raise HTTPException(status_code=404, detail="班级不存在") return cls @router.post("/", response_model=ClassBase) def create_class(data: ClassCreate, db: Session = Depends(get_db)): existing = db.query(Class).filter(Class.num == data.num, Class.is_deleted == False).first() if existing: raise HTTPException(status_code=400, detail="班级编号已存在") # Validate foreign keys exist if data.head_teacher_id: if not db.query(Teacher).filter(Teacher.id == data.head_teacher_id, Teacher.is_deleted == False).first(): raise HTTPException(status_code=400, detail="班主任教师不存在") if data.coach_teacher_id: if not db.query(Teacher).filter(Teacher.id == data.coach_teacher_id, Teacher.is_deleted == False).first(): raise HTTPException(status_code=400, detail="授课老师不存在") if data.tutor_teacher_id: if not db.query(Teacher).filter(Teacher.id == data.tutor_teacher_id, Teacher.is_deleted == False).first(): raise HTTPException(status_code=400, detail="助教老师不存在") cls = Class(**data.model_dump()) db.add(cls) db.commit() db.refresh(cls) return cls @router.put("/{class_id}", response_model=ClassBase) def update_class(class_id: int, data: ClassUpdate, db: Session = Depends(get_db)): cls = db.query(Class).filter(Class.id == class_id, Class.is_deleted == False).first() if not cls: raise HTTPException(status_code=404, detail="班级不存在") if data.head_teacher_id is not None: if not db.query(Teacher).filter(Teacher.id == data.head_teacher_id, Teacher.is_deleted == False).first(): raise HTTPException(status_code=400, detail="班主任教师不存在") if data.coach_teacher_id is not None: if not db.query(Teacher).filter(Teacher.id == data.coach_teacher_id, Teacher.is_deleted == False).first(): raise HTTPException(status_code=400, detail="授课老师不存在") if data.tutor_teacher_id is not None: if not db.query(Teacher).filter(Teacher.id == data.tutor_teacher_id, Teacher.is_deleted == False).first(): raise HTTPException(status_code=400, detail="助教老师不存在") for key, value in data.model_dump(exclude_unset=True).items(): setattr(cls, key, value) db.commit() db.refresh(cls) return cls @router.delete("/{class_id}") def delete_class(class_id: int, db: Session = Depends(get_db)): cls = db.query(Class).filter(Class.id == class_id, Class.is_deleted == False).first() if not cls: raise HTTPException(status_code=404, detail="班级不存在") cls.is_deleted = True db.commit() return {"message": "删除成功"}