91 行
3.3 KiB
Python
91 行
3.3 KiB
Python
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": "删除成功"}
|