You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
3.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from fastapi import APIRouter
from typing import List
from fastapi import APIRouter, HTTPException
# from app.routers import get_cached_data
from app.schemas.user import ChapterRelationCreate, ChapterRelationResponse
from app.services.user_service import get_graph_relations, search_chapters, \
get_relations_to_level_simple, get_chapter_relations
router = APIRouter(
prefix="/chapters",
tags=["Chapters"],
)
@router.get("/relations/", response_model=List[ChapterRelationResponse])
async def list_chapter_relations():
# cache_key = "all_chapter_relations"
# cached_data = get_cached_data(cache_key) # 从缓存获取
# if cached_data:
# return [ChapterRelationResponse(**data) for data in cached_data] # 缓存命中,返回数据
"""
查询所有章节关系
"""
return await get_graph_relations()
@router.get("/search_chapters", response_model=List[ChapterRelationResponse])
async def search_chapters_endpoint(q: str):
"""
API 端点:根据搜索关键字模糊查询章节及其相关章节
:param q: 搜索关键字
:return: 匹配的章节关系列表
"""
# cache_key = f"search_chapters:{q}"
# # 尝试从缓存中获取数据
# cached_data = get_cached_data(cache_key)
# if cached_data:
# # 如果缓存命中,直接返回缓存中的数据
# return [ChapterRelationResponse(**data) for data in cached_data]
if not q:
raise HTTPException(status_code=400, detail="搜索关键字不能为空")
results = await search_chapters(q)
if not results:
raise HTTPException(status_code=404, detail="未找到匹配的章节关系")
return results
@router.get("/relations/level/{level}", response_model=List[ChapterRelationResponse])
async def get_relations_by_level_simple(level: int):
"""
简化版:根据目标层级查询从 Root 到目标层级的所有节点和关系
:param level: 目标层级1 -> Root & Subject, 2 -> Root, Subject, Topic, ..., 5 -> Problem
:return: 对应层级的节点和关系
"""
# cache_key = f"level_{level}_relations"
# cached_data = get_cached_data(cache_key) # 从缓存获取
# if cached_data:
# return [ChapterRelationResponse(**data) for data in cached_data] # 缓存命中,返回数据
if level < 0 or level > 5:
raise HTTPException(status_code=400, detail="层级参数必须在 0 到 5 之间")
try:
relations = await 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: 章节关系列表
"""
# cache_key = f"chapter_relations:{chapter}" # 不使用分页,直接根据章节名称生成缓存键
# cached_data = get_cached_data(cache_key) # 从缓存中获取数据
# if cached_data:
# return [ChapterRelationResponse(**data) for data in cached_data] # 如果缓存命中,直接返回缓存数据
relations = await get_chapter_relations(chapter)
if not relations:
raise HTTPException(status_code=404, detail=f"No relations found for chapter {chapter}")
return relations