|
1 | 1 | import contextlib |
2 | 2 | import logging |
| 3 | +from contextlib import contextmanager |
3 | 4 | from dataclasses import dataclass |
4 | 5 |
|
5 | | -from aiohttp import BasicAuth, ClientSession, web |
| 6 | +from aiohttp import BasicAuth, ClientResponseError, ClientSession, web |
6 | 7 | from aiohttp.client_exceptions import ClientError |
7 | 8 | from models_library.api_schemas_invitations.invitations import ( |
8 | 9 | ApiInvitationContent, |
|
11 | 12 | ) |
12 | 13 | from models_library.utils.fastapi_encoders import jsonable_encoder |
13 | 14 | from pydantic import AnyHttpUrl |
| 15 | +from servicelib.aiohttp import status |
14 | 16 | from yarl import URL |
15 | 17 |
|
16 | 18 | from .._constants import APP_SETTINGS_KEY |
| 19 | +from ._client import InvitationsServiceApi |
| 20 | +from .errors import ( |
| 21 | + InvalidInvitationError, |
| 22 | + InvitationsError, |
| 23 | + InvitationsServiceUnavailableError, |
| 24 | +) |
17 | 25 | from .settings import InvitationsSettings |
18 | 26 |
|
19 | 27 | _logger = logging.getLogger(__name__) |
20 | 28 |
|
21 | 29 |
|
22 | | -# |
23 | | -# CLIENT |
24 | | -# |
| 30 | +@contextmanager |
| 31 | +def _handle_exceptions_as_invitations_errors(): |
| 32 | + try: |
| 33 | + yield # API function calls happen |
| 34 | + |
| 35 | + except ClientResponseError as err: |
| 36 | + # check possible errors |
| 37 | + if err.status == status.HTTP_422_UNPROCESSABLE_ENTITY: |
| 38 | + raise InvalidInvitationError( |
| 39 | + invitations_api_response={ |
| 40 | + "err": err, |
| 41 | + "status": err.status, |
| 42 | + "message": err.message, |
| 43 | + "url": err.request_info.real_url, |
| 44 | + }, |
| 45 | + ) from err |
| 46 | + |
| 47 | + assert err.status >= status.HTTP_400_BAD_REQUEST # nosec |
| 48 | + |
| 49 | + # any other error status code |
| 50 | + raise InvitationsServiceUnavailableError( |
| 51 | + client_response_error=err, |
| 52 | + ) from err |
| 53 | + |
| 54 | + except InvitationsError: |
| 55 | + # bypass: prevents that the Exceptions handler catches this exception |
| 56 | + raise |
| 57 | + |
| 58 | + except Exception as err: |
| 59 | + raise InvitationsServiceUnavailableError( |
| 60 | + unexpected_error=err, |
| 61 | + ) from err |
25 | 62 |
|
26 | 63 |
|
27 | 64 | @dataclass(frozen=True) |
|
0 commit comments