[2ff88f42] Finalize Pains & Gains Phase 2 + Matrix Engine v3.2 (Ops Secondary Logic)

This commit is contained in:
2026-02-23 10:53:13 +00:00
parent 3864ddb606
commit e2c0323db2
5 changed files with 94 additions and 60 deletions

View File

@@ -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):