# -*- coding: utf-8 -*- from functools import wraps from typing import Dict, Optional from fastapi import HTTPException from httpx import AsyncClient, URL from loguru import logger def api_exception(func): @wraps(func) async def wrapper(*args, **kwargs): try: r = await func(*args, **kwargs) except Exception: raise HTTPException( status_code=500, detail='The server did not receive a correct response from the upstream server.' ) else: return r return wrapper class Service: def __init__(self, client: AsyncClient) -> None: self._client = client @api_exception async def _get(self, url: URL, params: Optional[Dict] = None, headers: Optional[Dict] = None) -> Dict: raw_response = await self._client.get(url, params=params, headers=headers) # logger.debug(f'{url} - elapsed: {raw_response.elapsed.total_seconds()}') return raw_response.json() @api_exception async def _post( self, url: URL, params: Optional[Dict] = None, payload: Optional[Dict] = None, headers: Optional[Dict] = None ) -> Dict: raw_response = await self._client.post(url, params=params, json=payload, headers=headers) # logger.debug(f'{url} - elapsed: {raw_response.elapsed.total_seconds()}') return raw_response.json()