feat(workbench): persist operational workflows and events

This commit is contained in:
2026-09-24 04:19:02 +08:00
parent baff7dfe9e
commit 9335bdc1ea
66 changed files with 16580 additions and 238 deletions
+84 -4
View File
@@ -75,6 +75,56 @@ TEST_DATA = (
)
def previous_seed_result(
store: PostgresStore,
project_id: str,
*,
seed_request_id: UUID,
command_key: str,
) -> dict | None:
"""Read this script's earlier receipt without weakening API idempotency checks."""
with store.connection(readonly=True) as connection:
row = connection.execute(
"""SELECT command_key,result
FROM peripheral_sample.requests
WHERE project_id=%s AND actor_id=%s AND request_id=%s""",
(project_id, str(ACTOR_ID), seed_request_id),
).fetchone()
if row is None:
return None
if row["command_key"] != command_key:
raise RuntimeError("seed request id is already used by another command")
return row["result"]
def restore_seeded_resources(
store: PostgresStore,
project_id: str,
*,
table: str,
id_column: str,
resource_ids: list[str],
) -> None:
"""Restore deterministic seed rows that were soft-deleted after an earlier run."""
allowed_resources = {
("work_orders", "work_order_id"),
("test_data_records", "record_id"),
}
if (table, id_column) not in allowed_resources:
raise ValueError("unsupported seeded resource")
if not resource_ids:
return
with store.connection() as connection:
connection.execute(
f"""UPDATE peripheral_sample.{table}
SET document=document - 'deleted_at' - 'deleted_by',
deleted_at=NULL, deleted_by=NULL
WHERE project_id=%s AND {id_column}=ANY(%s::uuid[])""",
(project_id, resource_ids),
)
def ensure_demo_dataset(store: PostgresStore, project_id: str) -> str:
content = build_demo_content()
content_digest = digest(content)
@@ -112,8 +162,9 @@ def main() -> int:
dataset_digest = ensure_demo_dataset(store, project_id)
order_ids = []
for item in WORK_ORDERS:
seed_request_id = request_id(item["key"])
command = CreateWorkOrder(
request_id=request_id(item["key"]),
request_id=seed_request_id,
title=item["title"],
summary=item["summary"],
status=item["status"],
@@ -121,12 +172,27 @@ def main() -> int:
assignee=item["assignee"],
scheduled_at=item["scheduled_at"],
)
order_ids.append(store.create_work_order(who, command)["work_order_id"])
previous = previous_seed_result(
store,
project_id,
seed_request_id=seed_request_id,
command_key="create_work_order",
)
result = previous or store.create_work_order(who, command)
order_ids.append(result["work_order_id"])
restore_seeded_resources(
store,
project_id,
table="work_orders",
id_column="work_order_id",
resource_ids=order_ids,
)
record_ids = []
for point_id, label, observed_at, value, unit, quality in TEST_DATA:
seed_request_id = request_id(f"test-data/{point_id}/{observed_at}")
command = CreateTestDataRecord(
request_id=request_id(f"test-data/{point_id}/{observed_at}"),
request_id=seed_request_id,
label=label,
point_id=point_id,
observed_at=observed_at,
@@ -135,7 +201,21 @@ def main() -> int:
quality=quality,
notes="外围样板固定合成数据,不是现场监测记录。",
)
record_ids.append(store.create_test_data(who, command)["record_id"])
previous = previous_seed_result(
store,
project_id,
seed_request_id=seed_request_id,
command_key="create_test_data",
)
result = previous or store.create_test_data(who, command)
record_ids.append(result["record_id"])
restore_seeded_resources(
store,
project_id,
table="test_data_records",
id_column="record_id",
resource_ids=record_ids,
)
result = {
"project_id": project_id,