This commit is contained in:
amb
2026-09-01 14:49:07 +08:00
parent 4db2d1a411
commit 70ece67910
8 changed files with 495 additions and 9 deletions
+104
View File
@@ -0,0 +1,104 @@
"""文档分类 API 路由。"""
from fastapi import APIRouter, Depends
from pydantic import BaseModel, Field
from sqlalchemy.orm import Session
from app.api.deps import get_current_user, get_db
from app.core.errors import NotFoundError
from app.models.document_category import DocumentCategory
from app.models.user import User
from app.repositories.kb_repo import KnowledgeBaseRepository
router = APIRouter(prefix="/knowledge-bases/{kb_id}/categories", tags=["categories"])
class CategoryRequest(BaseModel):
name: str = Field(min_length=1, max_length=255)
sort_order: int = 0
class CategoryResponse(BaseModel):
id: str
name: str
sort_order: int
model_config = {"from_attributes": True}
@router.get("", response_model=list[CategoryResponse])
def list_categories(
kb_id: str,
user: User = Depends(get_current_user),
db: Session = Depends(get_db),
) -> list[CategoryResponse]:
_check_kb_owner(kb_id, user, db)
from sqlalchemy import select
stmt = (
select(DocumentCategory)
.where(DocumentCategory.knowledge_base_id == kb_id)
.order_by(DocumentCategory.sort_order)
)
cats = list(db.scalars(stmt).all())
return [CategoryResponse.model_validate(c) for c in cats]
@router.post("", response_model=CategoryResponse, status_code=201)
def create_category(
kb_id: str,
body: CategoryRequest,
user: User = Depends(get_current_user),
db: Session = Depends(get_db),
) -> CategoryResponse:
_check_kb_owner(kb_id, user, db)
cat = DocumentCategory(
knowledge_base_id=kb_id,
name=body.name,
sort_order=body.sort_order,
)
db.add(cat)
db.commit()
db.refresh(cat)
return CategoryResponse.model_validate(cat)
@router.put("/{cat_id}", response_model=CategoryResponse)
def update_category(
kb_id: str,
cat_id: str,
body: CategoryRequest,
user: User = Depends(get_current_user),
db: Session = Depends(get_db),
) -> CategoryResponse:
_check_kb_owner(kb_id, user, db)
cat = db.get(DocumentCategory, cat_id)
if cat is None or cat.knowledge_base_id != kb_id:
raise NotFoundError("分类不存在。")
cat.name = body.name
cat.sort_order = body.sort_order
db.commit()
db.refresh(cat)
return CategoryResponse.model_validate(cat)
@router.delete("/{cat_id}", status_code=204)
def delete_category(
kb_id: str,
cat_id: str,
user: User = Depends(get_current_user),
db: Session = Depends(get_db),
) -> None:
_check_kb_owner(kb_id, user, db)
cat = db.get(DocumentCategory, cat_id)
if cat is None or cat.knowledge_base_id != kb_id:
raise NotFoundError("分类不存在。")
db.delete(cat)
db.commit()
def _check_kb_owner(kb_id: str, user: User, db: Session) -> None:
repo = KnowledgeBaseRepository(db)
kb = repo.get_by_id(kb_id)
if kb is None or kb.user_id != user.id or kb.status == "DELETED":
raise NotFoundError("知识库不存在。")