fix(worker): 素材下载优先按asset_id查,修复项目级素材黑屏问题 #226

Merged
xiaoxia merged 2 commits from fix/generation-project-asset-download into develop 2026-07-12 11:10:53 +08:00
Owner

问题

一键生成使用项目级素材时,视频全部黑屏。

根因:Worker 端 _download_library_assets 查询素材时,先按 asset_library_idproject_id 做前置过滤,再按 asset_ids 过滤。当素材的 asset_library_id 与任务传入的不一致时(项目级素材不属于任何素材库,或属于项目默认库但任务没传对 library_id),查询结果为空,触发 fallback 黑屏。

修复

指定 asset_ids 时,直接按 ID 查询,不做 library/project 前置过滤。 归属安全由后续的归属校验保证:

  • 传了 asset_library_id → 校验素材属于指定素材库
  • 传了 project_id → 校验素材属于指定项目
  • 两者都传 → 两个都校验

未指定 asset_ids 时(下载全部素材),保持原逻辑不变。

影响范围

  • _download_library_assets 函数查询逻辑
  • 所有调用该函数的生成任务链路(一键生成、编辑计划生成等)
## 问题 一键生成使用项目级素材时,视频全部黑屏。 根因:Worker 端 `_download_library_assets` 查询素材时,先按 `asset_library_id` 或 `project_id` 做前置过滤,再按 `asset_ids` 过滤。当素材的 `asset_library_id` 与任务传入的不一致时(项目级素材不属于任何素材库,或属于项目默认库但任务没传对 library_id),查询结果为空,触发 fallback 黑屏。 ## 修复 **指定 asset_ids 时,直接按 ID 查询,不做 library/project 前置过滤。** 归属安全由后续的归属校验保证: - 传了 `asset_library_id` → 校验素材属于指定素材库 - 传了 `project_id` → 校验素材属于指定项目 - 两者都传 → 两个都校验 未指定 asset_ids 时(下载全部素材),保持原逻辑不变。 ## 影响范围 - `_download_library_assets` 函数查询逻辑 - 所有调用该函数的生成任务链路(一键生成、编辑计划生成等)
Author
Owner

审查结论 通过,可以合并

安全评估:无越权漏洞

改动核心是查询顺序调整——有 asset_ids 时先按 ID 直查,再用归属校验兜底,而不是先按 library/project 预过滤。安全性上没问题:

  1. 参数来源可信asset_library_idproject_idasset_ids 都从 gen_task(DB 记录)读取,不是用户直传,API 层创建任务时已经做过用户权限校验
  2. 归属校验完整:按 ID 查出来后,会逐一校验 library 归属和 project 归属,不匹配直接抛错
  3. 校验范围反而更严:原代码 project 归属校验有前置条件 if not asset_library_id and project_id...,素材库模式下不校验 project。新代码去掉了这个前置条件,素材库模式也会校验 project_id,实际更严格

功能验证

场景 原逻辑 新逻辑 结论
项目级 + 指定 asset_ids 先按 project 过滤,再加 asset_ids 先按 asset_ids 查,再校 project 等价,修复了项目级素材黑屏问题
素材库 + 指定 asset_ids 先按 library 过滤,再加 asset_ids 先按 asset_ids 查,再校 library 行为一致(library 不会跨项目)
项目级 + 不指定 asset_ids(下全部) 按 project 查全部 按 project 查全部 完全一致
素材库 + 不指定 asset_ids(下全部) 按 library 查全部 按 library 查全部 完全一致

一个值得注意的行为变更(P2,不阻塞)

素材库模式下新增了 project_id 归属校验。从 AssetLibraryproject_id 字段来看,素材库是项目内的,素材的 project_id 应该等于任务的 project_id,正常场景不受影响。但如果未来有系统预设素材库、跨项目共享素材库之类的场景,这里会直接报错。建议加个注释说明一下,或者保留原来的 not asset_library_id 前置条件更稳妥。


整体改动方向正确,逻辑自洽,安全上比原来更严,可以合并。

## 审查结论 ✅ 通过,可以合并 ### 安全评估:无越权漏洞 改动核心是查询顺序调整——有 `asset_ids` 时先按 ID 直查,再用归属校验兜底,而不是先按 library/project 预过滤。安全性上没问题: 1. **参数来源可信**:`asset_library_id`、`project_id`、`asset_ids` 都从 `gen_task`(DB 记录)读取,不是用户直传,API 层创建任务时已经做过用户权限校验 2. **归属校验完整**:按 ID 查出来后,会逐一校验 library 归属和 project 归属,不匹配直接抛错 3. **校验范围反而更严**:原代码 project 归属校验有前置条件 `if not asset_library_id and project_id...`,素材库模式下不校验 project。新代码去掉了这个前置条件,素材库模式也会校验 project_id,实际更严格 ### 功能验证 | 场景 | 原逻辑 | 新逻辑 | 结论 | |------|--------|--------|------| | 项目级 + 指定 asset_ids | 先按 project 过滤,再加 asset_ids | 先按 asset_ids 查,再校 project | ✅ 等价,修复了项目级素材黑屏问题 | | 素材库 + 指定 asset_ids | 先按 library 过滤,再加 asset_ids | 先按 asset_ids 查,再校 library | ✅ 行为一致(library 不会跨项目) | | 项目级 + 不指定 asset_ids(下全部) | 按 project 查全部 | 按 project 查全部 | ✅ 完全一致 | | 素材库 + 不指定 asset_ids(下全部) | 按 library 查全部 | 按 library 查全部 | ✅ 完全一致 | ### 一个值得注意的行为变更(P2,不阻塞) 素材库模式下新增了 `project_id` 归属校验。从 `AssetLibrary` 有 `project_id` 字段来看,素材库是项目内的,素材的 `project_id` 应该等于任务的 `project_id`,正常场景不受影响。但如果未来有系统预设素材库、跨项目共享素材库之类的场景,这里会直接报错。建议加个注释说明一下,或者保留原来的 `not asset_library_id` 前置条件更稳妥。 --- 整体改动方向正确,逻辑自洽,安全上比原来更严,可以合并。
xiaoxia added 2 commits 2026-07-12 11:03:51 +08:00
一键生成使用项目级素材时,素材不在指定素材库里,
原逻辑先按asset_library_id过滤导致查不到,全部走fallback黑屏。

改造:
- 指定asset_ids时,直接按ID查询,不做library/project前置过滤
- 归属安全由后续归属校验保证(传了library就校验library,传了project就校验project)
- 未指定asset_ids时,保持原逻辑按library/project查全部
fix(test): 修正test_all_asset_ids_fail_raises的mock层级,三层filter改为两层
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 1m52s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m3s
CI/CD Pipeline / Build & Push Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Build Production Runtime Images (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 / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m16s
a6ae041944
xiaoxia force-pushed fix/generation-project-asset-download from 1a7d94d892 to a6ae041944 2026-07-12 11:03:51 +08:00 Compare
xiaoxia merged commit c80a6935fd into develop 2026-07-12 11:10:53 +08:00
Sign in to join this conversation.