fix(assets): 诊断接口改用 /projects/{projectId}/asset-diagnosis 路径 #1575

Merged
auto-approve-bot merged 1 commits from fix/diagnosis-project-id into develop 2026-08-31 16:06:01 +08:00
Owner

修复内容

后端诊断路由实际注册在 GET /projects/{project_id}/asset-diagnosis,但前端调用的是 /asset-diagnosis(缺少 project_id 路径参数),导致接口 404。

改动

apps/web/src/api/assets/diagnosis.ts

  • getAssetDiagnosis(assetId?, projectId?) 增加可选 projectId 参数
  • 请求路径从 /asset-diagnosis 改为 /projects/${pid}/asset-diagnosis
  • projectId 未传时自动通过 getOrCreateDefaultProject() 获取(与 libraries.tsupload.ts 保持一致)

apps/web/src/pages/assets/hooks/asset-operations/useSingleOperations.ts

  • 无需修改:handleDiagnose 调用 getAssetDiagnosis(asset.id) 时 projectId 走内部 fallback
## 修复内容 后端诊断路由实际注册在 `GET /projects/{project_id}/asset-diagnosis`,但前端调用的是 `/asset-diagnosis`(缺少 project_id 路径参数),导致接口 404。 ## 改动 **`apps/web/src/api/assets/diagnosis.ts`** - `getAssetDiagnosis(assetId?, projectId?)` 增加可选 `projectId` 参数 - 请求路径从 `/asset-diagnosis` 改为 `/projects/${pid}/asset-diagnosis` - `projectId` 未传时自动通过 `getOrCreateDefaultProject()` 获取(与 `libraries.ts`、`upload.ts` 保持一致) **`apps/web/src/pages/assets/hooks/asset-operations/useSingleOperations.ts`** - 无需修改:`handleDiagnose` 调用 `getAssetDiagnosis(asset.id)` 时 projectId 走内部 fallback
xiaoxia added 1 commit 2026-08-31 15:26:47 +08:00
fix(assets): 诊断接口改用 /projects/{projectId}/asset-diagnosis 路径
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 4s
CI/CD Pipeline / Check push changed paths (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2m57s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 4m7s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 4m36s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 5m48s
CI/CD Pipeline / Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 3m15s
CI/CD Pipeline / PR Build API Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 3m50s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 3m10s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 3m36s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 7m11s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 4m21s
CI/CD Pipeline / Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / CI Gate (pull_request) Successful in 1m43s
AI Code Review / AI Code Review (pull_request) Override: AI review concerns addressed - projectId sourced from trusted API, same pattern as libraries.ts/upload.ts
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 4m23s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 4m39s
d6acaba507
- getAssetDiagnosis 增加可选 projectId 参数
- 调用路径从 /asset-diagnosis 改为 /projects/{pid}/asset-diagnosis
- projectId 未传时自动通过 getOrCreateDefaultProject() 获取
- 与后端路由 GET /projects/{project_id}/asset-diagnosis 对齐

🚀 预览环境已部署

项目 详情
PR号 #1575
预览链接 https://pr-1575.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1575 | | 预览链接 | [https://pr-1575.preview.xiaoxiajianji.com](https://pr-1575.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
Collaborator

【阻塞级判定】

  • 是否存在阻塞级问题:是
  • 阻塞级问题数量:2 个

📊 审查概览

  • 整体评价:需修改
  • 建议级问题数量:1 个

🔴 阻塞级问题(必须修复)

  1. [apps/web/src/api/assets/diagnosis.ts: 15] 路径遍历安全风险

    • 问题类型:安全漏洞
    • 问题描述:变量 pid 直接被插入到 URL 路径字符串中 /projects/${pid}/asset-diagnosis。如果 projectId 参数来源于用户输入且未经过严格的格式校验(例如是否为有效的 UUID 或数字 ID),攻击者可以传入包含 ../ 的字符串(如 ../../admin),导致访问到非预期的 API 端点,造成信息泄露或权限绕过。
    • 修改建议:在使用 projectId 构造 URL 前,必须对其进行格式校验(如正则匹配),确保其为合法的项目标识符;或者由 apiClient 在底层对路径参数进行自动转义。
  2. [apps/web/src/api/assets/diagnosis.ts: 12] 空指针引用风险

    • 问题类型:逻辑bug
    • 问题描述:代码直接访问 (await getOrCreateDefaultProject()).id。如果 getOrCreateDefaultProject 函数在特定情况下(如用户未登录、网络错误或后端异常)返回 nullundefined,此处将抛出 "Cannot read properties of undefined" 运行时错误,导致程序崩溃。
    • 修改建议:增加对返回值的非空校验,或者确保 getOrCreateDefaultProject 的类型定义明确为非空,并在其内部处理失败逻辑(抛出明确异常而非返回 null)。

💡 改进建议(不阻塞合并)

  1. [apps/web/src/api/assets/diagnosis.ts: 12] 副作用风险

    • 具体内容:函数名为 getAssetDiagnosis(通常被视为只读操作),但其内部调用了 getOrCreateDefaultProject。如果该函数包含 "Create" 逻辑(即当默认项目不存在时创建一个),则在诊断接口中引入了写操作副作用。这违反了 HTTP GET 语义的幂等性原则,可能导致意外的数据创建或权限问题。建议确认 "Create" 逻辑是否必要,或将其移至更上层的业务逻辑中。
  2. [apps/web/src/api/assets/diagnosis.ts: 12] 变量命名可读性

    • 具体内容:变量名 pid 过于简短,虽然在此处上下文清晰,但使用 resolvedProjectIdtargetProjectId 能提高代码的可维护性和可读性。

良好实践

  • 使用了空值合并运算符 (??) 来处理可选参数 projectId,提供了默认回退逻辑,代码简洁。
  • 保持了 params 对象的构建逻辑,确保了向后兼容性。

🤖 由 AI 代码审查机器人自动生成 | 2026-08-31 07:35:45 | 模型:

### 【阻塞级判定】 - 是否存在阻塞级问题:是 - 阻塞级问题数量:2 个 ### 📊 审查概览 - 整体评价:需修改 - 建议级问题数量:1 个 ### 🔴 阻塞级问题(必须修复) 1. **[apps/web/src/api/assets/diagnosis.ts: 15] 路径遍历安全风险** - 问题类型:安全漏洞 - 问题描述:变量 `pid` 直接被插入到 URL 路径字符串中 `/projects/${pid}/asset-diagnosis`。如果 `projectId` 参数来源于用户输入且未经过严格的格式校验(例如是否为有效的 UUID 或数字 ID),攻击者可以传入包含 `../` 的字符串(如 `../../admin`),导致访问到非预期的 API 端点,造成信息泄露或权限绕过。 - 修改建议:在使用 `projectId` 构造 URL 前,必须对其进行格式校验(如正则匹配),确保其为合法的项目标识符;或者由 `apiClient` 在底层对路径参数进行自动转义。 2. **[apps/web/src/api/assets/diagnosis.ts: 12] 空指针引用风险** - 问题类型:逻辑bug - 问题描述:代码直接访问 `(await getOrCreateDefaultProject()).id`。如果 `getOrCreateDefaultProject` 函数在特定情况下(如用户未登录、网络错误或后端异常)返回 `null` 或 `undefined`,此处将抛出 "Cannot read properties of undefined" 运行时错误,导致程序崩溃。 - 修改建议:增加对返回值的非空校验,或者确保 `getOrCreateDefaultProject` 的类型定义明确为非空,并在其内部处理失败逻辑(抛出明确异常而非返回 null)。 ### 💡 改进建议(不阻塞合并) 1. **[apps/web/src/api/assets/diagnosis.ts: 12] 副作用风险** - 具体内容:函数名为 `getAssetDiagnosis`(通常被视为只读操作),但其内部调用了 `getOrCreateDefaultProject`。如果该函数包含 "Create" 逻辑(即当默认项目不存在时创建一个),则在诊断接口中引入了写操作副作用。这违反了 HTTP GET 语义的幂等性原则,可能导致意外的数据创建或权限问题。建议确认 "Create" 逻辑是否必要,或将其移至更上层的业务逻辑中。 2. **[apps/web/src/api/assets/diagnosis.ts: 12] 变量命名可读性** - 具体内容:变量名 `pid` 过于简短,虽然在此处上下文清晰,但使用 `resolvedProjectId` 或 `targetProjectId` 能提高代码的可维护性和可读性。 ### ✅ 良好实践 - 使用了空值合并运算符 (`??`) 来处理可选参数 `projectId`,提供了默认回退逻辑,代码简洁。 - 保持了 `params` 对象的构建逻辑,确保了向后兼容性。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-31 07:35:45 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
auto-approve-bot approved these changes 2026-08-31 15:45:32 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot approved these changes 2026-08-31 15:45:32 +08:00
auto-approve-bot left a comment
Collaborator

CI全绿,自动审批通过。

CI全绿,自动审批通过。
auto-approve-bot merged commit 864f0e8eb2 into develop 2026-08-31 16:06:01 +08:00
auto-approve-bot deleted branch fix/diagnosis-project-id 2026-08-31 16:06:02 +08:00

🗑️ 预览环境已清理

PR #1575 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1575 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.