ForcePilot/backend/server/routers/filesystem_router.py
Wenjie Zhang e4ae12dc75 refactor: 重构并清理多个模块的测试
- 移除了文件系统和沙盒路由器的过时集成测试。
- 更新了文件系统路由器测试,确保正确的身份验证和线程所有权检查。
- 调整了沙盒端到端测试,以改进附件处理和命令执行。
- 修改了设置路由器测试,对未授权访问返回404而不是401/403。
- 增强了任务路由器测试,以处理精简模式场景并确保任务创建和查询按预期工作。
- 优化了查看器文件系统测试,使用附件上传代替直接文件写入。
- 改进了技能后端测试中的错误处理,为越界访问引发适当的异常。
2026-03-25 06:32:14 +08:00

78 lines
2.5 KiB
Python

"""Viewer 文件系统路由
提供 Viewer UI 使用的只读文件系统 API 端点。
- /viewer/filesystem/* - Viewer UI 使用 (readonly backend)
"""
from __future__ import annotations
from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession
from server.utils.auth_middleware import get_db, get_required_user
from yuxi.services.viewer_filesystem_service import (
download_viewer_file,
list_viewer_filesystem_tree,
read_viewer_file_content,
)
from yuxi.storage.postgres.models_business import User
filesystem_router = APIRouter(prefix="/viewer/filesystem", tags=["viewer-filesystem"])
@filesystem_router.get("/tree", response_model=dict)
async def get_viewer_tree(
thread_id: str = Query(..., description="线程 ID"),
path: str = Query("/", description="目录路径"),
agent_id: str | None = Query(None, description="智能体 ID"),
agent_config_id: int | None = Query(None, description="智能体配置 ID"),
current_user: User = Depends(get_required_user),
db: AsyncSession = Depends(get_db),
):
return await list_viewer_filesystem_tree(
thread_id=thread_id,
path=path,
agent_id=agent_id,
agent_config_id=agent_config_id,
current_user=current_user,
db=db,
)
@filesystem_router.get("/file", response_model=dict)
async def get_viewer_file(
thread_id: str = Query(..., description="线程 ID"),
path: str = Query(..., description="文件路径"),
agent_id: str | None = Query(None, description="智能体 ID"),
agent_config_id: int | None = Query(None, description="智能体配置 ID"),
current_user: User = Depends(get_required_user),
db: AsyncSession = Depends(get_db),
):
return await read_viewer_file_content(
thread_id=thread_id,
path=path,
agent_id=agent_id,
agent_config_id=agent_config_id,
current_user=current_user,
db=db,
)
@filesystem_router.get("/download")
async def download_viewer(
thread_id: str = Query(..., description="线程 ID"),
path: str = Query(..., description="文件路径"),
agent_id: str | None = Query(None, description="智能体 ID"),
agent_config_id: int | None = Query(None, description="智能体配置 ID"),
current_user: User = Depends(get_required_user),
db: AsyncSession = Depends(get_db),
):
return await download_viewer_file(
thread_id=thread_id,
path=path,
agent_id=agent_id,
agent_config_id=agent_config_id,
current_user=current_user,
db=db,
)