/ fastapi-template / api / services / internal.py
internal.py
 1  from datetime import timedelta
 2  from enum import Enum
 3  
 4  from httpx import AsyncClient, Response
 5  
 6  from api.logger import get_logger
 7  from api.settings import settings
 8  from api.utils.jwt import encode_jwt
 9  
10  
11  logger = get_logger(__name__)
12  
13  
14  class InternalServiceError(Exception):
15      pass
16  
17  
18  class InternalService(Enum):
19      # SERVICE_XYZ = settings.service_xyz_url
20  
21      def _get_token(self) -> str:
22          return encode_jwt({"aud": self.name.lower()}, timedelta(seconds=settings.internal_jwt_ttl))
23  
24      @classmethod
25      async def _handle_error(cls, response: Response) -> None:
26          if response.status_code in [401, 403] or response.status_code in range(500, 600):
27              await response.aread()
28              raise InternalServiceError(response, response.text)
29  
30      @property
31      def client(self) -> AsyncClient:
32          return AsyncClient(
33              base_url=self.value.rstrip("/") + "/_internal",
34              headers={"Authorization": self._get_token()},
35              event_hooks={"response": [self._handle_error]},
36          )