fix(editor): 移除asset_id min_length限制+order默认None (#1468)
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 / Deploy Staging (Watchtower auto-deploy) (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 / Check if frontend-only change (pull_request) Successful in 45s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 44s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m49s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m52s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m53s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m23s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m44s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m35s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m9s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 5m54s
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 / Canary Release to Production (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
AI Code Review / AI Code Review (pull_request) Successful in 6m51s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m15s
CI/CD Pipeline / CI Gate (pull_request) Successful in 6s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 39s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 57s

AI Code Review 第三轮修复:
1. EditorClipBatchItem.asset_id 移除 min_length=1,允许空字符串(占位片段场景)
2. EditorClipBatchItem.order 默认值改为 None(非0),仅在显式传入时加入 dict
3. 服务层 order 逻辑:dict 无 order key 时回退到索引 i
4. 测试更新:9 passed
This commit is contained in:
CI Bot
2026-08-23 15:54:34 +08:00
parent ee561b0d64
commit 6f222db4c7
3 changed files with 19 additions and 12 deletions
@@ -178,15 +178,16 @@ def batch_update_clips(
_, plan_svc = services
plan_svc.get_plan_or_raise(plan_id)
clips_data = [
{
clips_data = []
for clip_item in req.clips:
item = {
"asset_id": clip_item.asset_id,
"start_time": clip_item.start_time,
"duration": clip_item.duration,
"order": clip_item.order,
}
for clip_item in req.clips
]
if clip_item.order is not None:
item["order"] = clip_item.order
clips_data.append(item)
plan_svc.replace_all_clips_transactional(plan_id, clips_data)
@@ -497,10 +497,10 @@ class EditorClipUpdateRequest(BaseModel):
class EditorClipBatchItem(BaseModel):
"""批量更新clips的单个片段"""
asset_id: str = Field(default="", min_length=1, max_length=100)
asset_id: str = Field(default="", max_length=100, description="关联素材ID,可为空(占位片段)")
start_time: float = Field(default=0.0, ge=0.0)
duration: float = Field(default=0.0, ge=0.0)
order: int = Field(default=0, ge=0)
order: Optional[int] = Field(default=None, ge=0, description="排序,None表示按数组顺序")
class EditorClipBatchUpdateRequest(BaseModel):
+11 -5
View File
@@ -9,7 +9,6 @@ import os
from unittest.mock import MagicMock
import pytest
from pydantic import ValidationError
os.environ.setdefault("JWT_SECRET_KEY", "unit-test-secret-key-for-testing")
@@ -114,12 +113,12 @@ class TestBatchUpdateClips:
class TestEditorClipBatchItemValidation:
"""验证 schema 校验规则。"""
def test_asset_id_empty_string_rejected(self):
"""asset_id 空字符串时应被拒绝(min_length=1)。"""
def test_asset_id_empty_string_allowed(self):
"""asset_id 空字符串允许通过(占位片段场景)。"""
from app.api.routes.templates_editor.schemas import EditorClipBatchItem
with pytest.raises(ValidationError):
EditorClipBatchItem(asset_id="", start_time=0.0, duration=3.0, order=0)
item = EditorClipBatchItem(asset_id="", start_time=0.0, duration=3.0, order=0)
assert item.asset_id == ""
def test_asset_id_valid(self):
"""有效 asset_id 应通过校验。"""
@@ -127,3 +126,10 @@ class TestEditorClipBatchItemValidation:
item = EditorClipBatchItem(asset_id="abc123", start_time=0.0, duration=3.0, order=0)
assert item.asset_id == "abc123"
def test_order_none_by_default(self):
"""order 默认为 None,表示按数组顺序。"""
from app.api.routes.templates_editor.schemas import EditorClipBatchItem
item = EditorClipBatchItem(asset_id="a1", start_time=0.0, duration=3.0)
assert item.order is None