[2ff88f42] Finalize Pains & Gains Phase 2 + Matrix Engine v3.2 (Ops Secondary Logic)
This commit is contained in:
@@ -66,43 +66,52 @@ class SuperOfficeClient:
|
||||
logger.error(f"❌ Connection Error during token refresh: {e}")
|
||||
return None
|
||||
|
||||
def _get(self, endpoint):
|
||||
"""Generic GET request."""
|
||||
if not self.access_token: return None
|
||||
def _request_with_retry(self, method, endpoint, payload=None, retry=True):
|
||||
"""Helper to handle 401 Unauthorized with auto-refresh."""
|
||||
if not self.access_token:
|
||||
if not self._refresh_access_token():
|
||||
return None
|
||||
|
||||
url = f"{self.base_url}/{endpoint}"
|
||||
try:
|
||||
resp = requests.get(f"{self.base_url}/{endpoint}", headers=self.headers)
|
||||
resp.raise_for_status()
|
||||
return resp.json()
|
||||
except requests.exceptions.HTTPError as e:
|
||||
logger.error(f"❌ API GET Error for {endpoint} (Status: {e.response.status_code}): {e.response.text}")
|
||||
logger.debug(f"Response Headers: {e.response.headers}")
|
||||
return None
|
||||
if method == "GET":
|
||||
resp = requests.get(url, headers=self.headers)
|
||||
elif method == "POST":
|
||||
resp = requests.post(url, headers=self.headers, json=payload)
|
||||
elif method == "PUT":
|
||||
resp = requests.put(url, headers=self.headers, json=payload)
|
||||
|
||||
# 401 Handling
|
||||
if resp.status_code == 401 and retry:
|
||||
logger.warning(f"⚠️ 401 Unauthorized for {endpoint}. Attempting Token Refresh...")
|
||||
new_token = self._refresh_access_token()
|
||||
if new_token:
|
||||
self.access_token = new_token
|
||||
self.headers["Authorization"] = f"Bearer {self.access_token}"
|
||||
return self._request_with_retry(method, endpoint, payload, retry=False)
|
||||
else:
|
||||
logger.error("❌ Token Refresh failed during retry.")
|
||||
return None
|
||||
|
||||
def _put(self, endpoint, payload):
|
||||
"""Generic PUT request."""
|
||||
if not self.access_token: return None
|
||||
try:
|
||||
resp = requests.put(f"{self.base_url}/{endpoint}", headers=self.headers, json=payload)
|
||||
resp.raise_for_status()
|
||||
return resp.json()
|
||||
except requests.exceptions.HTTPError as e:
|
||||
logger.error(f"❌ API PUT Error for {endpoint}: {e.response.text}")
|
||||
return None
|
||||
|
||||
def _post(self, endpoint, payload):
|
||||
"""Generic POST request."""
|
||||
if not self.access_token: return None
|
||||
try:
|
||||
resp = requests.post(f"{self.base_url}/{endpoint}", headers=self.headers, json=payload)
|
||||
resp.raise_for_status()
|
||||
return resp.json()
|
||||
except requests.exceptions.HTTPError as e:
|
||||
logger.error(f"❌ API POST Error for {endpoint} (Status: {e.response.status_code}): {e.response.text}")
|
||||
logger.error(f"❌ API {method} Error for {endpoint} (Status: {e.response.status_code}): {e.response.text}")
|
||||
return None
|
||||
except Exception as e:
|
||||
logger.error(f"❌ Connection Error during POST for {endpoint}: {e}")
|
||||
logger.error(f"❌ Connection Error during {method} for {endpoint}: {e}")
|
||||
return None
|
||||
|
||||
def _get(self, endpoint):
|
||||
return self._request_with_retry("GET", endpoint)
|
||||
|
||||
def _put(self, endpoint, payload):
|
||||
return self._request_with_retry("PUT", endpoint, payload)
|
||||
|
||||
def _post(self, endpoint, payload):
|
||||
return self._request_with_retry("POST", endpoint, payload)
|
||||
|
||||
# --- Convenience Wrappers ---
|
||||
|
||||
def get_person(self, person_id):
|
||||
|
||||
Reference in New Issue
Block a user