"""This module of functions to make a POST request to API with backoff strategy.""" from typing import Callable import backoff import requests from requests.exceptions import ( ConnectionError as RequestsConnectionError, HTTPError, Timeout, ) from payee.config import Config @backoff.on_exception( backoff.expo, ( RequestsConnectionError, HTTPError, Timeout, ), max_tries=Config.MAX_BACKOFF_TRIES, factor=2, jitter=None, ) def make_request(method: Callable, *args, **kwargs) -> requests.Response: """Generic method to make HTTP requests (POST, PUT, etc.) with retry logic.""" response = method(*args, **kwargs) # Handle 5xx server errors if 500 <= response.status_code < 600: raise HTTPError(f'Server error. Status code: {response.status_code}') # noqa return response def post(*args, **kwargs) -> requests.Response: """Make a POST request to API.""" return make_request(requests.post, *args, **kwargs) def put(*args, **kwargs) -> requests.Response: """Make a PUT request to API.""" return make_request(requests.put, *args, **kwargs) def delete(*args, **kwargs) -> requests.Response: """Make a DELETE request to API.""" return make_request(requests.delete, *args, **kwargs) def get(*args, **kwargs) -> requests.Response: """Make a GET request to API.""" return make_request(requests.get, *args, **kwargs)