fix: 修复 projects 500 + 实现 dashboard/overview 端点 #112
Reference in New Issue
Block a user
Delete Branch "fix/projects-500-and-dashboard"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
修复内容
Bug 1: GET /api/v1/projects → 500
_to_project_response()缺少owner_user_id和shared_users字段ProjectResponseschema 要求owner_user_id为必填,Pydantic 响应校验失败导致 500Bug 2: GET /api/v1/dashboard/overview → 404
apps/api/app/api/routes/dashboard.py+apps/api/app/schemas/dashboard.pycount_by_user(generation_task)、count_by_project_ids/sum_storage_by_project_ids(asset)/api/v1/dashboard改动文件
apps/api/app/api/routes/projects.py— 补全 _to_project_response 字段apps/api/app/api/routes/dashboard.py— 新建apps/api/app/schemas/dashboard.py— 新建apps/api/app/api/router.py— 注册 dashboard 路由packages/ports/generation_task_repository.py— 新增 count_by_userpackages/adapters/sqlalchemy_impl/generation_task_repository.py— 实现 count_by_userpackages/ports/asset_repository.py— 新增 count_by_project_ids / sum_storage_by_project_idspackages/adapters/sqlalchemy_impl/asset_repository.py— 实现新增方法@代码审计 请审查此 PR,修复了 2 个线上 bug:
✅ 代码审查通过 — PR #112
文件: 8 个 | 改动: +148/-0 | Head SHA:
e7230258审查结果:通过
两个线上 Bug 均已正确修复。
Bug 1 修复:
_to_project_response缺少必填字段 ✅根因:
ProjectResponseschema 要求owner_user_id: str(无默认值),但旧代码只传了id/name/description,导致 Pydantic 校验失败 → 500。修复验证:
owner_user_id=item.owner_user_idshared_users=item.shared_usersProject域对象确认有这两个属性_to_project_response函数Bug 2 修复:Dashboard
/overview端点实现 ✅新增文件审查:
routes/dashboard.pyschemas/dashboard.pyDashboardOverviewResponse+RecentTaskItemrouter.pydashboard_router,prefix=/dashboard数据流验证:
find_accessible_projects(user_id)→ 获取用户所有可访问项目(含共享)count_by_project_ids([])/sum_storage_by_project_ids([])→ 空列表安全返回 0count_by_user(user_id)→ 使用高效 SQL COUNTlist_by_user(user_id)[:5]→ 取最近 5 条任务_generation_step()将英文状态映射为中文描述仓储方法验证(端口+适配器):
generation_task_repository.count_by_user— 已存在asset_repository.count_by_project_ids— 已存在,空列表保护 ✅asset_repository.sum_storage_by_project_ids— 已存在,空列表保护 ✅title_library_repository.count_by_user— 已存在voice_library_repository.count_by_user— 已存在project_repository.find_accessible_projects— 已存在P2 建议(不阻塞合并)
性能优化:
list_by_user(user_id)[:5]从数据库加载全部任务后在 Python 层截取。建议后续给list_by_user加limit参数,用 SQL LIMIT 更高效。当前不影响功能。subscription 字段:原始需求提到
subscription字段,当前 schema 未包含。如果前端从独立端点获取订阅信息则无问题;若前端期望此字段,后续需补充。结论
修复正确、完整,代码遵循现有架构模式,可合并。
@代码审计 P2 建议已修复,请复审:
list_by_user[:5]→list_recent_by_user(user_id, limit=5)SQL 层 LIMITSubscriptionInfo+subscription字段(plan + is_active)✅ 复审通过 — PR #112(P2 修复)
Head SHA:
e7230258→d2578a90| +175/-0(+27 行 P2 修复)P2-1:SQL LIMIT 优化 ✅
list_recent_by_user(user_id, limit=5).order_by(created_at.desc()).limit(limit).all()list_by_user(user_id)[:5]→list_recent_by_user(user_id, limit=5)P2-2:subscription 字段 ✅
SubscriptionInfo(plan="free", is_active=False)DashboardOverviewResponse新增subscription字段default_factory=SubscriptionInfogetattr(user, "subscription_plan", "free")安全取值结论
两个 P2 建议均已正确修复,可合并。