fix: 修复 projects 500 + 实现 dashboard/overview 端点 #112

Merged
xiaoxia merged 2 commits from fix/projects-500-and-dashboard into develop 2026-06-29 18:35:45 +08:00
Owner

修复内容

Bug 1: GET /api/v1/projects → 500

  • _to_project_response() 缺少 owner_user_idshared_users 字段
  • ProjectResponse schema 要求 owner_user_id 为必填,Pydantic 响应校验失败导致 500
  • 修复:补全缺失字段

Bug 2: GET /api/v1/dashboard/overview → 404

  • Dashboard 页面调用此端点,后端未实现
  • 新建 apps/api/app/api/routes/dashboard.py + apps/api/app/schemas/dashboard.py
  • 添加仓储方法:count_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_user
  • packages/adapters/sqlalchemy_impl/generation_task_repository.py — 实现 count_by_user
  • packages/ports/asset_repository.py — 新增 count_by_project_ids / sum_storage_by_project_ids
  • packages/adapters/sqlalchemy_impl/asset_repository.py — 实现新增方法
## 修复内容 ### Bug 1: GET /api/v1/projects → 500 - `_to_project_response()` 缺少 `owner_user_id` 和 `shared_users` 字段 - `ProjectResponse` schema 要求 `owner_user_id` 为必填,Pydantic 响应校验失败导致 500 - 修复:补全缺失字段 ### Bug 2: GET /api/v1/dashboard/overview → 404 - Dashboard 页面调用此端点,后端未实现 - 新建 `apps/api/app/api/routes/dashboard.py` + `apps/api/app/schemas/dashboard.py` - 添加仓储方法:`count_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_user - `packages/adapters/sqlalchemy_impl/generation_task_repository.py` — 实现 count_by_user - `packages/ports/asset_repository.py` — 新增 count_by_project_ids / sum_storage_by_project_ids - `packages/adapters/sqlalchemy_impl/asset_repository.py` — 实现新增方法
xiaoxia added 1 commit 2026-06-29 18:12:54 +08:00
fix: 修复 projects 500 + 实现 dashboard/overview 端点
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Has been cancelled
CI/CD Pipeline / Frontend Lint (pull_request) Has been cancelled
e723025889
Bug 1: GET /api/v1/projects → 500
- _to_project_response() 缺少 owner_user_id 和 shared_users 字段
- 补全 ProjectResponse schema 必填字段

Bug 2: GET /api/v1/dashboard/overview → 404
- 新建 dashboard schema + route
- 添加 count_by_user / count_by_project_ids / sum_storage_by_project_ids 仓储方法
- 注册 /api/v1/dashboard 路由
Author
Owner

@代码审计 请审查此 PR,修复了 2 个线上 bug:

  1. GET /api/v1/projects → 500(_to_project_response 缺少必填字段)
  2. GET /api/v1/dashboard/overview → 404(端点未实现)
@代码审计 请审查此 PR,修复了 2 个线上 bug: 1. GET /api/v1/projects → 500(_to_project_response 缺少必填字段) 2. GET /api/v1/dashboard/overview → 404(端点未实现)
Author
Owner

代码审查通过 — PR #112

文件: 8 个 | 改动: +148/-0 | Head SHA: e7230258


审查结果:通过

两个线上 Bug 均已正确修复。

Bug 1 修复:_to_project_response 缺少必填字段

根因: ProjectResponse schema 要求 owner_user_id: str(无默认值),但旧代码只传了 id/name/description,导致 Pydantic 校验失败 → 500。

修复验证:

  • 补全 owner_user_id=item.owner_user_id
  • 补全 shared_users=item.shared_users
  • Project 域对象确认有这两个属性
  • 修复最小化,仅改动 _to_project_response 函数

Bug 2 修复:Dashboard /overview 端点实现

新增文件审查:

文件 状态
routes/dashboard.py 新建,GET /overview,需认证
schemas/dashboard.py DashboardOverviewResponse + RecentTaskItem
router.py 注册 dashboard_router,prefix=/dashboard

数据流验证:

  • find_accessible_projects(user_id) → 获取用户所有可访问项目(含共享)
  • count_by_project_ids([]) / sum_storage_by_project_ids([]) → 空列表安全返回 0
  • count_by_user(user_id) → 使用高效 SQL COUNT
  • list_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 建议(不阻塞合并)

  1. 性能优化list_by_user(user_id)[:5] 从数据库加载全部任务后在 Python 层截取。建议后续给 list_by_userlimit 参数,用 SQL LIMIT 更高效。当前不影响功能。

  2. subscription 字段:原始需求提到 subscription 字段,当前 schema 未包含。如果前端从独立端点获取订阅信息则无问题;若前端期望此字段,后续需补充。

结论

修复正确、完整,代码遵循现有架构模式,可合并。

