100 lines
3.0 KiB
Python
100 lines
3.0 KiB
Python
"""Repair orchestration for signal source repair service."""
|
|
|
|
from __future__ import annotations
|
|
|
|
|
|
class SignalSourceRepairFlowMixin:
|
|
"""Runs single/batch repair orchestration."""
|
|
|
|
async def _repair_single_registry(
|
|
self,
|
|
*,
|
|
tenant_id: int,
|
|
project_id: int,
|
|
registry_id: int,
|
|
sender: str,
|
|
) -> dict[str, object]:
|
|
row = await self._load_registry(
|
|
tenant_id=tenant_id,
|
|
project_id=project_id,
|
|
registry_id=registry_id,
|
|
)
|
|
if row is None:
|
|
return {"registry_id": int(registry_id), "status": "not_found"}
|
|
if row.signal_id is not None:
|
|
return self._build_item_result(
|
|
row=row,
|
|
signal_id=self._safe_int(row.signal_id),
|
|
capture_status="already_linked",
|
|
work_item_id=None,
|
|
route_status="",
|
|
)
|
|
|
|
reusable_signal_id = await self._find_reusable_signal_id(
|
|
tenant_id=tenant_id,
|
|
project_id=project_id,
|
|
row=row,
|
|
)
|
|
if reusable_signal_id is not None:
|
|
await self._persist_registry_link(
|
|
tenant_id=tenant_id,
|
|
project_id=project_id,
|
|
row=row,
|
|
signal_id=int(reusable_signal_id),
|
|
capture_status="relinked",
|
|
)
|
|
return self._build_item_result(
|
|
row=row,
|
|
signal_id=int(reusable_signal_id),
|
|
capture_status="relinked",
|
|
work_item_id=None,
|
|
route_status="",
|
|
)
|
|
|
|
_ = sender
|
|
signal = await self._materialize_registry_signal(
|
|
tenant_id=tenant_id,
|
|
project_id=project_id,
|
|
row=row,
|
|
)
|
|
signal_id = int(signal.id)
|
|
capture_status = "materialized"
|
|
await self._persist_registry_link(
|
|
tenant_id=tenant_id,
|
|
project_id=project_id,
|
|
row=row,
|
|
signal_id=int(signal_id),
|
|
capture_status=capture_status,
|
|
)
|
|
return self._build_item_result(
|
|
row=row,
|
|
signal_id=int(signal_id),
|
|
capture_status=capture_status,
|
|
work_item_id=None,
|
|
route_status="",
|
|
)
|
|
|
|
async def repair_registries(
|
|
self,
|
|
*,
|
|
tenant_id: int,
|
|
project_id: int,
|
|
registry_ids: list[int],
|
|
sender: str,
|
|
) -> list[dict[str, object]]:
|
|
results: list[dict[str, object]] = []
|
|
try:
|
|
for registry_id in registry_ids:
|
|
item = await self._repair_single_registry(
|
|
tenant_id=tenant_id,
|
|
project_id=project_id,
|
|
registry_id=int(registry_id),
|
|
sender=sender,
|
|
)
|
|
results.append(item)
|
|
await self.db.commit()
|
|
except Exception:
|
|
await self.db.rollback()
|
|
raise
|
|
return results
|