From 540208a923d93f23d69f57f8c51a6b0ac60d71cc Mon Sep 17 00:00:00 2001 From: Michael Chihlas Date: Sat, 14 Mar 2026 23:45:14 -0400 Subject: [PATCH] feat(psa): implement list_members in ConnectWise provider with cache Co-Authored-By: Claude Opus 4.6 (1M context) --- .../app/services/psa/connectwise/provider.py | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/backend/app/services/psa/connectwise/provider.py b/backend/app/services/psa/connectwise/provider.py index cce2bacf..3159e9ba 100644 --- a/backend/app/services/psa/connectwise/provider.py +++ b/backend/app/services/psa/connectwise/provider.py @@ -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 ───────────────────────────────────────────────