| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- import json
- from abc import ABC, abstractmethod
- from json import JSONDecodeError
- from typing import Any, Optional
-
- from extensions.ext_redis import redis_client
-
-
- class ProviderCredentialsCache(ABC):
- """Base class for provider credentials cache"""
-
- def __init__(self, **kwargs):
- self.cache_key = self._generate_cache_key(**kwargs)
-
- @abstractmethod
- def _generate_cache_key(self, **kwargs) -> str:
- """Generate cache key based on subclass implementation"""
- pass
-
- def get(self) -> Optional[dict]:
- """Get cached provider credentials"""
- cached_credentials = redis_client.get(self.cache_key)
- if cached_credentials:
- try:
- cached_credentials = cached_credentials.decode("utf-8")
- return dict(json.loads(cached_credentials))
- except JSONDecodeError:
- return None
- return None
-
- def set(self, config: dict[str, Any]) -> None:
- """Cache provider credentials"""
- redis_client.setex(self.cache_key, 86400, json.dumps(config))
-
- def delete(self) -> None:
- """Delete cached provider credentials"""
- redis_client.delete(self.cache_key)
-
-
- class SingletonProviderCredentialsCache(ProviderCredentialsCache):
- """Cache for tool single provider credentials"""
-
- def __init__(self, tenant_id: str, provider_type: str, provider_identity: str):
- super().__init__(
- tenant_id=tenant_id,
- provider_type=provider_type,
- provider_identity=provider_identity,
- )
-
- def _generate_cache_key(self, **kwargs) -> str:
- tenant_id = kwargs["tenant_id"]
- provider_type = kwargs["provider_type"]
- identity_name = kwargs["provider_identity"]
- identity_id = f"{provider_type}.{identity_name}"
- return f"{provider_type}_credentials:tenant_id:{tenant_id}:id:{identity_id}"
-
-
- class ToolProviderCredentialsCache(ProviderCredentialsCache):
- """Cache for tool provider credentials"""
-
- def __init__(self, tenant_id: str, provider: str, credential_id: str):
- super().__init__(tenant_id=tenant_id, provider=provider, credential_id=credential_id)
-
- def _generate_cache_key(self, **kwargs) -> str:
- tenant_id = kwargs["tenant_id"]
- provider = kwargs["provider"]
- credential_id = kwargs["credential_id"]
- return f"tool_credentials:tenant_id:{tenant_id}:provider:{provider}:credential_id:{credential_id}"
-
-
- class NoOpProviderCredentialCache:
- """No-op provider credential cache"""
-
- def get(self) -> Optional[dict]:
- """Get cached provider credentials"""
- return None
-
- def set(self, config: dict[str, Any]) -> None:
- """Cache provider credentials"""
- pass
-
- def delete(self) -> None:
- """Delete cached provider credentials"""
- pass
|