refactor(#779): 消除重复枚举定义,统一到classification模块 #800

Closed
xiaoxia wants to merge 2 commits from refactor/unified-enums into develop
Owner
No description provided.
xiaoxia added 2 commits 2026-07-24 00:30:30 +08:00
refactor(#778): 统一Storage接口,定义StoragePort+SharedStorageService作为唯一入口
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 9s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 35s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m0s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 57s
CI/CD Pipeline / PR Build Worker Image (pull_request) Failing after 24s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 28s
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 1m36s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 56s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 25s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 3m5s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m14s
AI Code Review / AI Code Review (pull_request) Successful in 5m43s
CI/CD Pipeline / Frontend Unit Tests (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 Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m15s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 5m50s
CI/CD Pipeline / Deploy Production (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 / Production Browser E2E (pull_request) Has been skipped
cfc7563520
- 新增 packages/ports/storage_port.py → StoragePort 抽象接口(12个核心方法)
- SharedStorageService 实现 StoragePort,整合两套实现的全部能力
  - 新增 upload_file_smart():大文件分片上传+超时保护(从oss_helpers合并)
  - 新增 download_asset():自动识别URL/存储键,支持HTTP+SDK双路径
  - 新增 resolve_asset_path() / resolve_asset_ids_to_paths():素材路径解析+缓存
  - 新增 normalize_storage_key() 公开方法
  - connect_timeout=10s 防挂死
- oss_helpers 保留为独立实现(向后兼容,后续逐步迁移)
- 全量单测 4383 passed, 8 skipped
refactor(#779): 消除重复枚举定义,统一到classification模块
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 16s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m16s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m13s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 1m38s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 26s
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
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 25s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 59s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 21s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m35s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 10s
AI Code Review / AI Code Review (pull_request) Successful in 4m9s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 6m15s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 11m58s
CI/CD Pipeline / Frontend Unit Tests (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 Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m15s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 5m9s
CI/CD Pipeline / Deploy Production (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 / Production Browser E2E (pull_request) Has been skipped
0f3d7679c8
- AssetLibraryKind: 从entities.py+classification.py双份定义,统一到classification.py
- IngestJobStatus: 同上
- ClassificationStatus/ClassificationJobStatus: 合并为ClassificationJobStatus,保留_missing_兼容方法,ClassificationStatus作为别名
- entities.py改为re-export兼容层,107处import不受影响
- 补齐classification.py中AssetLibraryKind缺失的IMAGE值
- 净减8行
xiaoxia closed this pull request 2026-07-24 00:31:18 +08:00

🗑️ 预览环境已清理

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

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

🗑️ **预览环境已清理** PR #800 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Collaborator

代码审查结果 - PR #800

⚠️ 问题(3个需要修改)

  1. packages/shared/storage.py 第145行download_file 方法实现与 StoragePort 接口定义不一致。

    • 问题描述:接口 StoragePort.download_file 定义签名为 (storage_key_or_url: str, ...) -> bool,且文档说明需自动识别 URL 或 Key。但 SharedStorageService.download_file 实现签名为 (storage_key: str, ...) -> None,且仅支持 SDK 下载(不支持 HTTP URL),遇到错误抛出异常而非返回 False。
    • 后果:违反里氏替换原则,依赖接口进行多态调用的代码会因参数不匹配或返回值处理错误而崩溃。实际的“智能下载”逻辑被移到了 download_asset 方法中,导致接口契约失效。
  2. packages/shared/storage.py 第440行resolve_asset_path 方法存在运行时硬依赖和架构分层违规。

    • 问题描述:在 packages/shared/storage.py(基础设施层)中直接 import video_processing.path_security(业务逻辑/处理层)。这是运行时动态导入,且方向错误(底层依赖高层)。
    • 后果:如果 video_processing 模块不可用或被移除,storage 模块将在运行时崩溃。这破坏了模块的独立性和复用性,建议通过依赖注入传入校验函数,或在 shared 层实现通用的路径安全校验。
  3. packages/shared/storage.py 第120-155行upload_file_smart 方法存在超时后的状态不一致风险。

    • 问题描述:该方法在子线程中执行上传,主线程通过 done.wait(timeout) 等待。如果超时发生,函数返回 None(表示失败),但子线程仍在后台运行(daemon=True)。若上传最终成功,OSS 上会有文件,但调用方认为失败并可能重试,导致资源浪费或状态混乱。
    • 后果:可能导致重复上传或调用方逻辑误判。对于关键业务,应确保超时时能够取消上传任务,或明确告知调用方状态未知。

💡 建议(2个可选)

  1. packages/shared/storage.py 第410行resolve_asset_path 中的空字节检测时机滞后。

    • 建议描述:当前代码在 asset_id 原始值中检测 \x00,但随后调用了 normalize_storage_key(包含 unquote)。如果传入的是经过 URL 编码的 %00,原始检测会通过,解码后引入空字节,可能导致后续 OSS 操作异常。建议在 unquote 之后再次检测空字节。
  2. packages/shared/storage.py 第19行:导入路径变更需确认。

    • 建议描述:代码将 from packages.shared.config import ... 修改为 from packages.config import ...。这暗示 config 模块向上移动了一级。请确认项目结构调整是否已生效,避免运行时出现 ModuleNotFoundError

格式检查通过 | 逻辑审查需修改 | ⚠️ 建议关注性能


🤖 由 AI 代码审查机器人自动生成 | 2026-07-23 16:51:01 | 模型:

## 代码审查结果 - PR #800 ### ⚠️ 问题(3个需要修改) 1. **packages/shared/storage.py 第145行**:`download_file` 方法实现与 `StoragePort` 接口定义不一致。 - **问题描述**:接口 `StoragePort.download_file` 定义签名为 `(storage_key_or_url: str, ...) -> bool`,且文档说明需自动识别 URL 或 Key。但 `SharedStorageService.download_file` 实现签名为 `(storage_key: str, ...) -> None`,且仅支持 SDK 下载(不支持 HTTP URL),遇到错误抛出异常而非返回 False。 - **后果**:违反里氏替换原则,依赖接口进行多态调用的代码会因参数不匹配或返回值处理错误而崩溃。实际的“智能下载”逻辑被移到了 `download_asset` 方法中,导致接口契约失效。 2. **packages/shared/storage.py 第440行**:`resolve_asset_path` 方法存在运行时硬依赖和架构分层违规。 - **问题描述**:在 `packages/shared/storage.py`(基础设施层)中直接 import `video_processing.path_security`(业务逻辑/处理层)。这是运行时动态导入,且方向错误(底层依赖高层)。 - **后果**:如果 `video_processing` 模块不可用或被移除,`storage` 模块将在运行时崩溃。这破坏了模块的独立性和复用性,建议通过依赖注入传入校验函数,或在 `shared` 层实现通用的路径安全校验。 3. **packages/shared/storage.py 第120-155行**:`upload_file_smart` 方法存在超时后的状态不一致风险。 - **问题描述**:该方法在子线程中执行上传,主线程通过 `done.wait(timeout)` 等待。如果超时发生,函数返回 `None`(表示失败),但子线程仍在后台运行(daemon=True)。若上传最终成功,OSS 上会有文件,但调用方认为失败并可能重试,导致资源浪费或状态混乱。 - **后果**:可能导致重复上传或调用方逻辑误判。对于关键业务,应确保超时时能够取消上传任务,或明确告知调用方状态未知。 ### 💡 建议(2个可选) 1. **packages/shared/storage.py 第410行**:`resolve_asset_path` 中的空字节检测时机滞后。 - **建议描述**:当前代码在 `asset_id` 原始值中检测 `\x00`,但随后调用了 `normalize_storage_key`(包含 `unquote`)。如果传入的是经过 URL 编码的 `%00`,原始检测会通过,解码后引入空字节,可能导致后续 OSS 操作异常。建议在 `unquote` 之后再次检测空字节。 2. **packages/shared/storage.py 第19行**:导入路径变更需确认。 - **建议描述**:代码将 `from packages.shared.config import ...` 修改为 `from packages.config import ...`。这暗示 `config` 模块向上移动了一级。请确认项目结构调整是否已生效,避免运行时出现 `ModuleNotFoundError`。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-23 16:51:01 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
Some checks are pending
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 16s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m16s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m13s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 1m38s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 26s
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
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 25s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 59s
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 21s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m35s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 10s
AI Code Review / AI Code Review (pull_request) Successful in 4m9s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 6m15s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 11m58s
CI/CD Pipeline / Frontend Unit Tests (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 Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m15s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 5m9s
CI/CD Pipeline / Deploy Production (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 / Production Browser E2E (pull_request) Has been skipped

Pull request closed

Sign in to join this conversation.