feat(workbench): persist operational workflows and events
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user