from fastapi import APIRouter from typing import List from fastapi import APIRouter, HTTPException from app.schemas.user import ChapterRelationCreate, ChapterRelationResponse from app.services.user_service import create_chapter_relation, get_graph_relations, search_chapters, \ get_relations_to_level_simple, get_chapter_relations router = APIRouter( prefix="/chapters", tags=["Chapters"], ) @router.post("/relation/", response_model=ChapterRelationResponse) def add_chapter_relation(relation: ChapterRelationCreate): """ 创建章节之间的关系 """ return create_chapter_relation(relation) @router.get("/relations/", response_model=List[ChapterRelationResponse]) def list_chapter_relations(): """ 查询所有章节关系 """ return get_graph_relations() @router.get("/search_chapters", response_model=List[ChapterRelationResponse]) def search_chapters_endpoint(q: str): """ API 端点:根据搜索关键字模糊查询章节及其相关章节 :param q: 搜索关键字 :return: 匹配的章节关系列表 """ if not q: raise HTTPException(status_code=400, detail="搜索关键字不能为空") results = search_chapters(q) if not results: raise HTTPException(status_code=404, detail="未找到匹配的章节关系") return results @router.get("/relations/level/{level}", response_model=List[ChapterRelationResponse]) def get_relations_by_level_simple(level: int): """ 简化版:根据目标层级查询从 Root 到目标层级的所有节点和关系 :param level: 目标层级(1 -> Root & Subject, 2 -> Root, Subject, Topic, ..., 5 -> Problem) :return: 对应层级的节点和关系 """ if level < 0 or level > 5: raise HTTPException(status_code=400, detail="层级参数必须在 0 到 5 之间") try: relations = get_relations_to_level_simple(level) if not relations: raise HTTPException(status_code=404, detail="未找到相关节点关系") return relations except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) @router.get("/{chapter}/relations", response_model=List[ChapterRelationResponse]) async def get_relations_by_chapter(chapter: str): """ 根据章节名称获取该章节及其相关关系,但排除 label 为 Subject 的 next_SB 关系 :param chapter_name: 章节名称 :return: 章节关系列表 """ try: relations = get_chapter_relations(chapter) if not relations: raise HTTPException(status_code=404, detail=f"No relations found for chapter {chapter}") return relations except Exception as e: raise HTTPException(status_code=500, detail=f"Error fetching relations: {str(e)}")