PMFlow/backend/app/services/signal/signal_source_repair/mixin_repair.py

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