WP02:Backend 音频资源类型与读取链路
状态:完成(2026-10-18)。阶段:M0。主责:Backend。
前置与输入
前置完成:WP01。
修改范围与交付
- 在
AssetType、Schema、资源角色、上传/替换校验和 External 资源接口加入audio。 - 允许契约规定的扩展名/MIME,拒绝伪造组合、空文件和不受支持格式;保持音频不可文本编辑且不参与比例回填。
- 复核私有文件的 Content-Type、HEAD、Range、缓存和权限顺序,补音频 seek/分段读取测试。
- 更新 OpenAPI 与 Editor 生成类型,不在手写类型中遗留第二份枚举。
- 不实现转码、时长分析、波形或 cue 存储。
完成标准
- [x] 音频上传、替换、历史、下载、归档/恢复沿用统一服务并通过 API 测试。
- [x] 跨工作空间、过期票据、错误 hash、Range 越界和 MIME 伪造均按现有错误体系拒绝。
- [x] SQLite/PostgreSQL 无需枚举列迁移的判断有测试或模型证据。
- [x] OpenAPI 生成物与 Backend Schema 无漂移。
建议提交标题:WP02:增加 Backend audio 资源类型。
实施记录
- Backend:
AssetType.AUDIO、音频 content role、项目建议资源类型和统一上传/替换链路已接入;允许格式直接复用 WP01 单一常量,扩展名必须与对应 MIME 精确匹配,缺失 MIME 和application/octet-stream均拒绝。 - 文件交付:复用既有鉴权优先、ETag、HEAD 与单段 Range 逻辑;音频专项验证
Content-Type、Accept-Ranges、Content-Range和 304。WorkspaceAsset.asset_type保持 SQLAlchemyString,无需数据库枚举迁移。 - 契约:运行
pnpm run codegen:editor-api,OpenAPI 为 260 paths / 351 schemas;EditorAssetType改为生成类型别名,必要的穷举映射补 audio,但资源页入口留给 WP03。 - 验证:音频 API 专项
.venv/Scripts/python.exe -m pytest backend/tests/api/test_workspace_audio_assets.py -q→ 17 passed;资源/建议资源/交付回归四文件首轮合跑 → 52 passed(补充音频复制/归档/恢复用例后专项复跑全绿);pnpm run test:contracts:generated→ 完全一致;pnpm run test:editor:check→ 通过;新增测试和小型触碰文件 Ruff → 通过。 - 未运行:音频资源 Editor 试听、Runtime 预览、artifact/build/package 和真实浏览器 seek;分别由 WP03–WP06 验收。