34 lines
1.0 KiB
Python
34 lines
1.0 KiB
Python
from __future__ import annotations
|
|
|
|
from app.domain.editor import RuntimeOperation, VariantChange, VariantRuntimePayload
|
|
|
|
|
|
def build_runtime_payload_from_changes(
|
|
variant_id: str,
|
|
changes: list[VariantChange],
|
|
) -> VariantRuntimePayload:
|
|
"""Convert editor-facing change records into runtime-facing operations.
|
|
|
|
The builder keeps the runtime contract stable even if the editor UI later
|
|
changes how it stores intermediate draft state.
|
|
"""
|
|
|
|
operations: list[RuntimeOperation] = []
|
|
|
|
for change in sorted(changes, key=lambda item: item.sort_order):
|
|
action = change.payload.get("action") if isinstance(change.payload, dict) else None
|
|
operations.append(
|
|
RuntimeOperation(
|
|
selector_type=change.selector_type,
|
|
selector_value=change.selector_value,
|
|
action=action or change.change_type,
|
|
payload=change.payload,
|
|
)
|
|
)
|
|
|
|
return VariantRuntimePayload(
|
|
variant_id=variant_id,
|
|
operations=operations,
|
|
)
|
|
|