import asyncio import uuid from datetime import datetime, timezone from apps.api.src.database import AsyncSessionLocal from apps.api.src.models.background_job import BackgroundJob from apps.api.src.plugins import loader from apps.api.src.services import plugin_service from apps.worker.src.celery_app import celery_app @celery_app.task(bind=True, max_retries=3) def run_plugin_sync(self, instance_id: str) -> dict: try: result = asyncio.run(_async_run_plugin_sync(instance_id)) return result except Exception as exc: raise self.retry(exc=exc, countdown=60) async def _async_run_plugin_sync(instance_id: str) -> dict: async with AsyncSessionLocal() as db: try: instance_uuid = uuid.UUID(instance_id) result = await loader.run_healthcheck(db, instance_uuid) # Update sync timestamp instance = await plugin_service.get_instance(db, instance_uuid) if instance: instance.last_sync_at = datetime.now(timezone.utc) # type: ignore await db.commit() # Record job job = BackgroundJob( task_name="plugin_sync", status="completed" if result.get("status") == "ok" else "failed", payload={"instance_id": instance_id}, result=result, plugin_id=instance.plugin_id if instance else None, instance_id=instance_uuid, scheduled_at=datetime.now(timezone.utc), # type: ignore ) db.add(job) await db.commit() return result except Exception as e: await db.rollback() raise e