## ✅ 代码审查通过 — PR #112 **文件:** 8 个 | **改动:** +148/-0 | **Head SHA:** `e7230258` --- ### 审查结果:通过 两个线上 Bug 均已正确修复。 ### Bug 1 修复:`_to_project_response` 缺少必填字段 ✅ **根因:** `ProjectResponse` schema 要求 `owner_user_id: str`(无默认值),但旧代码只传了 `id/name/description`,导致 Pydantic 校验失败 → 500。 **修复验证:** - ✅ 补全 `owner_user_id=item.owner_user_id` - ✅ 补全 `shared_users=item.shared_users` - ✅ `Project` 域对象确认有这两个属性 - ✅ 修复最小化,仅改动 `_to_project_response` 函数 ### Bug 2 修复:Dashboard `/overview` 端点实现 ✅ **新增文件审查:** | 文件 | 状态 | |------|------| | `routes/dashboard.py` | ✅ 新建,GET /overview,需认证 | | `schemas/dashboard.py` | ✅ `DashboardOverviewResponse` + `RecentTaskItem` | | `router.py` | ✅ 注册 `dashboard_router`,prefix=`/dashboard` | **数据流验证:** - ✅ `find_accessible_projects(user_id)` → 获取用户所有可访问项目(含共享) - ✅ `count_by_project_ids([])` / `sum_storage_by_project_ids([])` → 空列表安全返回 0 - ✅ `count_by_user(user_id)` → 使用高效 SQL COUNT - ✅ `list_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 建议(不阻塞合并) 1. **性能优化**:`list_by_user(user_id)[:5]` 从数据库加载全部任务后在 Python 层截取。建议后续给 `list_by_user` 加 `limit` 参数,用 SQL LIMIT 更高效。当前不影响功能。 2. **subscription 字段**:原始需求提到 `subscription` 字段,当前 schema 未包含。如果前端从独立端点获取订阅信息则无问题;若前端期望此字段,后续需补充。 ### 结论 修复正确、完整,代码遵循现有架构模式,可合并。
xiaoxia added 1 commit 2026-06-29 18:23:50 +08:00
fix: PR#112 P2 建议修复
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Has been cancelled
CI/CD Pipeline / Frontend Lint (pull_request) Has been cancelled
d2578a9093
P2-1: list_by_user[:5] → list_recent_by_user(user_id, limit=5) SQL层LIMIT
P2-2: DashboardOverviewResponse 补充 subscription 字段(plan + is_active)

- packages/ports/generation_task_repository.py: 新增 list_recent_by_user
- packages/adapters/sqlalchemy_impl/generation_task_repository.py: 实现
- apps/api/app/schemas/dashboard.py: 新增 SubscriptionInfo + subscription 字段
- apps/api/app/api/routes/dashboard.py: 使用新接口 + 填充 subscription
Author
Owner

@代码审计 P2 建议已修复,请复审:

  • P2-1: list_by_user[:5]list_recent_by_user(user_id, limit=5) SQL 层 LIMIT
  • P2-2: 新增 SubscriptionInfo + subscription 字段(plan + is_active)
@代码审计 P2 建议已修复,请复审: - P2-1: `list_by_user[:5]` → `list_recent_by_user(user_id, limit=5)` SQL 层 LIMIT - P2-2: 新增 `SubscriptionInfo` + `subscription` 字段(plan + is_active)
Author
Owner

复审通过 — PR #112(P2 修复)

Head SHA: e7230258d2578a90 | +175/-0(+27 行 P2 修复)


P2-1:SQL LIMIT 优化

变更 验证
Port 新增 list_recent_by_user(user_id, limit=5) 签名正确
Adapter .order_by(created_at.desc()).limit(limit).all() SQL 层 LIMIT,不再加载全量
Route list_by_user(user_id)[:5]list_recent_by_user(user_id, limit=5) 调用正确

P2-2:subscription 字段

变更 验证
Schema 新增 SubscriptionInfo(plan="free", is_active=False) 合理默认值
Schema DashboardOverviewResponse 新增 subscription 字段 default_factory=SubscriptionInfo
Route getattr(user, "subscription_plan", "free") 安全取值 不依赖 User 模型改造,向后兼容

结论

两个 P2 建议均已正确修复,可合并。

## ✅ 复审通过 — PR #112(P2 修复) **Head SHA:** `e7230258` → `d2578a90` | +175/-0(+27 行 P2 修复) --- ### P2-1:SQL LIMIT 优化 ✅ | 层 | 变更 | 验证 | |----|------|------| | Port | 新增 `list_recent_by_user(user_id, limit=5)` | ✅ 签名正确 | | Adapter | `.order_by(created_at.desc()).limit(limit).all()` | ✅ SQL 层 LIMIT,不再加载全量 | | Route | `list_by_user(user_id)[:5]` → `list_recent_by_user(user_id, limit=5)` | ✅ 调用正确 | ### P2-2:subscription 字段 ✅ | 层 | 变更 | 验证 | |----|------|------| | Schema | 新增 `SubscriptionInfo(plan="free", is_active=False)` | ✅ 合理默认值 | | Schema | `DashboardOverviewResponse` 新增 `subscription` 字段 | ✅ `default_factory=SubscriptionInfo` | | Route | `getattr(user, "subscription_plan", "free")` 安全取值 | ✅ 不依赖 User 模型改造,向后兼容 | ### 结论 两个 P2 建议均已正确修复,可合并。
xiaoxia merged commit 4c1139b681 into develop 2026-06-29 18:35:45 +08:00
Sign in to join this conversation.