fix: 上传端点 500 根因修复 (list_by_project → find_by_project) + OSS 诊断能力 #120

Merged
xiaoxia merged 2 commits from fix/upload-size-limit-2000mb into develop 2026-06-30 10:25:44 +08:00
Owner

根因

部署发布专家通过生产日志确认:

AttributeError: 'SQLAlchemyAssetLibraryRepository' object has no attribute 'list_by_project'. Did you mean: 'find_by_project'?

upload.pychunked_upload.pyasset_diagnosis.py 调用了 asset_library_repository.list_by_project(),但 SQLAlchemy 实现只有 find_by_project(),导致所有上传和诊断端点 500。

修复

1. 方法名修复(根因)

  • upload.py:76list_by_projectfind_by_project
  • chunked_upload.py:104list_by_projectfind_by_project
  • asset_diagnosis.py:205list_by_projectfind_by_project
  • packages/adapters/in_memory/asset_library_repository.py — 同步方法名

2. 上传端点异常处理(防御性)

  • 3 个上传端点添加完整 try/except + 日志
  • OSS 操作失败返回 503 而非 500

3. OSS 诊断能力

  • storage.py 启动时记录 OSS 初始化状态
  • /api/v1/ready 端点增加 OSS 健康检查
## 根因 部署发布专家通过生产日志确认: ``` AttributeError: 'SQLAlchemyAssetLibraryRepository' object has no attribute 'list_by_project'. Did you mean: 'find_by_project'? ``` `upload.py`、`chunked_upload.py`、`asset_diagnosis.py` 调用了 `asset_library_repository.list_by_project()`,但 SQLAlchemy 实现只有 `find_by_project()`,导致所有上传和诊断端点 500。 ## 修复 ### 1. 方法名修复(根因) - `upload.py:76` — `list_by_project` → `find_by_project` - `chunked_upload.py:104` — `list_by_project` → `find_by_project` - `asset_diagnosis.py:205` — `list_by_project` → `find_by_project` - `packages/adapters/in_memory/asset_library_repository.py` — 同步方法名 ### 2. 上传端点异常处理(防御性) - 3 个上传端点添加完整 try/except + 日志 - OSS 操作失败返回 503 而非 500 ### 3. OSS 诊断能力 - `storage.py` 启动时记录 OSS 初始化状态 - `/api/v1/ready` 端点增加 OSS 健康检查
xiaoxia added 1 commit 2026-06-30 09:56:47 +08:00
fix: 上传端点异常处理 + OSS 诊断能力
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Has been cancelled
CI/CD Pipeline / Frontend Lint (pull_request) Has been cancelled
05c9137ece
问题:PR#119 修复变量名后上传端点仍然 500,说明根因不仅是变量名错误

修复:
1. upload.py — 所有 3 个上传端点添加完整异常捕获和日志
   - prepare_direct_upload: 捕获 RuntimeError→503 + 其他异常→500+日志
   - complete_direct_upload: file_exists() 异常捕获→503(之前未捕获→500)
   - upload_asset: upload_file() 异常捕获→503/500+日志(之前未捕获→500)

2. storage.py — OSSStorageService.__init__ 添加启动诊断日志
   - 凭证缺失时记录 missing env vars
   - oss2 SDK 未安装时记录错误
   - bucket 初始化成功/失败时记录

3. health.py — /ready 端点增加 OSS 检查
   - 检查凭证是否配置
   - 检查 oss2 SDK 是否可用
   - 调用 get_bucket_info() 验证连通性

部署后请调用 GET /api/v1/ready 查看 OSS 状态
xiaoxia added 1 commit 2026-06-30 10:14:12 +08:00
fix: list_by_project → find_by_project (修复上传/诊断端点 500)
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Has been cancelled
CI/CD Pipeline / Frontend Lint (pull_request) Has been cancelled
37152a0729
根因:upload.py、chunked_upload.py、asset_diagnosis.py 调用了
asset_library_repository.list_by_project(),但 SQLAlchemy 实现
只有 find_by_project(),导致 AttributeError → 500。

同步修复 InMemory 实现的方法名以保持一致。
xiaoxia changed title from fix: 上传端点异常处理 + OSS 诊断能力(修复 500 错误) to fix: 上传端点 500 根因修复 (list_by_project → find_by_project) + OSS 诊断能力 2026-06-30 10:14:29 +08:00
xiaoxia merged commit b6ead113cf into develop 2026-06-30 10:25:44 +08:00
Author
Owner

代码审计审查 — PR #120 通过

Head SHA: 37152a0 | 6 文件 +102/-20

核心修复验证

3 个路由文件方法名已全部对齐:

  • upload.py 第 76 行:find_by_project(project_id)
  • chunked_upload.py 第 104 行:find_by_project(project_id)
  • asset_diagnosis.py 第 205 行:find_by_project(project_id)

仓储实现确认只有 find_by_project,无 list_by_project:

  • ports 接口:async def find_by_project
  • SQLAlchemy adapter:def find_by_project(self, project_id: str)
  • In-memory adapter:def find_by_project(self, project_id: str, kind=None)

附带变更

  • storage.py 新增 normalize/file_exists/upload_file 等方法
  • upload.py 增加 OSS 存储集成逻辑
  • health.py 新增健康检查端点
  • in_memory repository 方法名同步

附带变更无安全问题。

审查通过。

## 代码审计审查 — PR #120 通过 **Head SHA:** `37152a0` | **6 文件 +102/-20** ### 核心修复验证 3 个路由文件方法名已全部对齐: - upload.py 第 76 行:find_by_project(project_id) - chunked_upload.py 第 104 行:find_by_project(project_id) - asset_diagnosis.py 第 205 行:find_by_project(project_id) 仓储实现确认只有 find_by_project,无 list_by_project: - ports 接口:async def find_by_project - SQLAlchemy adapter:def find_by_project(self, project_id: str) - In-memory adapter:def find_by_project(self, project_id: str, kind=None) ### 附带变更 - storage.py 新增 normalize/file_exists/upload_file 等方法 - upload.py 增加 OSS 存储集成逻辑 - health.py 新增健康检查端点 - in_memory repository 方法名同步 附带变更无安全问题。 **审查通过。**
Sign in to join this conversation.