Source code for psnawp_api.utils.request_builder

import json
from typing import Any

import requests

from psnawp_api.core.authenticator import Authenticator
from psnawp_api.core.psnawp_exceptions import (
    PSNAWPNotFound,
    PSNAWPForbidden,
    PSNAWPBadRequest,
    PSNAWPNotAllowed,
    PSNAWPServerError,
    PSNAWPUnauthorized,
)


[docs]def response_checker(response: requests.Response) -> None: """Checks the HTTP(S) response and re-raises them as PSNAWP Exceptions :param response: :class:`Response <Response>` object :type response: requests.Response :returns: None """ if response.status_code == 400: raise PSNAWPBadRequest(response.text) elif response.status_code == 401: raise PSNAWPUnauthorized(response.text) elif response.status_code == 403: raise PSNAWPForbidden(response.text) elif response.status_code == 404: raise PSNAWPNotFound(response.text) elif response.status_code == 405: raise PSNAWPNotAllowed(response.text) elif response.status_code >= 500: raise PSNAWPServerError(response.text) else: response.raise_for_status()
[docs]class RequestBuilder: """Handles all the HTTP Requests and provides a gateway to interacting with PSN API."""
[docs] def __init__(self, authenticator: Authenticator): """Initialized Request Handler and saves the instance of authenticator for future use. :param authenticator: The instance of :class: `Authenticator`. Represents single authentication to PSN API. """ self.authenticator = authenticator self.default_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", "Content-Type": "application/json", "Accept-Language": "en-US", "Country": "US", }
[docs] def get(self, **kwargs: Any) -> requests.Response: """Handles the GET requests and returns the requests.Response object. :param kwargs: The query parameters to add to the request. :returns: The Request Response Object. :rtype: requests.Response """ access_token = self.authenticator.obtain_fresh_access_token() headers = {**self.default_headers, "Authorization": f"Bearer {access_token}"} if "headers" in kwargs.keys(): headers = {**headers, **kwargs["headers"]} params = kwargs.get("params") data = kwargs.get("data") response = requests.get(url=kwargs["url"], headers=headers, params=params, data=data) response_checker(response) return response
[docs] def patch(self, **kwargs: Any) -> requests.Response: """Handles the POST requests and returns the requests.Response object. :param kwargs: The query parameters to add to the request. :returns: The Request Response Object. :rtype: requests.Response """ access_token = self.authenticator.obtain_fresh_access_token() headers = {**self.default_headers, "Authorization": f"Bearer {access_token}"} if "headers" in kwargs.keys(): headers = {**headers, **kwargs["headers"]} params = kwargs.get("params") data = kwargs.get("data") response = requests.patch(url=kwargs["url"], headers=headers, data=data, params=params) response_checker(response) return response
[docs] def post(self, **kwargs: Any) -> requests.Response: """Handles the POST requests and returns the requests.Response object. :param kwargs: The query parameters to add to the request. :returns: The Request Response Object. :rtype: requests.Response """ access_token = self.authenticator.obtain_fresh_access_token() headers = {**self.default_headers, "Authorization": f"Bearer {access_token}"} if "headers" in kwargs.keys(): headers = {**headers, **kwargs["headers"]} params = kwargs.get("params") data = kwargs.get("data") response = requests.post(url=kwargs["url"], headers=headers, data=data, params=params) response_checker(response) return response
[docs] def multipart_post(self, **kwargs: Any) -> requests.Response: """Handles the Multipart POST requests and returns the requests.Response object. :param kwargs: The query parameters to add to the request. :returns: The Request Response Object. :rtype: requests.Response """ access_token = self.authenticator.obtain_fresh_access_token() headers = {**self.default_headers, "Authorization": f"Bearer {access_token}"} if "headers" in kwargs.keys(): headers = {**headers, **kwargs["headers"]} data = kwargs.get("data") response = requests.post( url=kwargs["url"], headers=headers, files={ kwargs["name"]: ( None, json.dumps(data), "application/json; charset=utf-8", ) }, ) response_checker(response) return response
[docs] def delete(self, **kwargs: Any) -> requests.Response: """Handles the DELETE requests and returns the requests.Response object. :param kwargs: The query parameters to add to the request. :returns: The Request Response Object. :rtype: requests.Response """ access_token = self.authenticator.obtain_fresh_access_token() headers = {**self.default_headers, "Authorization": f"Bearer {access_token}"} if "headers" in kwargs.keys(): headers = {**headers, **kwargs["headers"]} params = kwargs.get("params") data = kwargs.get("data") response = requests.delete(url=kwargs["url"], headers=headers, params=params, data=data) response_checker(response) return response