"""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