33import calendar
44import datetime
55from enum import IntEnum
6- from typing import Dict , List , Optional , Type , TypeVar , Union
6+ from typing import Any , Dict , List , Optional , Type , TypeVar , Union
77from attr import define
8- import cattrs
98import requests
109
1110import jwt
1211from cryptography .hazmat .backends import default_backend
1312from cryptography .hazmat .primitives import serialization
13+
14+ from appstoreserverlibrary .models .LibraryUtility import _get_cattrs_converter
1415from .models .CheckTestNotificationResponse import CheckTestNotificationResponse
1516from .models .ConsumptionRequest import ConsumptionRequest
1617
@@ -94,11 +95,18 @@ class APIError(IntEnum):
9495@define
9596class APIException (Exception ):
9697 http_status_code : int
97- api_error : APIError
98+ api_error : Optional [APIError ]
99+ raw_api_error : Optional [int ]
98100
99- def __init__ (self , http_status_code : int , api_error : APIError = None ):
101+ def __init__ (self , http_status_code : int , raw_api_error : Optional [ int ] = None ):
100102 self .http_status_code = http_status_code
101- self .api_error = api_error
103+ self .raw_api_error = raw_api_error
104+ self .api_error = None
105+ try :
106+ if raw_api_error is not None :
107+ self .api_error = APIError (raw_api_error )
108+ except ValueError :
109+ pass
102110
103111class AppStoreServerAPIClient :
104112 def __init__ (self , signing_key : bytes , key_id : str , issuer_id : str , bundle_id : str , environment : Environment ):
@@ -127,32 +135,35 @@ def _generate_token(self) -> str:
127135
128136 def _make_request (self , path : str , method : str , queryParameters : Dict [str , Union [str , List [str ]]], body , destination_class : Type [T ]) -> T :
129137 url = self ._base_url + path
130- json = cattrs .unstructure (body ) if body != None else None
138+ c = _get_cattrs_converter (type (body )) if body != None else None
139+ json = c .unstructure (body ) if body != None else None
131140 headers = {
132141 'User-Agent' : "app-store-server-library/python/0.1" ,
133142 'Authorization' : 'Bearer ' + self ._generate_token (),
134143 'Accept' : 'application/json'
135144 }
136145
137- response = requests . request (method , url , params = queryParameters , headers = headers , json = json )
146+ response = self . _execute_request (method , url , queryParameters , headers , json )
138147 if response .status_code >= 200 and response .status_code < 300 :
139148 if destination_class == None :
140149 return
150+ c = _get_cattrs_converter (destination_class )
141151 response_body = response .json ()
142- return cattrs .structure (response_body , destination_class )
152+ return c .structure (response_body , destination_class )
143153 else :
144154 # Best effort parsing of the response body
145155 if not 'content-type' in response .headers or response .headers ['content-type' ] != 'application/json' :
146156 raise APIException (response .status_code )
147157 try :
148158 response_body = response .json ()
149- errorValue = APIError (response_body ['errorCode' ])
150- raise APIException (response .status_code , errorValue )
159+ raise APIException (response .status_code , response_body ['errorCode' ])
151160 except APIException as e :
152161 raise e
153162 except Exception :
154163 raise APIException (response .status_code )
155164
165+ def _execute_request (self , method : str , url : str , params : Dict [str , Union [str , List [str ]]], headers : Dict [str , str ], json : Dict [str , Any ]) -> requests .Response :
166+ return requests .request (method , url , params = params , headers = headers , json = json )
156167
157168 def extend_renewal_date_for_all_active_subscribers (self , mass_extend_renewal_date_request : MassExtendRenewalDateRequest ) -> MassExtendRenewalDateResponse :
158169 """
@@ -163,7 +174,7 @@ def extend_renewal_date_for_all_active_subscribers(self, mass_extend_renewal_dat
163174 :return: A response that indicates the server successfully received the subscription-renewal-date extension request.
164175 :throws APIException: If a response was returned indicating the request could not be processed
165176 """
166- return self ._make_request ("/inApps/v1/subscriptions/extend/mass/ " , "POST" , {}, mass_extend_renewal_date_request , MassExtendRenewalDateResponse )
177+ return self ._make_request ("/inApps/v1/subscriptions/extend/mass" , "POST" , {}, mass_extend_renewal_date_request , MassExtendRenewalDateResponse )
167178
168179 def extend_subscription_renewal_date (self , original_transaction_id : str , extend_renewal_date_request : ExtendRenewalDateRequest ) -> ExtendRenewalDateResponse :
169180 """
0 commit comments