mirror of https://github.com/kortix-ai/suna.git
113 lines
4.1 KiB
Python
113 lines
4.1 KiB
Python
|
from typing import List, Dict, Any, Optional
|
||
|
from pydantic import BaseModel
|
||
|
from utils.logger import logger
|
||
|
from .client import ComposioClient
|
||
|
|
||
|
|
||
|
class ConnectionState(BaseModel):
|
||
|
auth_scheme: str
|
||
|
val: Dict[str, Any]
|
||
|
|
||
|
|
||
|
class ConnectedAccount(BaseModel):
|
||
|
id: str
|
||
|
status: str
|
||
|
redirect_url: Optional[str] = None
|
||
|
redirect_uri: Optional[str] = None
|
||
|
connection_data: ConnectionState
|
||
|
auth_config_id: str
|
||
|
user_id: str
|
||
|
deprecated: Optional[Dict[str, str]] = None
|
||
|
|
||
|
|
||
|
class ConnectedAccountService:
|
||
|
def __init__(self, api_key: Optional[str] = None):
|
||
|
self.client = ComposioClient.get_client(api_key)
|
||
|
|
||
|
async def create_connected_account(
|
||
|
self,
|
||
|
auth_config_id: str,
|
||
|
user_id: str = "default"
|
||
|
) -> ConnectedAccount:
|
||
|
try:
|
||
|
logger.info(f"Creating connected account for auth_config: {auth_config_id}, user: {user_id}")
|
||
|
|
||
|
response = self.client.connected_accounts.create(
|
||
|
auth_config={"id": auth_config_id},
|
||
|
connection={
|
||
|
"user_id": user_id,
|
||
|
"state": {
|
||
|
"authScheme": "OAUTH2",
|
||
|
"val": {
|
||
|
"status": "INITIALIZING"
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
)
|
||
|
|
||
|
connection_data = ConnectionState(
|
||
|
auth_scheme=response.get("connectionData", {}).get("authScheme", "OAUTH2"),
|
||
|
val=response.get("connectionData", {}).get("val", {})
|
||
|
)
|
||
|
|
||
|
connected_account = ConnectedAccount(
|
||
|
id=response.get("id"),
|
||
|
status=response.get("status"),
|
||
|
redirect_url=response.get("redirect_url"),
|
||
|
redirect_uri=response.get("redirect_uri"),
|
||
|
connection_data=connection_data,
|
||
|
auth_config_id=auth_config_id,
|
||
|
user_id=user_id,
|
||
|
deprecated=response.get("deprecated")
|
||
|
)
|
||
|
|
||
|
logger.info(f"Successfully created connected account: {connected_account.id}")
|
||
|
return connected_account
|
||
|
|
||
|
except Exception as e:
|
||
|
logger.error(f"Failed to create connected account: {e}", exc_info=True)
|
||
|
raise
|
||
|
|
||
|
async def get_connected_account(self, account_id: str) -> Optional[ConnectedAccount]:
|
||
|
try:
|
||
|
logger.info(f"Fetching connected account: {account_id}")
|
||
|
|
||
|
logger.warning(f"Get connected account not implemented in SDK for ID: {account_id}")
|
||
|
return None
|
||
|
|
||
|
except Exception as e:
|
||
|
logger.error(f"Failed to get connected account {account_id}: {e}", exc_info=True)
|
||
|
raise
|
||
|
|
||
|
async def list_connected_accounts(self, user_id: Optional[str] = None) -> List[ConnectedAccount]:
|
||
|
try:
|
||
|
logger.info(f"Listing connected accounts for user: {user_id}")
|
||
|
|
||
|
logger.warning("List connected accounts not implemented in SDK")
|
||
|
return []
|
||
|
|
||
|
except Exception as e:
|
||
|
logger.error(f"Failed to list connected accounts: {e}", exc_info=True)
|
||
|
raise
|
||
|
|
||
|
async def delete_connected_account(self, account_id: str) -> bool:
|
||
|
try:
|
||
|
logger.info(f"Deleting connected account: {account_id}")
|
||
|
|
||
|
logger.warning(f"Delete connected account not implemented in SDK for ID: {account_id}")
|
||
|
return False
|
||
|
|
||
|
except Exception as e:
|
||
|
logger.error(f"Failed to delete connected account {account_id}: {e}", exc_info=True)
|
||
|
raise
|
||
|
|
||
|
async def get_auth_status(self, account_id: str) -> Dict[str, Any]:
|
||
|
try:
|
||
|
logger.info(f"Getting auth status for account: {account_id}")
|
||
|
|
||
|
logger.warning(f"Get auth status not implemented in SDK for ID: {account_id}")
|
||
|
return {"status": "unknown"}
|
||
|
|
||
|
except Exception as e:
|
||
|
logger.error(f"Failed to get auth status for {account_id}: {e}", exc_info=True)
|
||
|
raise
|