Clawith/backend/app/services/org_sync_service.py

49 lines
1.6 KiB
Python

"""Organization structure sync service (provider-based only)."""
from loguru import logger
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.identity import IdentityProvider
class OrgSyncService:
"""Sync org structure from a specific identity provider."""
async def sync_provider(self, db: AsyncSession, provider_id: str) -> dict:
import uuid as _uuid
pid = _uuid.UUID(provider_id) if isinstance(provider_id, str) else provider_id
result = await db.execute(select(IdentityProvider).where(IdentityProvider.id == pid))
provider = result.scalar_one_or_none()
if not provider:
return {"error": f"Identity provider {provider_id} not found"}
from app.services.org_sync_adapter import get_org_sync_adapter
adapter = await get_org_sync_adapter(db, provider.provider_type, provider_id=pid)
if not adapter:
return {"error": f"Provider type '{provider.provider_type}' not supported for org sync"}
# Configure adapter
adapter.provider = provider
adapter.provider_id = provider.id
adapter.config = provider.config
if not provider.tenant_id:
return {"error": "Identity provider must be bound to a tenant"}
adapter.tenant_id = provider.tenant_id
try:
sync_result = await adapter.sync_org_structure(db)
await db.commit()
return sync_result
except Exception as e:
logger.error(f"[OrgSync] Provider sync failed: {e}")
return {"error": str(e)}
org_sync_service = OrgSyncService()