|
| 1 | +# |
| 2 | +# Copyright (c) 2024 Airbyte, Inc., all rights reserved. |
| 3 | +# |
| 4 | + |
| 5 | +import logging |
| 6 | +from typing import Optional, Union |
| 7 | + |
| 8 | +import requests |
| 9 | +from airbyte_cdk.models import FailureType |
| 10 | +from airbyte_cdk.sources.streams.http import HttpStream |
| 11 | +from airbyte_cdk.sources.streams.http.error_handlers import HttpStatusErrorHandler |
| 12 | +from airbyte_cdk.sources.streams.http.error_handlers.response_models import ErrorResolution, ResponseAction |
| 13 | + |
| 14 | +STRIPE_ERROR_CODES = { |
| 15 | + "more_permissions_required": "This is most likely due to insufficient permissions on the credentials in use. " |
| 16 | + "Try to grant required permissions/scopes or re-authenticate", |
| 17 | + "account_invalid": "The card, or account the card is connected to, is invalid. You need to contact your card issuer " |
| 18 | + "to check that the card is working correctly.", |
| 19 | + "oauth_not_supported": "Please use a different authentication method.", |
| 20 | +} |
| 21 | + |
| 22 | +DOCS_URL = f"https://docs.airbyte.com/integrations/sources/stripe" |
| 23 | +DOCUMENTATION_MESSAGE = f"Please visit {DOCS_URL} to learn more. " |
| 24 | + |
| 25 | + |
| 26 | +class StripeErrorHandler(HttpStatusErrorHandler): |
| 27 | + def interpret_response(self, response_or_exception: Optional[Union[requests.Response, Exception]] = None) -> ErrorResolution: |
| 28 | + if not isinstance(response_or_exception, Exception) and response_or_exception.status_code in ( |
| 29 | + requests.codes.bad_request, |
| 30 | + requests.codes.forbidden, |
| 31 | + ): |
| 32 | + parsed_error = response_or_exception.json() |
| 33 | + error_code = parsed_error.get("error", {}).get("code") |
| 34 | + error_message = STRIPE_ERROR_CODES.get(error_code, parsed_error.get("error", {}).get("message")) |
| 35 | + if error_message: |
| 36 | + reason = f"The endpoint {response_or_exception.url} returned {response_or_exception.status_code}: {response_or_exception.reason}. {error_message}. {DOCUMENTATION_MESSAGE} " |
| 37 | + response_error_message = HttpStream.parse_response_error_message(response_or_exception) |
| 38 | + if response_error_message: |
| 39 | + reason += response_error_message |
| 40 | + |
| 41 | + return ErrorResolution(response_action=ResponseAction.IGNORE, error_message=reason) |
| 42 | + return super().interpret_response(response_or_exception) |
0 commit comments