from __future__ import annotations from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from sqlalchemy import func as sqlfunc from app.database import get_db from app.auth import get_current_user from app.models.faq import FaqCategory, FaqQuestion from app.schemas.faq import FaqCategorySchema, FaqCategoryResponse, FaqQuestionSchema, FaqQuestionResponse router = APIRouter(prefix="/api/faq", tags=["常见问答"], dependencies=[Depends(get_current_user)]) @router.get("/categories", response_model=list[FaqCategoryResponse]) def list_categories(db: Session = Depends(get_db)): cats = db.query(FaqCategory).order_by(FaqCategory.sort_order).all() return [FaqCategoryResponse.model_validate(c) for c in cats] @router.post("/categories", response_model=FaqCategoryResponse, status_code=201) def create_category(req: FaqCategorySchema, db: Session = Depends(get_db)): max_order = db.query(sqlfunc.max(FaqCategory.sort_order)).scalar() or 0 cat = FaqCategory(category_id=req.category_id, name=req.name, sort_order=max_order + 1) db.add(cat) db.commit() db.refresh(cat) return FaqCategoryResponse.model_validate(cat) @router.put("/categories/{cat_id}") def update_category(cat_id: int, req: FaqCategorySchema, db: Session = Depends(get_db)): cat = db.query(FaqCategory).get(cat_id) if not cat: raise HTTPException(status_code=404, detail="分类不存在") cat.category_id = req.category_id cat.name = req.name db.commit() return {"message": "更新成功"} @router.delete("/categories/{cat_id}") def delete_category(cat_id: int, db: Session = Depends(get_db)): cat = db.query(FaqCategory).get(cat_id) if not cat: raise HTTPException(status_code=404, detail="分类不存在") db.delete(cat) db.commit() return {"message": "删除成功"} @router.post("/questions", response_model=FaqQuestionResponse, status_code=201) def create_question(req: FaqQuestionSchema, category_id: int = None, db: Session = Depends(get_db)): if not category_id: raise HTTPException(status_code=400, detail="必须指定分类") max_order = db.query(sqlfunc.max(FaqQuestion.sort_order)).filter(FaqQuestion.category_id == category_id).scalar() or 0 q = FaqQuestion( category_id=category_id, question_id=req.question_id, question=req.question, answer=req.answer, related_links=[link.model_dump() for link in req.related_links], sort_order=max_order + 1, ) db.add(q) db.commit() db.refresh(q) return FaqQuestionResponse.model_validate(q) @router.put("/questions/{q_id}") def update_question(q_id: int, req: FaqQuestionSchema, db: Session = Depends(get_db)): q = db.query(FaqQuestion).get(q_id) if not q: raise HTTPException(status_code=404, detail="问题不存在") q.question_id = req.question_id q.question = req.question q.answer = req.answer q.related_links = [link.model_dump() for link in req.related_links] db.commit() return {"message": "更新成功"} @router.delete("/questions/{q_id}") def delete_question(q_id: int, db: Session = Depends(get_db)): q = db.query(FaqQuestion).get(q_id) if not q: raise HTTPException(status_code=404, detail="问题不存在") db.delete(q) db.commit() return {"message": "删除成功"}