feat: ConnectWise PSA Integration — Slice 1 (Foundation) #106

Merged
chihlasm merged 29 commits from feat/connectwise-psa-integration into main 2026-03-15 05:45:36 +00:00
Showing only changes of commit 540208a923 - Show all commits

View File

@@ -231,7 +231,33 @@ class ConnectWiseProvider(PSAProvider):
return self._map_ticket(data)
async def list_members(self) -> list[PSAMember]:
raise NotImplementedError("Implemented in Slice 5")
"""List CW system members (cached 15 minutes)."""
cache_key = "members:all"
cached = psa_cache.get(cache_key)
if cached is not None:
return cached
data = await self.client.get_paginated(
"/system/members",
params={
"fields": "id,identifier,firstName,lastName,officeEmail",
"conditions": "inactiveFlag = false",
"pageSize": 1000,
},
)
result = [
PSAMember(
id=str(m["id"]),
identifier=m.get("identifier", ""),
name=f"{m.get('firstName', '')} {m.get('lastName', '')}".strip(),
email=m.get("officeEmail"),
)
for m in data
]
psa_cache.set(cache_key, result, ttl_seconds=900)
return result
# ── Private helpers ───────────────────────────────────────────────