from typing import Type, TypeVar from server.client.clients.apollo_api import ApolloApiClient, ApolloApiConfig from server.client.clients.dsp_api import DspApiClient, DspApiConfig from server.client.clients.elastic_search import ElasticSearchClient, ElasticSearchConfig from server.client.clients.filtr_api import FiltrApiClient, FiltrApiConfig from server.client.clients.user_data_api import UserDataApiClient, UserDataApiConfig from server.client.clients.vendor_api import VendorApiClient, VendorApiConfig from server.client.session import get_session T = TypeVar("T") class ClientFactory: """External API clients factory.""" def _get_client(self, client_cls: Type[T], config_cls: Type) -> T: """Get client or create new if does not exist.""" client_prop_name = f"_{client_cls.__name__.lower()}_client" instance = getattr(self, client_prop_name, None) if not instance: instance = client_cls(get_session(), config_cls()) setattr(self, client_prop_name, instance) return instance @property def apollo(self): return self._get_client(ApolloApiClient, ApolloApiConfig) @property def dsp(self): return self._get_client(DspApiClient, DspApiConfig) @property def filtr(self): return self._get_client(FiltrApiClient, FiltrApiConfig) @property def user_data(self): return self._get_client(UserDataApiClient, UserDataApiConfig) @property def vendor(self): return self._get_client(VendorApiClient, VendorApiConfig) @property def elasticsearch(self): return self._get_client(ElasticSearchClient, ElasticSearchConfig)