"""GraphQL connector.""" from contextlib import asynccontextmanager from typing import Any, AsyncGenerator from gql import Client, gql as gql_query from gql.transport.aiohttp import AIOHTTPTransport from gql.transport.exceptions import TransportError from owsclient import AsyncM2MTokenManager import delivery_metadata.config as config class TransportTimeoutError(TransportError): pass class GraphQlConnector: def __init__(self) -> None: self._token_manager = AsyncM2MTokenManager( secrets_manager=config.secrets_manager_client, environment=config.TOKEN_MANAGER_ENVIRONMENT, service_name=config.SERVICE_NAME, ) @asynccontextmanager async def _create_session(self) -> AsyncGenerator[Client, None]: token = await self._token_manager.get_token_string() auth_headers = { "apollographql-client-name": config.SERVICE_NAME, "apollographql-client-version": config.SERVICE_VERSION, "Content-Type": "application/json", "Authorization": f"Bearer {token}", "Orchard-User-Id": "oa:179", } env = ( config.QA_ENVIRONMENT if config.ENVIRONMENT == config.DEV_ENVIRONMENT else config.ENVIRONMENT ) url = f"https://{env}-graphql-router.theorchard.io/graphql" transport = AIOHTTPTransport( url=url, headers=auth_headers, ssl=True, ) try: yield Client(transport=transport) finally: await transport.close() async def make_request( self, query: str, params: dict[str, Any] | None = None ) -> dict[str, Any]: try: async with self._create_session() as session: query_document_node = gql_query(query) return await session.execute_async( query_document_node, variable_values=params ) except TimeoutError as exc: raise TransportTimeoutError() from exc