diff --git a/nocodb/exceptions.py b/nocodb/exceptions.py new file mode 100644 index 0000000..3e317c1 --- /dev/null +++ b/nocodb/exceptions.py @@ -0,0 +1,6 @@ +class NocoDBAPIError(Exception): + def __init__(self, message, status_code, response_json=None, response_text=None): + super().__init__(message) + self.status_code = status_code + self.response_json = response_json + self.response_text = response_text \ No newline at end of file diff --git a/nocodb/infra/requests_client.py b/nocodb/infra/requests_client.py index fd223ed..96a7e48 100644 --- a/nocodb/infra/requests_client.py +++ b/nocodb/infra/requests_client.py @@ -7,6 +7,7 @@ ) from ..api import NocoDBAPI from ..utils import get_query_params +from ..exceptions import NocoDBAPIError import requests @@ -20,6 +21,25 @@ def __init__(self, auth_token: AuthToken, base_uri: str): self.__session.headers.update({"Content-Type": "application/json"}) self.__api_info = NocoDBAPI(base_uri) + def _request(self, method, url, *args, **kwargs): + response = self.__session.request(method, url, *args, **kwargs) + try: + response.raise_for_status() + except requests.exceptions.HTTPError as http_error: + response_json = None + try: + response_json = response.json() + except requests.exceptions.JSONDecodeError: + ... + raise NocoDBAPIError( + message=str(http_error), + status_code=http_error.response.status_code, + response_json=response_json, + response_text=response.text + ) + + return response + def table_row_list( self, project: NocoDBProject, @@ -27,39 +47,35 @@ def table_row_list( filter_obj: Optional[WhereFilter] = None, params: Optional[dict] = None, ) -> dict: - - response = self.__session.get( + return self._request( + "GET", self.__api_info.get_table_uri(project, table), params=get_query_params(filter_obj, params), - ) - return response.json() + ).json() - def table_row_create( - self, project: NocoDBProject, table: str, body: dict - ) -> dict: - return self.__session.post( - self.__api_info.get_table_uri(project, table), json=body + def table_row_create(self, project: NocoDBProject, table: str, body: dict) -> dict: + return self._request( + "POST", self.__api_info.get_table_uri(project, table), json=body ).json() - def table_row_detail( - self, project: NocoDBProject, table: str, row_id: int - ) -> dict: - return self.__session.get( + def table_row_detail(self, project: NocoDBProject, table: str, row_id: int) -> dict: + return self._request( + "GET", self.__api_info.get_row_detail_uri(project, table, row_id), ).json() def table_row_update( self, project: NocoDBProject, table: str, row_id: int, body: dict ) -> dict: - return self.__session.patch( + return self._request( + "PATCH", self.__api_info.get_row_detail_uri(project, table, row_id), json=body, ).json() - def table_row_delete( - self, project: NocoDBProject, table: str, row_id: int - ) -> int: - return self.__session.delete( + def table_row_delete(self, project: NocoDBProject, table: str, row_id: int) -> int: + return self._request( + "DELETE", self.__api_info.get_row_detail_uri(project, table, row_id), ).json() @@ -71,16 +87,14 @@ def table_row_nested_relations_list( row_id: int, column_name: str, ) -> dict: - return self.__session.get( + return self._request( + "GET", self.__api_info.get_nested_relations_rows_list_uri( project, table, relation_type, row_id, column_name - ) + ), ).json() - def project_create( - self, - body - ): - return self.__session.post( - self.__api_info.get_project_uri(), json=body + def project_create(self, body): + return self._request( + "POST", self.__api_info.get_project_uri(), json=body ).json()