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
3.9 KiB
Folder Tree API - include_projects 参数修复
日期: 2026-02-06
类型: Bug 修复
接口: /api/v1/folders/tree
问题描述
当调用 /api/v1/folders/tree?include_projects=true 时,返回的数据中没有 projects 字段。
根本原因
- 类型不匹配:
_get_folder_projects方法接收字符串类型的folder_id,但与Project.folder_id(UUID 类型)比较时没有进行类型转换 - 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 字段,请检查:
- 服务器是否重启: 代码修改后需要重启服务器
- 参数是否正确传递: 确认 URL 中有
?include_projects=true - 权限问题: 确认用户有查看文件夹的权限
- 日志输出: 查看日志确认
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;