from abc import ABC import requests from pydantic import TypeAdapter from requests import Response from mdrsclient.connection import MDRSConnection from mdrsclient.exceptions import ( BadRequestException, ForbiddenException, TokenExpiredException, UnauthorizedException, UnexpectedException, ) from mdrsclient.models.error import DRFStandardizedErrors class BaseApi(ABC): connection: MDRSConnection def __init__(self, connection: MDRSConnection) -> None: self.connection = connection def _raise_response_error(self, response: Response) -> None: if response.status_code >= 300: if response.status_code < 400 or response.status_code >= 500: raise UnexpectedException(f"Unexpected status code returned: {response.status_code}.") errors = TypeAdapter(DRFStandardizedErrors).validate_python(response.json()) if response.status_code == requests.codes.bad_request: raise BadRequestException(errors.errors[0].detail) elif response.status_code == requests.codes.unauthorized: # A request can wait in the server's queue for longer than the access # token it was sent with lives, so an expired token here does not mean # the session is over - it means this one request arrived too late. if any(e.code == "token_not_valid" for e in errors.errors): raise TokenExpiredException("Access token expired before the request was served.") raise UnauthorizedException("Login required.") elif response.status_code == requests.codes.forbidden: raise ForbiddenException("You do not have enough permissions. Access is denied.") else: raise UnexpectedException(errors.errors[0].detail)