Files
my-v0-server/app/actions/base.py
T

25 lines
1004 B
Python

"""动作处理器公共接口,供后端校验时修改大屏 JSON 副本,不操作前端画布"""
from abc import ABC, abstractmethod
from typing import Generic, TypeVar
from app.schemas.actions.base import ActionModel
from app.schemas.screen import Screen, ScreenNode
ActionT = TypeVar("ActionT", bound=ActionModel)
class BaseActionHandler(ABC, Generic[ActionT]):
@abstractmethod
def apply(self, screen: Screen, action: ActionT) -> Screen:
"""检查动作能否执行,返回修改后的大屏副本,保留原始输入"""
raise NotImplementedError
def copy_target(self, screen: Screen, target_id: str) -> tuple[Screen, ScreenNode]:
# 先确认目标存在,再复制,避免修改原始快照
for index, node in enumerate(screen.nodes):
if node.id == target_id:
result = screen.model_copy(deep=True)
return result, result.nodes[index]
raise ValueError(f"目标组件不存在: {target_id}")