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.
 

3.9 KiB

Folder Tree API - include_projects 参数修复

日期: 2026-02-06
类型: Bug 修复
接口: /api/v1/folders/tree

问题描述

当调用 /api/v1/folders/tree?include_projects=true 时,返回的数据中没有 projects 字段。

根本原因

  1. 类型不匹配: _get_folder_projects 方法接收字符串类型的 folder_id,但与 Project.folder_id(UUID 类型)比较时没有进行类型转换
  2. ID 序列化问题: 树节点中的 id 字段使用 UUID 对象,而不是字符串,可能导致序列化不一致

修复内容

1. 修复类型转换 (folder_repository.py)

async def _get_folder_projects(self, folder_id: str) -> List[Dict[str, Any]]:
    from uuid import UUID
    
    # 转换为 UUID 类型以匹配数据库字段
    folder_uuid = UUID(folder_id) if isinstance(folder_id, str) else folder_id
    
    statement = select(Project).where(
        Project.folder_id == folder_uuid,  # 使用 UUID 类型
        Project.deleted_at.is_(None)
    ).order_by(Project.updated_at.desc())
    ...

2. 统一 ID 类型处理

for folder in folders:
    folder_id_str = str(folder.id)  # 统一转换为字符串
    
    node = {
        "id": folder_id_str,  # 使用字符串类型
        ...
    }
    
    if include_projects:
        node["projects"] = await self._get_folder_projects(folder_id_str)

3. 添加调试日志

在关键位置添加日志,便于追踪问题:

  • Service 层:记录 include_projects 参数值
  • Repository 层:记录查询到的项目数量

测试方法

1. 重启服务器

cd server
# 如果使用 uvicorn
uvicorn app.main:app --reload

# 或者如果使用 docker
docker-compose restart server

2. 测试不包含项目

curl -X GET "http://localhost:8000/api/v1/folders/tree" \
  -H "Authorization: Bearer YOUR_TOKEN"

预期返回(无 projects 字段):

{
  "success": true,
  "data": {
    "tree": [
      {
        "id": "...",
        "name": "文件夹名称",
        "projectCount": 0,
        "children": []
      }
    ]
  }
}

3. 测试包含项目

curl -X GET "http://localhost:8000/api/v1/folders/tree?include_projects=true" \
  -H "Authorization: Bearer YOUR_TOKEN"

预期返回(有 projects 字段,即使为空数组):

{
  "success": true,
  "data": {
    "tree": [
      {
        "id": "...",
        "name": "文件夹名称",
        "projectCount": 0,
        "projects": [],
        "children": []
      }
    ]
  }
}

4. 验证日志

检查服务器日志:

tail -f server/logs/app.log

应该看到类似输出:

Getting folder tree for user xxx, include_projects=True
include_projects=True, fetching projects for folder xxx
Found 0 projects in folder xxx
Added 0 projects to folder 文件夹名称

相关文件

  • server/app/api/v1/folders.py - API 路由层
  • server/app/services/folder_service.py - 业务逻辑层
  • server/app/repositories/folder_repository.py - 数据访问层

下一步

如果修复后仍然没有 projects 字段,请检查:

  1. 服务器是否重启: 代码修改后需要重启服务器
  2. 参数是否正确传递: 确认 URL 中有 ?include_projects=true
  3. 权限问题: 确认用户有查看文件夹的权限
  4. 日志输出: 查看日志确认 include_projects 的值

数据库测试查询

手动验证项目数据:

-- 查询文件夹
SELECT id, name, owner_id FROM folders WHERE deleted_at IS NULL;

-- 查询项目
SELECT id, name, folder_id FROM projects WHERE deleted_at IS NULL;

-- 查询文件夹与项目的关联
SELECT 
    f.id as folder_id,
    f.name as folder_name,
    COUNT(p.id) as project_count
FROM folders f
LEFT JOIN projects p ON p.folder_id = f.id AND p.deleted_at IS NULL
WHERE f.deleted_at IS NULL
GROUP BY f.id, f.name;