from typing import Any from urllib.parse import urljoin import httpx from audience_common.enums import Environment from httpx import AsyncClient from dmp_workflows.config import OWS_DMP_URL, OWS_ENV from dmp_workflows.hooks.jwt import OwsJwtHook OWS_DMP_DEFAULT_REQUEST_TIMEOUT = httpx.Timeout(10.0, read=120.0) class DmpHook: @classmethod def _prepare_url(cls, path: str) -> str: return urljoin(OWS_DMP_URL, path) @classmethod def _prepare_headers(cls) -> dict[str, str]: if OWS_ENV in {Environment.QA, Environment.PROD}: token = OwsJwtHook.get_jwt_token() else: token = "token" return {"authorization": f"Bearer {token}"} @classmethod def request(cls, method: str, path: str, **kwargs: Any) -> httpx.Response: with httpx.Client(transport=httpx.HTTPTransport(retries=5)) as client: return client.request( method=method, url=cls._prepare_url(path), headers=cls._prepare_headers(), timeout=OWS_DMP_DEFAULT_REQUEST_TIMEOUT, **kwargs, ) @classmethod async def request_async( cls, client: AsyncClient, method: str, path: str, **kwargs: Any ) -> httpx.Response: return await client.request( method=method, url=cls._prepare_url(path), headers=cls._prepare_headers(), timeout=OWS_DMP_DEFAULT_REQUEST_TIMEOUT, **kwargs, )